在java中表示二进制关系

时间:2012-10-22 16:30:09

标签: java

一位着名的程序员说“为什么有人需要DB,只需给我哈希表!”。我有语法符号列表及其频率。一种方式是地图:符号# - >频率。另一种方式是[二元]关系。问题:按频率获得前5个符号。

更一般的问题。我知道[二元]关系代数慢慢地进入CS理论。有java库支持关系吗?

3 个答案:

答案 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

  1. 制作2个数组:
    • freq [5] //使用它来保存到目前为止最常见的5个频率计数
    • word [5] //使用此选项保存与上述数组相对应的单词,目前为止
  2. 使用迭代器遍历您的HashTable或Map:
    • 按顺序将当前符号的频率与频率[5]中的频率进行比较。
    • 如果当前符号的频率高于上面阵列配对中的任何条目,请将该条目及其下方的所有条目移位一个位置(即第五个位置被踢出)
    • 将当前符号/频率对添加到新腾出的位置
    • 否则,请忽略。
  3. 分析:

    • 对HashTable中看到的每个符号进行最多5次比较(常数时间),所以这是O(n)
    • 每次必须将数组中的条目向下移动时,它也是恒定时间。假设你每次都做一次班次,这仍然是O(n)

    空格: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);
}