眾數問題(遞歸、分治)


所謂眾數,就是對於給定的含有N個元素的多重集合,每個元素在S中出現次數最多的成為該元素的重數,

多重集合S重的重數最大的元素成為眾數。例如:S={1,2,2,2,3,5},則多重集S的眾數是2,其重數為3。

現在你的任務是:對於給定的由m個自然數組成的多重集S,計算出S的眾數及其重數。

解題思路:

(1)快速排序

(2)求中位數

(3)計算出中位數的最左端和最右端的位置,然后分割成2段數組

(4)中位數個數與左端個數比較,中<左 即最大眾數可能存在左端,將左端再進行2段分割(遞歸)直到 中 > 左為止。 右端同理。。。

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e2+5;
int num , val,n;
int a[maxn];
void find(int &l,int &r,int id)
{
l = id,r = id;
while(a[l] == a[id] && l >= 1) --l;
l++;
while(a[r] == a[id] && r <= n) ++r;
r--;
return ;
}
void solve(int l,int r)
{
if(l > r) return ;
int mid = l + r >> 1;
int i,j;
find(i,j,mid);
if(j - i + 1 > num)
{
num = j - i + 1;
val = a[mid];
}
if(i - l > num)
solve(l,i-1);
if(r - j > num)
solve(j+1,r);
return ;
}
int main()
{
srand(0);
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
while(cin >> n)
{
/*for(int i = 1;i <= n;++i)
cin >> a[i];*/

for(int i = 1;i <= n;++i)
a[i] = rand() % 10;
sort(a+1,a+n+1);
for(int i = 1;i <= n;++i)
printf("%d%c",a[i],i == n ? '\n' : ' ');
num = val = 0;
solve(1,n);
printf("%d %d\n",val,num);
}
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com