問題(408回の試験の受験2013):整数のシーケンスを考える= A(0、A 1、...、。N - 1)、ここで0≦A I ≤n(0≦I <N-)。本AならP1 = A P2 ... = A PM = Xおよびm> N- / 2(0≤p Kの ≤n、1≤k≤M)と呼ばれるxは主要な要素です。例えば、A =(0,5,5,3,5,7,5,5)、主要素5、及びもしA =(0,5、5,3 、5,1、5,7)、 主な要素ではありません。仮定n個の要素Aは、一次元配列に格納されている、Aの主な要素を識別するように設計された効率的なアルゴリズム可能に 主な要素がある場合は、出力素子:そうでない場合は-1。
回答:
- アルゴリズム設計:ゼロからアレイをスキャンは、発生する可能性のある主要な要素をマークします。最後に、マークの主な要素
num
カウントは、それが主要素か否かが判断されます。 - ステップ:
- 要素の最初の発生が
num
に保存されc
、使用のcount
レコードnum
出現回数、最初のシーズンcount = 1
。次の要素がまだ発生している場合num
だろうcount
増加1
、それ以外の場合はされますcount
減少します1
。この時点での場合count == 0
には、記憶素子c
ミドル、およびリセットcount
します0
。完全な走査素子部分までプロセスを繰り返します。 - この時点での決意は、
c
真のマスター要素です。カウントc
出現回数を、そしてそれを保存しcount
、あればcount > n / 2
、それは主要な要素であり、それ以外の場合はありません。
- 要素の最初の発生が
- アルゴリズムの正しさ:
- そのような配列は、存在する場合には任意の二つの等しくない要素、残りの要素は、一次要素を除去する、番号が依然として主要要素が発生より大きい
n / 2
。 - 用途
count
として数えたときcount == 0
の時間、主要な要素の偶数比較の素子であってもよいがなければならない主要な要素の可能な要素の偶数、他の半分の数の半分です。
- そのような配列は、存在する場合には任意の二つの等しくない要素、残りの要素は、一次要素を除去する、番号が依然として主要要素が発生より大きい
- 複雑さ:
T(n) = O(n)
、S(n) = O(1)
。
アルゴリズム:
int Majority(int A[], int n)
{
int i, c, count = 1;
c = A[0];
for (i = 1; i < n; i++)
{
if (A[i] == c)
{
count++;
}
else
{
if (count > 0)
{
count--;
}
else
{
c = A[i];
count = 1;
}
}
}
if (count > 0)
{
count = 0;
for (i = 0; i < n; i++)
{
if (A[i] == c)
{
count++;
}
}
}
if (count > n / 2) return c;
else return -1;
}