数据结构用于缓存最常见的元素

时间:2011-07-15 14:58:28

标签: java data-structures

假设我读了一个整数流。相同的整数可能在流中出现多次。现在我想保留最常出现的N个整数的缓存。缓存按流元素的频率排序。

您将如何在Java中实现它?

5 个答案:

答案 0 :(得分:3)

您希望使用二进制索引树,链接中的代码用于C ++,并且转换为Java应该相当简单(AFAICT代码将是相同的):

Paper Peter Fenwick

Implementation in C++

答案 1 :(得分:2)

答案 2 :(得分:2)

public class MyData implements Comparable<MyData>{
  public int frequency = 0;
  public Integer data;
  @Override
  public int compareTo(MyData that) {
    return  this.frequency - that.frequency;
  }

}

将其存储在PriorityQueue

答案 3 :(得分:1)

为int创建一个对象模型,在里面创建一个Count属性。创建一个扩展Vector集合的SortedVector集合。每次出现整数时,如果它不存在,则将其添加到向量中。否则,找到它,更新count属性+ = 1,然后在Vector中调用Collections.sort(this)。

答案 4 :(得分:1)

你知道数字的范围吗?如果是这样,使用数组可能是有意义的。例如,如果我知道数字的范围在0到10之间,我会创建一个大小为10的数组。此数组中的每个元素都会计算我看到给定数字的次数。然后,你只需要记住最常见的数字。

e.g。

array[10];
freq_index = -1;
freq_count = -1;

readVal(int n){
  array[n]+=1;
  if array[n] > freq_count
    freq_index = n;
    freq_count = array[n];
}

当然,如果数字的分布很稀疏,这种方法很糟糕。

我会尝试优先队列。