求解一個序列中出現次數最多的元素問題(空間換時間)

再水一波實驗。。。

一、 實驗目的

  1. 加深對求解一個序列中出現次數最多元素算法的理解;
  2. 通過本次試驗掌握將算法轉換爲上機操作;
  3. 加深對以空間換時間思想的理解,並利用其解決生活中的問題。

二、實驗內容

任務:求解一個序列中出現次數最多的元素問題

給定N個正整數,編寫一個程序找出序列中出現次數最多的整數。如果這樣的
數有多個,請輸出其中最小的一個。

輸入樣例: 6 (輸入整數的個數)
10 1 10 20 30 20 (輸入的n個整數)

樣例輸出: 10

三、實驗原理

首先本題就是求一個序列中出現次數最多的元素的問題,可以使用效率較高的以空間換時間的算法:
  1. 在輸入的同時,就進行統計每個元素出現的次數
  2. 更新出現的最小值及最小次數
    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;
}

五、實驗結果

測試一:

在這裏插入圖片描述

測試二:

在這裏插入圖片描述

六、分析總結

  1. 通過本次實驗掌握了求解一個序列元素出現最多次數的問題,瞭解了一些相關算法的實現及求解原理。
  2. 最終發現以空間換時間的算法是有不足的,即輸入數據太大會超出數組下標範圍,發生溢出,出現不可估計的錯誤。所以也可以使用其他方法,在數據較大,時間要求低一點情況下,可以直接使用排序求解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章