【发布时间】:2017-05-05 02:16:09
【问题描述】:
更多信息:
- n 是字符串中的字符数
- 哈希表应该跟踪每个单词的频率;即哈希表应该存储键值对,其中键是输入字符串中的一个单词,值是该单词在输入字符串中出现的次数
我们在工作中就这个问题进行了一些激烈的辩论,我想看看你们认为答案是什么。
【问题讨论】:
标签: algorithm hashmap big-o hashtable
更多信息:
我们在工作中就这个问题进行了一些激烈的辩论,我想看看你们认为答案是什么。
【问题讨论】:
标签: algorithm hashmap big-o hashtable
在实现插入函数期间要考虑的重要一点是我们如何处理冲突和解决技术。这将对 put() 和 get() 操作产生更大的影响。 冲突解决技术在每个库中实现不同。核心思想是将所有冲突的键保存在同一个桶中。并在检索过程中遍历所有冲突的键并应用一些相等性检查来检索给定的键。需要注意的重要一点是,我们需要在存储桶中同时维护“键”和“值”,以方便上述相等性检查。
因此,key(words) 也与计数一起存储在哈希表中。
要考虑的另一件事是,在插入操作期间,将为给定键生成哈希码。对于每个键,我们可以认为这是常数 O(1)。
现在,回答问题。 给定一个长度为 'n' 的字符串 插入所有单词和频率将有以下步骤。
1. split given string in to words, with given delimiter - O(n)
2. For word in words - O(n)
# Considering copy of word of length k as constant and very small compared to 'n'.
# And collision resolution implementation amortized across all inserts
if MAP.exists(word) - O(1)
MAP.set(word, MAP.get(word)+1) - amortized to O(1)
else
MAP.set(word, 1) - O(1)
总的来说,O(n) 运行时将字符串中的单词插入哈希表。因为 for 循环运行了 'n/k' 次,我们知道 'k' 是常数并且与 n 相比很小。
【讨论】:
如果H 是您的哈希表映射单词到计数,那么H[s] 和H[s] = <new value> 都是O(len(s))。这是因为计算s 的哈希码需要您读取s 的每个字符,并且一旦您在哈希表中找到相关行,您需要将s 与存储在那里的任何内容进行比较。当然,通常的哈希表复杂性适用于 - 执行这些比较的 O(1)。
关于您最初的问题,您可以在 O(n) 时间内将长度为 n 的字符串分解为单词。然后对于每个单词,您需要一个 O(len(word)) 操作来更新哈希表。对于所有字符串,O(len(word1) + len(word2) + ... + len(word_n)) = O(n) 总体而言,因为单词长度的总和总是小于n,即原始字符串的长度。
【讨论】: