首页 > 技术文章 > [算法] 利用递归中的归纳法寻找多数元素(主元素)

maocaoliu 2013-07-26 11:17 原文

问题:

有整型数组a[1...n],如果整数x在数组a中出现的次数多于半数,则x称为多数元素。

方法:

计算每一个元素出现的次数,算法复杂度O(n2)(即n的平方).

归纳法分析此问题
观察结论5.1:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。
例1:

1,2,2,3,2,2,3  显然2是多数元素
去除1,2,在2,3,2,2,3中2仍是多数元素
去除1,3,在2,3,2,2,3中2更是多数元素

例2:

1,3,2,3,2,2,3  显然没有多数元素
去除1,3,在2,3,2,2,3中2成了多数

故在观察结论“如果知道如何求解规模为n-1的问题,那么任务就化为如何把解法扩展到规模为n的问题”的支持下,能得到多数元素的候选者

算法:

1>寻找多数元素候选者的过程:
    (1)计数器count置1,另c=A[1];
    (2)从A[2]开始向后扫描,for j=2 to n
             若a[j]与c相等,则count++;
             若a[j]与c不等,则count—
             若count==0,则对A[j+1...n]寻找多数元素候选者。

2>寻找候选者算法    

Candidate(int A[],int m ,int n)  {//寻找A[m...n]中多数元素候选者
     c=A[m];
count=1; for(j=m+1;j<n&&count>0;j++) { if(A[j]==c) count++; else count--; } if(j==n) return c; else return canditate(j+1); //对A[j+1...n]寻找多数元素候选者。 }

3>判断数组有无多数元素算法

Majority(int A[],int n) {
        c = conditate(1);
        for (i=1; i<=n; i++)
        if (A[j] == c)
           count++;
        if ( count > n/2 )
           return c;
        else 
           return  0; //设数组A中元素均非0,返回0表示不存在多数元素
}    

推荐阅读