Hash 完美散列函数的大O是什么?

Hash 完美散列函数的大O是什么?,hash,time-complexity,big-o,perfect-hash,Hash,Time Complexity,Big O,Perfect Hash,可能发生冲突的常规哈希函数以恒定时间运行:O(1)。但完美散列函数的时间复杂度是多少?是1吗?如果哈希函数用于访问哈希表,那么完美哈希函数和常规哈希函数在复杂度方面没有区别,因为它们也可能在表中创建冲突。原因是与哈希表中的元素相关联的索引是哈希除以表的长度(通常是一个素数)的剩余部分。这就是为什么两个散列为不同值的元素会发生冲突,如果它们对(所述)素数的模余数对它们来说是相同的。这意味着在这两种情况下,访问表的时间复杂度都是O(1) 还要注意,散列的计算通常取决于输入的大小。例如,如果要散列的元

可能发生冲突的常规哈希函数以恒定时间运行:O(1)。但完美散列函数的时间复杂度是多少?是1吗?

如果哈希函数用于访问哈希表,那么完美哈希函数和常规哈希函数在复杂度方面没有区别,因为它们也可能在表中创建冲突。原因是与哈希表中的元素相关联的索引是哈希除以表的长度(通常是一个素数)的剩余部分。这就是为什么两个散列为不同值的元素会发生冲突,如果它们对(所述)素数的模余数对它们来说是相同的。这意味着在这两种情况下,访问表的时间复杂度都是
O(1)


还要注意,散列的计算通常取决于输入的大小。例如,如果要散列的元素是字符串,那么好的散列将考虑它们的所有字符。因此,为了保持复杂性
O(1)
,必须限制输入的大小(或长度)。同样,这也适用于完全哈希和常规哈希。

没有要求,因此它是任意的。..From:值在有限范围内的完全哈希函数可以用于有效的查找操作,方法是将S(或其他相关值)的键放置在由函数输出索引的查找表中。然后可以通过在表的单元格中查找键来测试键是否存在于中,或者查找与该键相关联的值。在最坏的情况下,每次这样的查找都需要持续的时间。@JamesKPolk,谢谢你提醒我注意这一点。现在我发现我把这个问题误解为与哈希表有关。我将更改我的答案。您可以使用生成有限范围内的值且无冲突的、具有恒定访问时间的查找表。另请参阅最小完美散列函数,@JimMischel,谢谢。你知道这是否可行吗?我的意思是,如果算法中涉及的素数太大,您将分配一个同样大的表。从时间复杂度的角度来看,这也很糟糕,因为您将失去CPU缓存的好处,并且每次访问()时都需要从RAM中读取。当您拥有一组已知的密钥时,最好使用完美哈希。您可以创建一个函数,该函数在有限的范围内生成值,通常不会比已知的一组键大多少。因此,您的哈希表大小是固定的,并且您的缓存行为并不比使用普通哈希表时更糟糕。如果没有冲突,那么关于冲突解决方案的讨论就无关紧要了:每个查找都有一个探测器。而且,由于每次查找基本上都是对哈希表的随机探测,因此这里也不特别关注缓存行为。