ある有名なプログラマーは、「なぜ誰もがDBを必要としているのか、ハッシュテーブルを教えてください!」と言っています。文法記号とその頻度のリストがあります。マップの1つの方法:symbol#->frequency。逆に言えば、その[二項]関係です。問題:頻度で上位5つのシンボルを取得します。
より一般的な質問。私は[二項]関係代数がゆっくりとCS理論に浸透していることを知っています。関係をサポートするJavaライブラリはありますか?
ある有名なプログラマーは、「なぜ誰もがDBを必要としているのか、ハッシュテーブルを教えてください!」と言っています。文法記号とその頻度のリストがあります。マップの1つの方法:symbol#->frequency。逆に言えば、その[二項]関係です。問題:頻度で上位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;
}
完成したシンボルHashTableがすでにあると仮定した場合の一般的なアルゴリズムは次のとおりです。
分析:
スペース:配列を格納するためのO(1)
ランタイム:すべてのシンボルを反復処理するO(n)
それでTreeSet
簡単なはずです:
int i = 0;
for(Symbol s: symbolTree.descendingSet()) {
i++;
if(i > 5) break; // or probably return
whatever(s);
}