摩爾 Boyer Moore 投票法

2021-10-03 18:57:32 字數 1369 閱讀 7801

該演算法用來尋找乙個陣列**現次數超過1/k的元素,易得滿足要求的元素最多有k-1個。

摩爾投票法分為兩個階段:抵消階段和計數階段。

抵消階段:兩個不同投票進行對坑,並且同時抵消掉各一張票,如果兩個投票相同,則累加可抵消的次數;

計數階段:在抵消階段最後得到的抵消計數只要不為0,那這個候選人是有可能超過一半的票數的,為了驗證,則需要遍歷一次,統計票數,才可確定。

我們通過下面兩道題來深入理解這個演算法:

1.(尋找眾數)

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於⌊ n/2 ⌋的元素。

這道題方法很多:

1.首先我們可以在平方級的時間裡窮舉所有情況,來檢測每個數是不是眾數。不過時間複雜度為o(n2)。

2.其次我們可以對陣列排序,然後選擇中間元素,即為眾數。如果使用快速排序時間複雜度為o(nlogn)。

3.我們這裡用摩爾投票法怎麼做呢?

我們只需維護乙個計數器,如果遇到乙個我們目前的候選眾數,就將計數器加一,否則減一。只要計數器等於 0 ,我們就將 nums 中之前訪問的數字全部忘記 ,並把下乙個數字當做候選的眾數。可用你還沒理解,我們換句話講,每次從陣列中拿走2個不同的數,最後剩下的一定是眾數。這樣只需要進行一次遍歷,因此時間複雜度為o(n)。下面是c++實現:

class solution 

};

python實現:

def majorityelement(self, nums: list[int]) -> list[int]:

m = n = none

mcount = ncount = 0

for num in nums:

if num == m:

mcount += 1

elif num == n:

ncount += 1

elif not mcount:

m, mcount = num, 1

elif not ncount:

n, ncount = num, 1

else:

mcount -= 1

ncount -= 1

mcount = ncount = 0

for num in nums:

if num == m:

mcount += 1

elif num == n:

ncount += 1

n = len(nums)

return [i for i, c in zip((m, n), (mcount, ncount)) if c > n//3]

摩爾投票法

刷leetcode看到的一種解法。想法其實很簡單。上網上看了下這種解法叫摩爾投票法。其實就是找array裡的眾數,原理也很簡單,例如你要找2 n多的數你找眾數,那他個數肯定不小於2 n,然後你加加減減 最後留下那個肯定是眾數。3 n 什麼的情況也一樣,畫一畫就明白了。然後這是別人的解析 摩爾投票法 ...

摩爾投票法

該演算法用於解決尋找乙個含有 n n 個元素的數列 role presentation 中出現超過1k 1 k 即大於nk n k次 的元素 假設滿足要求的元素存在 可知,滿足要求的元素最多有 k 1 k 1 個。使用暴力解法並不難,但是摩爾投票法給出了乙個o n o n 時間複雜度的解法。當k 2...

摩爾投票法

複雜度時間 o n 空間 o 1 因為多於三分之一的數可能有2兩個,所以需要用兩個值和兩個計數器過一遍,但是最後得出來不一定是兩個數都是多於三分之一,有可能 只有乙個是多於三分之一,但不知道是哪乙個,所以要重新過一遍check一下 思路上一題中,超過一半的數隻可能有乙個,所以我們只要投票出乙個數就行...