今日拜读算法导论,尤感才疏学浅,但愿捡拾精要,以备后用

哈希表的最终目的是加速查询速度。两种基本数据结构-数组和链表各有千秋,
数组访问速度快,链表插入删除快,哈希目的就是走中庸之路,使两者皆优,但
又不走极端。这是一个基本思想,为了一点性能的提升而花费巨大的成本是不合算的。

两种结构,链表法和开放寻址法。
链表法结构较复杂,操作简单。开放寻址法结构简单,空间需求小,而操作复杂。

链表法

哈希表基础

关键字由散列函数散列到一个槽位上,如果该槽位有元素,构造一个链表,挂在这个槽位后面。如果槽位上已经有了链,那么就在链首插入。链表可以采用单链和双向链。

散列函数的选择是最为重要的,原则是:不应该依靠任何数据分布的假设,使元素尽量能够均匀地散列到每个槽位上。必要时,为了安全起见,一组散列函数中随机选择一个,使得恶意用户无法进行破坏。

开放寻址法

开放寻址法结构超级简单就一个数组。
这里给关键字分配槽位的函数不叫散列,叫探查函数。
探查函数的原则也是使所有元素均匀地散列。不过一个槽位只能存放一个元素,
这里的均匀就是处理冲突时不要让散列到同一个槽位的元素在继续探查的时候产生更多次的冲突-术语叫集群现象。

最过分的一次线性探查,假如两个关键字具有相同的散列值,然后发现这个槽有
元素了,那么会继续看它紧邻的下一个有没有,两个关键字探查位置序列一样,
会引起很多冲突。因此,开放寻址法,就我而言,过分繁琐。

相关文章: