我最近了解了处理哈希表中冲突的不同方法。并看到与链表的单独链接总是更省时,并且为节省空间,我们为线性探测分配了预定义的内存,以后我们可能不使用它,对于链的单独链接,我们动态地利用内存,因此链表的单独链接也是如此不是比线性探测更有效吗?如果是,为什么我们要使用线性探测呢?
令您惊讶的是,您看到链式哈希比线性探测要快- 实际上,线性探测通常比链式探测快得多。这主要是由于引用的局部性,因为在线性探测中执行的访问趋于比在链式哈希中执行的访问在内存中更近。
线性探测还有其他优势。例如,插入线性探测哈希表不需要任何新的分配(除非您要重新哈希表),因此在内存不足的网络路由器等应用程序中,很高兴知道一旦建立了表,可以将元素放入其中,没有malloc失败的风险。
malloc
线性探测的一个缺点是,如果哈希函数选择不正确,主群集会导致表的性能显着下降。虽然链式散列仍会受到不良散列函数的影响,但它对具有附近散列码的元素不太敏感,不会对运行时间产生不利影响。从理论上讲,如果哈希函数独立于5或键中具有足够的熵,则线性探测仅会提供预期的O(1)查找。有许多方法可以解决此问题,因为使用Robin Robin哈希技术或Hopscotch哈希技术,最坏的情况都比普通线性探测好得多。
线性探测的另一个缺点是,随着负载因子接近1,其性能会大大降低。您可以通过定期重新哈希或使用上述Robin Hood哈希技术来解决此问题。
希望这可以帮助!