一位着名程序員說:「爲什麼有人需要DB,只給我散列表!」。我有語法符號列表及其頻率。一種方式是地圖:符號# - >頻率。另一種方式是它的[二元]關係。問題:通過頻率獲得前5個符號。在java中表示二進制關係
更一般的問題。我意識到[二元]關係代數慢慢滲透到CS理論中。有沒有Java庫支持關係?
一位着名程序員說:「爲什麼有人需要DB,只給我散列表!」。我有語法符號列表及其頻率。一種方式是地圖:符號# - >頻率。另一種方式是它的[二元]關係。問題:通過頻率獲得前5個符號。在java中表示二進制關係
更一般的問題。我意識到[二元]關係代數慢慢滲透到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;
}
優秀:只需5分鐘即可採用您的代碼。 –
看完這個之後,我認爲使用'TreeSet'而不是'List'與提供的'Comparator'可能會更有效率。 –
你的意思是重複使用輸入符號 - >頻率圖,或者創建新的? –
這裏是一個通用算法,假設你已經有一個完成符號的HashTable
分析:
空間:O(1)存儲陣列
運行:O(n)到所有符號迭代
不會使用List
@JohnB的確如此。我對Java很生疏,所以我選擇了一個一般的描述來避免語法失誤。感謝您的解決方案中的進修! –
隨着TreeSet
它應該很容易:
int i = 0;
for(Symbol s: symbolTree.descendingSet()) {
i++;
if(i > 5) break; // or probably return
whatever(s);
}
「Symbol」是一個可變對象,它包含並根據其頻率排序?這似乎是一個符號類的奇怪行爲。也許是'SymbolFrequency'。你如何更新每個元素的頻率?你是否維護一個'List',你必須迭代找到合適的?或者你有一個'Map
'SymbolFrequency'可能是更好的名字。我認爲程序運行時頻率沒有變化。其他操作可能需要'Map
只是好奇,誰說的? –
像'java.lang.TreeSet實現java.lang.SortedSet'? – zch
看起來像是James Gosling,而實際的引用是「」當談到SQL數據庫時,我從來沒有得到過它。這就像是,爲什麼?只要給我一個哈希表和一個sh * tload的RAM,我很高興。「' –