【演算法解題報告】求眾數

sysu-yunz發表於2014-03-25

問題分類:

1、只需要求出一列數的眾數,不考慮多個眾數的情況;
2、考慮多個眾數,只需要輸出一個;
3、如果有多個眾數,則由小到大輸出,並且輸出個數。

簡單情況

(陣列已經分類)
//忽略命名和風格,程式碼來自http://bbs.csdn.net/topics/330219507

int find_max_seq(int *a, int n)
{
int i, elem;
int count = 1, count1 = 1;
for(i = 0; i < n-1; )
{
while(a[i]==a[i+1])
{
count++;
i++;
}//統計
if(count > count1)
{
count1 = count;
elem = a[i];
}//迭代
count = 1;
i++;
}
return elem;
}

基本思路:迭代
資料:計數器、最大計數器

不用統計眾數數目的情況

/在有序陣列中查詢出現最多的元素/
int find_max_seq(int *a, int n, int *p, int *index)
{
//int i, elem;
int i;
int count = 1, count1 = 1;
int flag = 1; /陣列不存在相同的元素標誌/
*index = 0;

for(i = 0; i < n-1; ) {
while(a[i]==a[i+1]) {
count++;
i++;
flag = 0; /陣列存在相同的元素標誌/
}
if(count > count1) {
count1 = count;
//elem = a[i];
*index = 0;
p[*index] = a[i];
(*index)++;
}
else if(count == count1) {
p[*index] = a[i];
(*index)++;
}
count = 1;
i++;
}
if(flag) {
*index = 0;
for(i = 0; i < n; i++) {
p[*index] = a[i];
(*index)++;
}
}
//return elem;
return 0;
}


最複雜情況

int mynspace :: mode(int array[], int n)
{
sort(array, array + n);
int frequency[100] = {0};
for(int i = 0; i < n; i++)
frequency[array[i]]++;
int maxFrequency = maxNum(frequency, 100);
int modeCounter = 0;
for(int j = 0; j < 100; j++)
{
if(frequency[j] == maxFrequency && maxFrequency != 1 && maxFrequency != 0)
{
cout << j << ” ” << frequency[j] << endl;
modeCounter++;
}
}
return modeCounter;
}


利用的提供的額外條件 所有數字小於100
所以構造一個size為100的陣列,用來統計每個數字出現的次數;
maxFrequence是出現的最大頻率,這樣不論有多少個眾數,只要滿足條件frequensy等於maxFrequency,它就是眾數。

思路很簡單,但開銷相對較大。

by dukeyunz

相關文章