我想写一个算法,找到数组中第n个最常用的数字。 我有一个解决方案,但不是最优的(测试数字我已经测试过) 我想知道是否有更优化的解决方案? 这是我的解决方案:
most_freq_element(a,n){
final_cnt = 0, curr_cnt = 1, final_freq_num = -1, curr_freq_num = -1;
for(i = 0; i < n-1; i++)
{
if (a[i]!=-1){
curr_freq_num = a[i];
for(j =i+1; j < n; j++){
if(curr_freq_num == a[j] && final_freq_num != curr_freq_num){
curr_cnt++;
}
}
if(final_cnt < curr_cnt){
final_cnt = curr_cnt;
curr_cnt = 1;
final_freq_num = curr_freq_num;
}
}
}
printf("Num = %d and times = %d", final_freq_num, final_cnt);
}
nth_most_frequent_element(a,n,k){
if(k==1){
return most_freq_element(a,n);
}
else{
for (i=0;i<k;i++){
int most_freq_num = most_freq_element(a,n);
for(i = 0; i < n-1; i++){
if (a[i]==most_freq_num){
a[i]=-1;
}
}
}
return most_freq_element(a,n);
}
}
答案 0 :(得分:1)
我可能会创建一个hashmap / table,并在碰撞时递增每个值,这样数字就是键,值就是碰撞次数。然后,当您完成后,将其聚合到排序列表并获取第n个元素。将在O(n)中运行,这是非常理想的。
编辑:实际上,排序将花费n * log(n)。
答案 1 :(得分:0)
这个怎么样?最糟糕的复杂性是O(2.N.logN + k.min(k,d)),d:
中唯一值的数量MapKit