美文网首页
分治法的常见问题

分治法的常见问题

作者: CXYMichael | 来源:发表于2018-12-31 16:30 被阅读6次

    计算x的n次幂

    朴素算法:xxx......

    分治算法:

    n为偶数:x的n/2次幂*x的n/2次幂

    n为奇数:x的(n-1)/2次幂*x的(n-1)/2次幂

    #include<bits/stdc++.h>
    using namespace std;
    //朴素算法
    int simple(int x,int n)
    {
        int num=1;
        for(int i=0;i<n;i++)
        {
            num*=x;
        }
        return num;
    }
    //分治算法----快速幂
    int devided(int x,int n)
    {
        int num=1;
        while(n)
        {
            if(n%2==1)
            {
                num*=x;
                n--;
            }
            x*=x;
            n/=2;
        }
        return num;
    }
    

    找出数组出现次数超过一半的数字

    本质上就是求中位数,比较简单的方法是全部排序,然后取中间值,或者统计所有数字及其出现频率。优化的方法就是利用快算排序中的分治思想:

    #include <stdio.h>
    
    int partion(int a[], int n)
    {
        if( a == NULL || n <= 0 )
            return -1;
    
        int i, candidate;
        int times = 0;
        for( i=0; i<n; i++ )
        {
            if( times == 0 )
            {
                candidate = a[i];
                times = 1;
            }
            else if( a[i] == candidate )
                ++times;
            else
                --times;
        }
        return candidate;
    }
    
    int main(void)
    {
        int a[] = {1,2,3,2,2,2,5,4,2};
    
        int result = partion(a, 9);
        if( result != -1 )
            printf("%d\n", result);
        else
            printf("Error.\n");
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:分治法的常见问题

          本文链接:https://www.haomeiwen.com/subject/ujqwlqtx.html