大多數演算法及其推廣

2021-06-22 02:42:03 字數 1912 閱讀 1157

有一種演算法叫大多數演算法,大多數意思是給定乙個陣列,已知裡面有乙個數的統計個數超過了總數的一半。比如1,2,3,1,1,1 ,那麼1就是大多數。有乙個簡單的演算法就是排序,然後取中位數。時間複雜度為o(nlogn)。那麼有沒有更快速的演算法呢,這裡介紹一種o(n)的演算法。其原理就是開乙個臨時變數,和引用計數,然後遍歷陣列,如果已經存在於臨時變數計數就加1,否則減1,當減到0的時候重新儲存變數,計數置為1。最後如果引用計數大於0那麼這個臨時變數就是大多數。演算法很簡單也很巧妙,實現**如下:

// 這是大多數演算法的實現,先決條件是容器裡面有乙個元素

// 超過容器個數的一半,否則返回值不准。

template typename iterator_traits::value_type

major( inputiterator first, inputiterator end )

typename iterator_traits::difference_type n = 1;

inputiterator itor = first++;

for ( ; first != end; first++ )

}return *itor;

}

那麼,引申出來,假設乙個陣列裡面有乙個數超過了總數的1/3,請找出這個數。這個演算法跟上面的大多數演算法其實是一類的。

雖說是一類,但顯然不能直接套用上面的實現。在陳利人的微博裡給出了俄羅斯方塊消除法的思路,採用消除法,如果三個數都不相同,我們就不計數,就拋棄他們,直到最後不足以組成3個不同數。剩下的最多數就是結果。比如,1,2,3,1,2,3,1,將1,2,3一組拋棄,最後剩下1,則為結果。為什麼說這種方法可行呢?我們可以先排序,這種排序是按照個數多少從前往後,上面的陣列排序之後就是1,1,1,2,2,3,3。顯然如果要完全消除1至少要6個其他數,而大於1/3保證了其他剩餘數沒有這麼多。

具體分析:假設t為大多數,個數為n,n為總數,m/n>1/3。這樣從頭到尾遍歷陣列組成不相同的乙個組合就有兩種情況,

1. t不在組合裡,m/(n-3)就是消除之後的比例,顯然m/(n-3)>m/n。

2. t在組合裡,則(m-1)/(n-3)>m/n。

所以始終能保證t在剩餘的陣列裡佔據超過1/3的量。

其實上面兩個問題是此類問題的兩個特殊化,即對於乙個陣列n,存在t,在n中的個數占有超過1/k,其中k>=2,求t。

例子1中,也是消除法,當兩個數不一致時候就消除。最後剩下的就是t。

**如下:

// 這是大多數演算法的實現,先決條件是容器裡面有乙個元素

// 超過容器個數的三分之一,否則返回值不准。

template typename iterator_traits::value_type

major_third( inputiterator first, inputiterator end )

typedef typename iterator_traits::difference_type diff_type;

diff_type n1, n2, n3;

n1 = n2 = n3 = 0;

inputiterator itor1, itor2, itor3;

itor1 = itor2 = itor3 = end;

for ( ; first != end; ++first )

else

else if ( 0 == n2 )

else if ( 0 == n3 )}}

if ( n1 >= n2 && n1 >= n3 ) return *itor1;

if ( n2 >= n1 && n2 >= n3 ) return *itor2;

if ( n3 >= n1 && n3 >= n2 ) return *itor3;

return 0;

}

大多數重構可以避免

這篇文章的內容其實是我一直想說的,郭昂寫的即全又現實。領導都怕重構的,其實也沒並要一開始就大刀闊斧的重構,一般來說可以在實現新功能時就一邊重構一邊做新的功能。慢慢的,那些舊的過時的 自然也會被淘汰的。郭昂在前後兩家公司的工作中,主持和經歷十餘次重構,涉及 和架構。在他看來,如果不做重構,任 隨意膨脹...

摩爾投票法和大多數

摩爾投票演算法 假設有這樣乙個場景 票選村長,每人可投一票,我們將候選村長從1開始編號,村民們在票上寫上候選村長的編號即可完成投票。那麼最後統計的票可形成乙個整型陣列。那麼誰是村長呢?票數過半的那個人。摩爾投票演算法可以快速的計算出乙個陣列 現次數過半的數即大多數 majority 演算法核心思想是...

寫給大多數早期創業者

最近看了一些專案,基本上看了都不敢投,自己想了想,原因就是6個字 太簡單,太複雜?簡單的其實還好,因為一般來講,都是由於是沒經驗的小伙,覺得暴富就在身邊,想個點子就是別人沒想過的,看見塊肥肉就覺得是自己的。這種基本上 就不投。怕的是複雜的,因為發現創業者智商實在是高,首先是賺錢兜的圈子大,搞乙個很複...