【问题标题】:Java - Most suitable data structure for finding the most frequent elementJava - 最适合查找最频繁元素的数据结构
【发布时间】:2013-01-29 23:35:11
【问题描述】:

我的程序包含输出文本(字符串)的算法。最终我想打印出出现次数最多的单词。但在我这样做之前,我需要将它存储在一个数据结构中。所以我想知道什么数据结构是最好的(简单有效)存储字符串然后能够获得最频繁的元素?我不想使用任何库。谢谢

【问题讨论】:

  • 你为什么不想使用任何库?
  • @sp00m - 每次我会得到一个词或最多2个词,然后我想将这些词存储到一个合适的数据结构中,然后选择最频繁的一个
  • Map<String, Integer> ?
  • 您的帖子标题具有误导性。可以认为是find the most frequently accessedString,就像在一个缓存中

标签: java string data-structures


【解决方案1】:

我不认为任何数据结构都能做到这一点,但我会这样做。

将每个单词的Map<String, Integer> 保留为遇到它的次数,并在更新地图时跟踪与存储的最大数字相对应的字符串。例如:

String maxWord = null;
Integer maxCount = -1;
Map<String, Integer> wordCount = new HashMap<String, Integer>();
for (String str : getMyProgramOutput()) {
  if (!wordCount.containsKey(str)) { wordCount.put(str, 0); }
  int count = wordCount.get(str) + 1;
  if (count > maxCount) {
    maxWord = str;
    maxCount = count;
  }
  wordCount.put(str, count);
}

【讨论】:

  • 太棒了!只是一个简单的问题,如果有两个元素的出现次数相同,会发生什么?
  • @Matt9Atkins:遇到的第一个字符串(按迭代程序输出列表的顺序)其计数达到“最大值”值将存储为“maxWord”。如果要将其更改为最后一个字符串,则可以执行if (count &gt;= maxCount)。
【解决方案2】:

创建一个Map&lt;String, Integer&gt;。每次输入 String 时,增加 Integer(您可能必须创建自己的 MutableInteger 类。完成搜索后(或保持运行计数)

【讨论】:

  • 不需要 MutableInteger 类:map.put(s, ++count);...
  • 我怎样才能获得地图中出现频率最高的元素?
  • @Matt9Atkins 遍历它并找到具有最高 Integer 值的单词。 O(n) + O(n)
【解决方案3】:

你为什么不建立一个最大堆,每个节点中都有String和integer_occurrence。获取最频繁的单词,获取堆的根

【讨论】:

    【解决方案4】:

    您可能需要考虑在 DB 中使用字典。因为这些数据通常必须保存在物理介质中,以防止系统重启后丢失。在这种情况下,字典很有帮助。您只需要建立一个字典表和其他表来存储频率和定位等信息。

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2021-12-05
      • 2021-01-13
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多