簡單找眾數演算法詳解

2021-07-09 20:44:43 字數 1807 閱讀 4330

眾數的定義:

是一組資料中出現次數最多的

數值,叫眾數,有時眾數在一組數中有好幾個。用m表示。 理性理解:簡單的說,就是一組資料中佔比例最多的那個數。

例題:

劇中比賽全球大學生都參加了編號從-10^9到10^9,不要問我比賽場地能不能坐下,這是全球同步比賽,結果彙總在一起的。總共題目數可達10萬道。給你題目數n,和n個編號,每個編號是指這道題目第乙個做出來的參賽者編號,求出出現次數最多的編號和次數,次數相同輸出編號最小的。具體格式見樣例。

輸入包括多組測試資料

每組測試資料的第一行是乙個數字n表示題目數(0

然後是n個整數表示第一次做出題目的參賽者編號,每個編號在[-10^9,10^9]內

對於每組測試資料輸出2個數,分別表示出現最多次的數和它出現的次數。(如果有多個同樣次數的數,輸出最小的那個)

5

1 2 1 2 3

1 2
很明顯,這是一道在有限陣列裡面找眾數的習題,由於數的範圍過大,因此不能用「桶的思想」解決這道試題。 

但是我們可以想到,眾數以及這個數出現的次數是一一對應的,那麼這時候我們就可以想到用乙個結構體來儲存這個一一對應的關係,如下:

struct node

;

其中value為陣列中的某個數,而length為該數在陣列中出現的次數。

這樣的話,為了減少重複遍歷的次數,我們可以先將陣列公升序排序,然後只需遍歷一遍陣列,就可以記錄每個數字出現的次數,通過不斷變化記錄的標誌而更新結構體陣列的值。我們可以採取如下的方式:

sort(num,num+n);

ll flag = num[0],j = 0,temp = 0,max_num = num[n-1],i; //flag作為記錄的標誌

for(i = 0; i < n; i++)

}ans[j].value = num[i-1];

ans[j].length = i - temp;

這裡需要注意的乙個問題是,由於遍歷到最後乙個數無法再進行if判斷便跳出迴圈,所以我們無法記錄最後乙個數字或者說是最後出現的數字的次數,所以在迴圈體外還要記錄一下最後出現的數字的次數。然後當所有數字記錄完畢時,再將結構體陣列按照數字出現的次數降序排序即可,如果數字出現的次數相同,則將更小的那個數排在前面。因此得出完整**如下:

#include#includeusing namespace std;

typedef long long ll;

typedef struct node node;

const int maxn = 1e5;

struct node

;ll num[maxn+10];

bool cmp(node a,node b);

int main()

}ans[j].value = num[i-1];

ans[j].length = i - temp;

sort(ans,ans+j+1,cmp);

printf("%lld %d\n",ans[0].value,ans[0].length);

}return 0;

}bool cmp(node a,node b)

else

return a.length > b.length;

}

時間及記憶體花費:

time:73 ms

memory:3320 kb

如有錯誤,還請指正,o(∩_∩)o謝謝

c 找眾數及其重數

問題描述 在乙個由n個元素組成的表中,出現次數最多的元素被稱為眾數。試寫乙個尋找眾數及其重數的有效演算法,並分析其計算時間複雜性。方法 1.首先用快排把資料排個序 2.再使用find方法找出眾數及其重數 注 這裡第一步就跳過了,因為快排可以調庫函式,這裡主要是測試一下find方法的正確性。如下 in...

演算法 眾數問題

眾數問題 description 給定含有n個元素的多重集合s,每個元素在s中出現的次數稱為該元素的重數。多重 集s中重數最大的元素稱為眾數。例如,s 多重集s的眾數是2,其重數為3。程式設計任務 對於給定的由n 個自然數組成的多重集s,程式設計計算s 的眾數及其重數。input 輸入資料第1行多重...

尋找眾數演算法

尋找眾數是常見的演算法,這裡的總數是指出現次數大於一半的數。常見的解決辦法有如下幾種 1.逐個統計每個數出現的次數,時間複雜度為o n n n n 1 2 n n指數組元素的個數。2.對陣列進行排序,得出中間 n 2 元素就是眾數。證明用反證法,如果中間元素不是,則眾數出現的次數小於一半。排序可以用...