假设我想存储字符串字典,我想知道是否存在某些字符串.我可以使用
Trie或HashMap. HashMap具有高概率O(1),而Trie在这种情况下具有O(k)的时间复杂度,其中k是字符串的长度.
现在我的问题是:不计算字符串的哈希值是否具有O(k)的时间复杂度,从而使HashMap的复杂性相同?如果没有,为什么?
我看到它的方式是,这里的Trie比HashMap具有更低的时间复杂度来查找字符串,因为HashMap除了计算哈希值之外 – 可能会遇到冲突.我错过了什么吗?
更新:
在构造字典时,您将使用哪种数据结构来优化速度?
最佳答案 除了trie的实现的复杂性之外,在hashCode方法的实现中进行某些优化,该方法确定哈希表中的桶.对于java.lang.String,一个不可变的类,这是JDK-8的作用:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
因此,它被缓存(并且是线程安全的).一旦计算,就不需要重新计算字符串的哈希码.这使您无需在哈希表(或哈希集,哈希映射)的情况下花费O(k)时间.
在实现字典时,我认为尝试闪耀在你对可能的部分匹配而不是完全匹配更感兴趣的地方.一般而言,基于散列的解决方案在精确匹配的情