查找数组

时间:2017-07-06 02:18:42

标签: arrays algorithm

我想写一个算法,找到数组中第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);
}
}

2 个答案:

答案 0 :(得分:1)

我可能会创建一个hashmap / table,并在碰撞时递增每个值,这样数字就是键,值就是碰撞次数。然后,当您完成后,将其聚合到排序列表并获取第n个元素。将在O(n)中运行,这是非常理想的。

编辑:实际上,排序将花费n * log(n)。

答案 1 :(得分:0)

这个怎么样?最糟糕的复杂性是O(2.N.logN + k.min(k,d)),d:

中唯一值的数量
MapKit