【问题标题】:How to find the most frequent word in a word stream? [duplicate]如何找到词流中出现频率最高的词? [复制]
【发布时间】:2012-07-17 20:40:06
【问题描述】:

可能重复:
Finding the max repeated element in an array

如果有一个词流,其中一个词的出现率在51%以上,如果只有string我们怎么能找到出现频率最高的词呢,内存中可以一次存一个int来帮助我们找到它。

我们只能访问每个单词一次,因为这是一个流。

不需要特定的语言,但这主要是针对 Java 的。

我也不是要代码,只是想法。 :)

【问题讨论】:

  • 您可以存储多少个字符串或整数有限制吗?还是数据结构的限制?
  • 你知道流的长度吗?
  • 正如@assylias 所说,Boyer-Moore 多数投票算法绝对是要走的路!
  • 我明白了!我目前正在查看它是否有效:

标签: java restrictions


【解决方案1】:

为了完整起见,用Java实现the duplicate I pointed at中提出的算法,应用于一个例子:

public static void main(String[] args) throws InterruptedException {
    List<String> list = Arrays.asList("a", "b", "c", "a", "d", "e", "a", "a", "b", "b", "a");
    int counter = 0;
    String mostFrequentWord = "";
    for (String streamed : list) {
        if (streamed.equals(mostFrequentWord)) {
            counter++;
        } else if (counter == 0) {
            mostFrequentWord = streamed;
            counter = 1;
        } else {
            counter--;
        }
    }
    System.out.println(mostFrequentWord);
}

【讨论】:

  • 感谢您的帮助!不胜感激!我以为我走到了死胡同!
  • 我不相信这行得通,看起来像垃圾。尝试对 a a b b a a,我相信答案将是“b”,因为它在切换到 b 时忘记了前两个 a,对吧?你真的不能在不知道历史的情况下做到这一点(记住发送的每一个字和计数),但如果我错了,我很想知道如何......似乎年纪越大,我转的次数就越多我绝对确定的事情是错误的。
  • @BillK 在说它是垃圾之前,你应该检查你的结论。使用a a b b b a a 作为输入会按预期返回a(如果您不相信,通过修改代码并运行它很容易检查)。
  • @BillK 您应该检查副本以获取有关该算法如何工作的完整说明。特别是这个答案:stackoverflow.com/a/3740548/829571 以获得很好的视觉解释。
  • @BillK 请注意,该算法仅在其中一项出现超过 50% 的时间时才有效。例如,如果您有 3 个项目出现 30%、30% 和 40% 的时间,则结果未定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多