Java 如何确定HashMap中方法的最坏情况复杂性?
我知道在平均Java 如何确定HashMap中方法的最坏情况复杂性?,java,hashmap,runtime,time-complexity,Java,Hashmap,Runtime,Time Complexity,我知道在平均put(k,v)和get(v)takeo(1)中,他们最糟糕的情况是o(n)。那么containsKey(v)呢? 以及如何确定以下各项的运行时间: public void addOccurence(String word) { if (hm.containsKey(word)){ hm.put(word, hm.get(word)+1); } else {hm.put(word, 1); } } 最坏的情况是o(n^2),平均情况是o
put(k,v)
和get(v)
takeo(1)
中,他们最糟糕的情况是o(n)
。那么containsKey(v)
呢?
以及如何确定以下各项的运行时间:
public void addOccurence(String word) {
if (hm.containsKey(word)){
hm.put(word, hm.get(word)+1);
}
else {hm.put(word, 1); }
}
最坏的情况是
o(n^2)
,平均情况是o(1)
最坏情况是O(N)。你在做两个或三个操作,每个操作都是最坏的O(N),所以你有3N仍然是O(N)。你没有做任何二次性质的事情。最坏情况下的时间复杂度hm.put(word,hm.get(word)+1)
是O(N)
方法:假设由于过度冲突,您的hashMap变成了一个链表。因此get()
必须搜索整个链表,因此O(N)
。类似地,hm.put()
将需要遍历链表以插入值。所以O(N)+O(N)=O(2N)~=O(N)
即使对于insert,您不会遍历整个链表,那么get()
方法的时间复杂性也是O(N)
。所以总数是O(N)。因此,在这两种情况下,最坏情况下的时间复杂度都是O(N)
但其渐近下界为O(1)
方法:
因为如果您的密钥分布均匀,那么get()
将具有o(1)
时间复杂度,对于insert
也是如此。因此,在渐近时间复杂度中导致O(1)
。O(N)不是最坏的情况。HashMap只声明有固定的工作时间。事实并非如此。当特殊阈值超过时,通常通过重新灰化贴图来保持恒定的工作时间。请查看内部HashMap方法:
hm.put(word, hm.get(word)+1)
若大小大于阈值,则会发生完全重新灰化,其复杂性等于创建新的HashMap。所以最坏的情况是
O(新HashMap(oldMap))+O(N)
若您错误地重写了hashCode()函数,使其具有纯分布,则可能会出现O(N)。对于默认实现,这是不可能发生的。唯一的危险是重新灰化。最坏情况下的运行时不是
O(n^2)
,因为对于每个循环,您没有O(n)
RT的嵌套循环。运行时将是O(n),因为您正在将来自hm.put(word,hm.get(word)+1)
方法的RT添加到来自hm.containsKey(word)
方法的RT。和O(n)+O(n)=O(2n)
==>O(n)
当然,最好的情况是字符串不在hashmap中,并且执行了else(…)
语句,或者O(1)
作为旁注,
containsKey(k)
方法基本上是一个get(k)
方法,它根据键是否存在返回布尔值。另一方面,get(k)
方法将实际返回键的值,假设该键存在于hashmap中。两者的运行时是相同的,因为它们基本上以相同的方式搜索hashmap。O(2*n)=O(n)。常数乘数对大O渐近性没有影响。(还有,你在第一段中的意思是“最坏的情况”而不是“单词情况”?)谢谢!这对我来说更有意义
void addEntry(int hash, K key, V value, int bucketIndex) {
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}
createEntry(hash, key, value, bucketIndex);
}
public void addOccurence(String word) {
if (hm.containsKey(word)){ //Worst Case O(n)
hm.put(word, hm.get(word)+1); //Worst case O(n)
}
else {hm.put(word, 1); } //O(1) Runtime
}