再水一波實驗。。。
一、 實驗目的
- 加深對求解一個序列中出現次數最多元素算法的理解;
- 通過本次試驗掌握將算法轉換爲上機操作;
- 加深對以空間換時間思想的理解,並利用其解決生活中的問題。
二、實驗內容
任務:求解一個序列中出現次數最多的元素問題
給定N個正整數,編寫一個程序找出序列中出現次數最多的整數。如果這樣的
數有多個,請輸出其中最小的一個。
輸入樣例: 6 (輸入整數的個數)
10 1 10 20 30 20 (輸入的n個整數)
樣例輸出: 10
三、實驗原理
首先本題就是求一個序列中出現次數最多的元素的問題,可以使用效率較高的以空間換時間的算法:
- 在輸入的同時,就進行統計每個元素出現的次數
- 更新出現的最小值及最小次數
a) 當前值出現的次數大於之前出現最多次數最小值的次數時,則更新
b) 當前值出現的次數和之前出現次數最多最小值的次數相等時,則更新爲較小值。
四、程序代碼
說明: 以空間換時間,此程序最大輸入應該在int類型數組最大允許範圍內。
時間複雜度:O(N)
代碼如下:
#include <iostream>
using namespace std;
const int N = 1e6;
int a[N], n, minValue, count, x;
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
cin >> x; a[x]++;
if(a[x] > count || a[x] == count && x < minValue ){
minValue = x;
count = a[x];
}
}
cout << minValue << endl;
return 0;
}
五、實驗結果
測試一:
測試二:
六、分析總結
- 通過本次實驗掌握了求解一個序列元素出現最多次數的問題,瞭解了一些相關算法的實現及求解原理。
- 最終發現以空間換時間的算法是有不足的,即輸入數據太大會超出數組下標範圍,發生溢出,出現不可估計的錯誤。所以也可以使用其他方法,在數據較大,時間要求低一點情況下,可以直接使用排序求解!