【问题标题】:Data Structure to cache most frequent elements缓存最频繁元素的数据结构
【发布时间】:2011-10-06 05:51:43
【问题描述】:

假设我读取了一个整数流。同一整数可能在流中出现多次。现在我想保留一个最常出现的 N 个整数的缓存。缓存按流元素的频率排序。

你将如何在 Java 中实现它?

【问题讨论】:

  • 这里有趣的部分是如何处理那些不在当前前 N 个缓存中的数字。是否要求只在缓存中存储来自流的固定数量的不同整数?

标签: java data-structures


【解决方案1】:

您想使用二叉索引树,链接中的代码适用于 C++,转换为 Java 应该相当简单(AFAICT 代码相同):

Paper Peter Fenwick

Implementation in C++

【讨论】:

    【解决方案2】:

    【讨论】:

    • 如果流不适合内存怎么办?
    【解决方案3】:
    public class MyData implements Comparable<MyData>{
      public int frequency = 0;
      public Integer data;
      @Override
      public int compareTo(MyData that) {
        return  this.frequency - that.frequency;
      }
    
    }
    

    将其存储在PriorityQueue

    【讨论】:

      【解决方案4】:

      为int创建一个对象模型,在里面创建一个Count属性。创建一个扩展 Vector 集合的 SortedVector 集合。每次出现整数时,如果它不存在,则将其添加到向量中。否则,找到它,更新 count 属性 += 1,然后在 Vector 中调用 Collections.sort(this)。

      【讨论】:

        【解决方案5】:

        你知道数字的范围吗?如果是这样,使用数组可能是有意义的。例如,如果我知道数字的范围在 0 到 10 之间,我会创建一个大小为 10 的数组。这个数组中的每个元素都会计算我看到给定数字的次数。然后,您只需要记住最常见的数字即可。

        例如

        array[10];
        freq_index = -1;
        freq_count = -1;
        
        readVal(int n){
          array[n]+=1;
          if array[n] > freq_count
            freq_index = n;
            freq_count = array[n];
        }
        

        当然,如果数字分布稀疏,这种方法就不好了。

        我会尝试优先队列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-21
          • 1970-01-01
          • 2012-04-08
          • 1970-01-01
          • 2015-08-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多