シーケンスの主要な要素を探しています

問題(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;
}

おすすめ

転載: www.cnblogs.com/adios/p/12609036.html