【发布时间】:2018-09-14 16:07:51
【问题描述】:
我很难理解哈希表的时间复杂度是如何假设为常数 O(1)。我理解冲突的复杂性如何可能是 O(n) 但如果例如我有哈希方法
public int hash(String key)
{
int hashVal = 0;
for (int i = 0; i < key.length(); i++)
hashVal = 37 * hashVal + key.charAt(i);
hashVal %= tableSize;
if (hashVal < 0)
hashVal += tableSize;
return hashVal;
}
假设没有冲突,时间复杂度不应该是 O(n),因为哈希方法本身使用 for 循环到 key.length() 进行计算,然后需要调用这个方法来进行添加、删除和搜索方法?
【问题讨论】:
-
这里的
n是什么? -
您缺少
n的定义。HashSet的 O(1) 性能是插入一个元素的摊销性能。它不关心元素的hashCode()方法有多慢,因为这是一个常数(平均而言)。例如。如果字符串平均长度为42,那么性能是42,但是在做Big-O的时候去掉了常量,所以性能还是O(1),即constant(on平均)。
标签: java hash time-complexity big-o hashtable