我无法理解哈希表的时间复杂度如何被假定为常数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()进行计算,然后需要调用此方法来添加,删除和搜索方法?
答案 0 :(得分:1)
在谈论哈希表的复杂性时,n是指您将添加到哈希表中的 things 的数量。是的,您可以说(假设没有冲突)从哈希表中获取/设置项目的时间复杂度是哈希函数的时间复杂度(当然这取决于您的哈希函数)。在示例哈希函数中,您已经发布了合理的假设密钥长度的上限常数,这意味着它在实践中是O(1)。但是,如果你有可变的密钥长度,应该说它是O(k),其中k是密钥的长度。