一位著名的程序员说“为什么有人需要数据库,只要给我哈希表!”。我有语法符号列表及其频率。一种方式是地图:符号#->频率。另一种方式是[二元]关系。问题:按频率获得前 5 个符号。
更一般的问题。我知道 [二元] 关系代数正在慢慢进入 CS 理论。有支持关系的java库吗?
一位著名的程序员说“为什么有人需要数据库,只要给我哈希表!”。我有语法符号列表及其频率。一种方式是地图:符号#->频率。另一种方式是[二元]关系。问题:按频率获得前 5 个符号。
更一般的问题。我知道 [二元] 关系代数正在慢慢进入 CS 理论。有支持关系的java库吗?
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;
}
有了TreeSet
它应该很容易:
int i = 0;
for(Symbol s: symbolTree.descendingSet()) {
i++;
if(i > 5) break; // or probably return
whatever(s);
}
这是一个通用算法,假设您已经有一个完整的符号 HashTable
分析:
空间:O(1) 来存储数组
运行时:O(n) 遍历所有符号