c語言分治法求眾數重數 分治法之眾數問題

2021-10-12 14:58:15 字數 2212 閱讀 8176

實驗總結

剛開始我沒有想到可以用分治法來做,用的是陣列來做。做完以後發現演算法太過複雜,而且處理較大的n時,時間複雜度和空間複雜度都比較大。於是我參考了演算法答案那本書,學到了分治法來解決這道題。但是在完成了用分治法的**以後,我發現了問題:

輸出應該為:

分治法解決這道題有乙個大前提:多重集中的元素是有序的(遞增或者遞減),所以很有必要給多重集加入乙個排序的演算法.

附錄:(要求**裡各行要有注釋)

自己的**(效能不夠好,太過複雜)

int main()

int n;

cin>>n;

int a[n];

for(int i=0;i

cin>>a[i];

f(n,a);

return 0;

void f(int n,int *a)//n為多重集元素的個數,a是存放陣列的元素

int b[n][2];//b[0]存放元素的種類,b[1]存放每種元素的個數

b[0][0]=a[0];

b[0][1]=1;

int h=0;//陣列b中已初始化的行的標號

int flag=0;//判斷b中是否已經有該元素了

for(int i=1;i

for(int j=0;j<=h;j++)

if(a[i]==b[j][0])//判斷元素a[i]是否已經在陣列b中存在

b[j][1]++;

flag=1;

}//存在的話,把b[j][1]加1,flag變為1,否則不做操作

if(flag==0)

h++;

b[h][0]=a[i];

b[h][1]=1;

flag=0;

}//不存在的話,flag為0,此時把a[i]加入到陣列之中,並把個數變為1

int temp=b[0][1];

int t=0;

for(int i=0;i<=h;i++)//尋找b中數目最多的那個元素

if(temp

temp=b[i][1];

t=i;

cout<

參照答案和csdn部落格所改的**:

int main()

int n;

cin>>n;//元素個數

int a[n];

for(int i=0;i

cin>>a[i];

}//陣列用於存放元素

int l=0;//陣列的首個標號

int r=n-1;//陣列的最後乙個標號

int largest=0;//重數的初始化

int elem=-1;//眾數的初始化

mode(a,l,r,largest,elem);//呼叫函式

cout<

return 0;

//用於求陣列的中位數的函式↓

int median(int *a,int l,int r)

return a[(l+r)/2];

//以med來劃分陣列↓ !!!關鍵函式

void split(int *a,int med,int l,int r,int &l1,int &r1)

for(l1=l;l1<=r;l1++)

if(a[l1]==med)

break;

}//l1表示首個等於med的陣列下標

for(r1=l1+1;r1<=r;r1++)

if(a[r1]!=med)

break;

r1--;

}//r1表示最後乙個等於med的陣列下標

void mode(int *a,int l,int r,int &largest,int &elem)

int l1,r1;//分割後左邊子陣列的右界和右邊子陣列的左界

int med=median(a,l,r);//midian函式用於找到陣列的中位數

split(a,med,l,r,l1,r1);//以med中位數來分割陣列

if(largest

largest=r1-l1+1;

elem=med;

}//每次遞迴更新眾數和重數的值

if(l1-l>largest)

mode(a,l,l1-1,largest,elem);//判斷左邊是否值得遞迴(只有l1-1大於largest才有必要搜尋)

if(r-r1>largest)

mode(a,r1+1,r,largest,elem);//判斷右邊是否值得遞迴

分治演算法 求眾數及其重數

問題描述 給定含有 n 個元素的多重集合 s,每個元素在 s 中出現的次數稱為該元素的重數。多重集合 s 中重數最大的素稱為眾數。例如多重集合 s 其中眾數是 2,其重數為 3。用分治法設計並實現在多重集合中找眾數及其重數的演算法,要求演算法的時間複雜性在壞情況下不超過 o nlogn 方法一 窮舉...

眾數問題(分治法解決)

給定含有n個元素的多重集合s,每個元素在s 現的次數稱為該元素的重數,多重集s中重數最大的元素稱為眾數,給定多重集合s,求s中的眾數集重數。首先,我們最容易想到的就是統計每個數的出現次數,然後比較得出結果。這個思路可以利用容器來實現。仔細思考,這道題目還可以用分治法來解決。解決步驟 給陣列排序 找出...

求逆序數(分治法求解)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...