【问题标题】:Number of occurrences of words in a file - Complexity?文件中单词的出现次数 - 复杂性?
【发布时间】:2013-01-21 22:18:47
【问题描述】:

假设我有一个包含一组单词的文件:

1) 如果我选择一个哈希表来存储单词 -> 计数,那么查找特定单词出现的时间复杂度是多少?

2) 我怎样才能按字母顺序返回这些单词?

如果我选择一个哈希表,我知道 1) 的时间复杂度将是 O(n) 来解析所有单词,而 O(1) 来获取特定单词的计数。

我看不到如何订购哈希表以及时间复杂度是多少。有什么帮助吗?

【问题讨论】:

  • 您是在以理论的心态提问吗?一些地图实现提供对键的排序。
  • @UmNyobe 不是地图,哈希。按照普遍共识,散列不能维持秩序。
  • 时间复杂度是一个算法问题,下面会回答(通常是O(n log n)),但是如何排序哈希表取决于实现,即语言。

标签: algorithm sorting hashtable


【解决方案1】:

你对(1)的分析是正确的。

大多数哈希表实现(据我所知)没有隐式排序。

要获得有序列表,您必须对列表进行排序 (O(n log n)),对列表的查询将采用 O(log n)

理论上你可以定义一个哈希运算和排序的实现,但是让它分布良好(为了提高效率)会很困难,而仅仅排序会简单得多。

如果它是一个包含大量重复的文件,最好的办法可能是首先使用散列来消除重复,然后遍历散列表以获取非重复列表并对其进行排序。

【讨论】:

    【解决方案2】:

    一个可排序的哈希映射本质上变成了一个二叉树。在 java 中,您可以看到 TreeMap 实现了 SortableMap 接口,在查找和插入时使用 O(log n)。

    如果您想要最佳的理论性能,您可以使用具有 O(1) 查找和插入的 HashMap,然后使用具有 O(n) 的存储桶/基数排序进行显示/迭代。

    实际上,对字符串使用基数排序会比快速排序 O(n log n) 执行得更差。

    【讨论】:

    • 我只是想知道为什么在字符串上使用基数排序会比现实中的快速排序表现更差。有什么原因导致的吗?还是只是实验结果的证据?
    • 注意 - 可排序映射!= 可排序哈希映射。如果您不以强制排序的方式定义散列函数(这绝非易事,特别是如果您想要一个分布良好的函数),那么以散列作为键的 TreeMap 并没有真正的帮助。并且让它在哈希数组中排序(这是隐式完成的)可能更有效。
    • @Terry Li - 在这种字符串是单词的特定情况下,并且唯一单词/页面的数量有限,直接基数排序实际上可能工作得最快。但在一般情况下,使用直基数排序对字符串进行排序是不切实际的。基数排序是 KN,其中 K 是最大字符串长度,如果 K 大于 log N 以进行快速排序,那么从实用的角度来看,它的效率较低。一些现代研究表明,混合使用基数和快速排序对字符串进行排序更为优越。
    • @LastCoder +1 最后一句话。
    • @Terry Li - 搜索(3 路基数快速排序,字符串)会发现很多很棒的信息drdobbs.com/database/sorting-strings-with-three-way-radix-qui/…
    【解决方案3】:

    使用哈希表有两个缺点 1- 它们不以排序方式存储数据,2- 哈希值的计算通常很耗时。在最坏的情况下,它们还具有插入/删除/查找的线性复杂度。

    我的建议是使用Trie 来存储您的文字。插入/查找有保证的 O(1)(字数)。对 Trie 的预排序遍历将给出 Trie 中单词的排序列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多