一位着名的程序员说“为什么有人需要DB,只需给我哈希表!”。我有语法符号列表及其频率。一种方式是地图:符号# - >频率。另一种方式是[二元]关系。问题:按频率获得前5个符号。
更一般的问题。我知道[二元]关系代数慢慢地进入CS理论。有java库支持关系吗?
答案 0 :(得分:1)
List<Entry<String, Integer>> myList = new ArrayList<...>();
for (Entry<String, Integer> e : myMap.entrySet())
myList.add(e);
Collections.sort(myList, new Comparator<Entry<String, Integer>>(){
int compare(Entry a, Entry b){
// compare b to a to get reverse order
return new Integer(b.getValue()).compareTo(new Integer(a.getValue());
}
});
List<Entry<String, Integer>> top5 = myList.sublist(0, 5);
效率更高:
TreeSet<Entry<String, Integer>> myTree = new TreeSet<...>(
new Comparator<Entry<String, Integer>>(){
int compare(Entry a, Entry b){
// compare b to a to get reverse order
return new Integer(b.getValue()).compareTo(new Integer(a.getValue());
}
});
for (Entry<String, Integer> e : myMap.entrySet())
myList.add(e);
List<Entry<String, Integer>> top5 = new ArrayList<>();
int i=0;
for (Entry<String, Integer> e : myTree) {
top5.add(e);
if (i++ == 4) break;
}
答案 1 :(得分:0)
这是一个通用算法,假设您已经有一个完整的符号HashTable
分析:
空格:O(1)来存储数组
运行时:O(n)迭代所有符号
答案 2 :(得分:0)
使用TreeSet
应该很容易:
int i = 0;
for(Symbol s: symbolTree.descendingSet()) {
i++;
if(i > 5) break; // or probably return
whatever(s);
}