【发布时间】:2011-10-06 05:51:43
【问题描述】:
假设我读取了一个整数流。同一整数可能在流中出现多次。现在我想保留一个最常出现的 N 个整数的缓存。缓存按流元素的频率排序。
你将如何在 Java 中实现它?
【问题讨论】:
-
这里有趣的部分是如何处理那些不在当前前 N 个缓存中的数字。是否要求只在缓存中存储来自流的固定数量的不同整数?
标签: java data-structures
假设我读取了一个整数流。同一整数可能在流中出现多次。现在我想保留一个最常出现的 N 个整数的缓存。缓存按流元素的频率排序。
你将如何在 Java 中实现它?
【问题讨论】:
标签: java data-structures
【讨论】:
【讨论】:
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
【讨论】:
为int创建一个对象模型,在里面创建一个Count属性。创建一个扩展 Vector 集合的 SortedVector 集合。每次出现整数时,如果它不存在,则将其添加到向量中。否则,找到它,更新 count 属性 += 1,然后在 Vector 中调用 Collections.sort(this)。
【讨论】:
你知道数字的范围吗?如果是这样,使用数组可能是有意义的。例如,如果我知道数字的范围在 0 到 10 之间,我会创建一个大小为 10 的数组。这个数组中的每个元素都会计算我看到给定数字的次数。然后,您只需要记住最常见的数字即可。
例如
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];
}
当然,如果数字分布稀疏,这种方法就不好了。
我会尝试优先队列。
【讨论】: