免責事項:この記事はCSDNブロガーであるyealxxy元の記事、BY-SAの著作権契約CC 4.0に従って、再現し、元のソースのリンクと、この文を添付してください。
このリンクします。https://blog.csdn.net/u014248127/article/details/79230221
ムーアアルゴリズムはまた、私はleetcode 169(大多数の要素)タイトルアルゴリズムを見たときに見て、投票多数決アルゴリズムと呼ばれることができます。leetcode 229(大半エレメント2)からムーア投票アルゴリズムを改善し、拡張を説明しながら、この記事では、leetcode 169(大多数の要素)からムーア投票アルゴリズム出発原則と利点を説明しています。(この記事では、すべてのコードのPythonコードです)
、マジョリティ要素タイトル説明:時間の長さnの配列が与えられると、その主要な要素を識別するために、素子がアレイ状に発生する回数、すなわち数は丸めN / 2よりも大きいです。タイトルは、いくつかの要素のアレイを含むと仮定されており、主な要素が存在しなければなりません。いくつかの一般的な方法は何ですか。
1、辞書カウント(パイソン)を横断する各要素。
DIC = {} のために X でNUMS: もし X におけるDIC: DIC [X] + = 1 さもなければ: DIC [X] = 1 のためのキー、値でdic.items(): もし値> LEN(NUMS)/ 2 : リターンキー
2、ソート:ソートし、中間体(パイソン)の半分以上の数は確かに存在します
nums.sort() 戻り NUMS [LEN(NUMS)// 2]
第二に、ムーア投票アルゴリズム:時間と空間が非常に低いモル投票アルゴリズムは、時間計算量はO(n)は、スペースの複雑さはO(1)、カバーされたアルゴリズムを選択する理由はあります。
図1に示すように、アルゴリズムの原理:要素のアレイとは異なる対を見つけるたびに、それらがダウン完全な配列を介してアレイから除去されます。この質問は、すでに数が複数の要素の半分以上を発生するので、完全な配列は、配列内の少なくとも1つの要素になります通過した後に存在しなければならないと説明しているので。
;ローカル変数配列要素(M)及びカウンタ(I)、初期化カウンタがゼロである場合に定義されたアルゴリズム
シーケンスにおけるアルゴリズム順次走査素子際の処理要素x、カウンタは次に0である場合、X Mに割り当てられ、次に、カウンタ(i)は1にセットされ、
カウンタは、その後、Mおよび配列要素xを比較する0でない場合、それらが等しい場合、カウンタが等しくない場合、カウンタはデクリメントされ、1だけインクリメントされます。
処理後、最後に格納された配列要素(M)、このシーケンスの最大要素です。
(最大の要素であるm個の記憶素子と、また第二の要素をスキャンするかどうかを判定することができることを確認していない)
2、擬似コード(パイソン):
初期化元素M = 0、=カウンタCOUNT 0; 配列内の各数値は、Xを横断する: IF I = 0: M = X と COUNT = 1。 他 IF M = X: カウント =カウント+ 1。 他: COUNT = COUNT - 1。 リターンメートル
3、ムーア大半要素投票アルゴリズム(C ++):
クラス解決{ パブリック: BOOL check_Solution(ベクトル< INT >&番号、INT X){ int型 CNT = 0、LEN = numbers.size()。 以下のために(int型私= 0 ; iがLEN <; Iは++ ){ 場合(番号[I] == x)は CNT ++ 。 } リターン(2 * CNT> LEN)?真:偽; } int型 MoreThanHalfNum_Solution(ベクトル< 整数 >数字){ 場合(numbers.size()== 0)戻り 0 ; int型 CNT = 0 、NUM; 以下のために(int型 i = 0 ; i)は(numbers.sizeを<; iは++ ){ 場合(CNT == 0 ){ NUM = 番号[I]; CNTの == 1 ; } であれば(NUM == 番号[i])と CNT ++ 。 他の CNT - 。 } もし(check_Solution(数字、NUM)) 戻りNUM; それ以外 の戻り 0 ; } }。
第三に、改善されたアルゴリズムムーア投票:
1、タイトル:LeetCode 229 [マジョリティエレメントII]
厳密アレイ内のアレイ要素の出現数の三分の一よりも大きい数のすべての主要な要素を見つけるために、整数のアレイを考えます。
アルゴリズム:各最後の出現数の3分の1以上でなければならない残り、このアイデアは、何より1 / K回現れる要素の数に拡張することができ、三つの異なる数字を削除します。
;せいぜい2、我々は最初二つの数字(NUM1、NUM2)と2つのカウンタ(カウンタ1、カウンタ2)を維持することができますN / 3以上に現れる要素ので
、配列を、配列やNUM1のnum2の中に同じ要素を、 ;カウンタは、カウンタ2プラス1に対応する
カウンタが0またはカウンタ2である場合、NUM1またはnums2に割り当てられた要素を横断する、
そうでなければカウンタ2カウンタと1だけデクリメント。
2、C ++コードです。
3、Pythonのコード:
NUM1、COUNT1 = なし、0 NUM2、COUNT2 = なし、0 のための X- で NUMS:#1 アルゴリズムコア、候補値の主な要素を特定する IF X - == NUM1: COUNT1 + = 1つ のelif X - == NUM2: COUNT2 + 1 = ELIFの COUNT1は==である:0 NUM1、COUNT1がさ = X ,. 1 ELIF COUNT2の== 0: NUM2、COUNT2 = X ,. 1 他: COUNT1である。 - = 1 COUNT2。 - = 1 COUNT1は、COUNT2 = 0,0 のための X で NUMS: #候補値を真の統計的メイン要素れる決定 IF X == :NUM1 COUNT1は + = 1。 IF X == NUM2: COUNT2。+ = 1つの RES = [] IF。は、COUNT1が> LEN(NUMS)//である3 : res.append(NUM1) IF COUNT2> lenは(NUMS)// 3 : res.append(num2の) リターン RES