开放寻址法

来源:互联网 发布:小程序域名白名单 编辑:程序博客网 时间:2024/06/05 04:08

开始之前先引用一个牛人对开放寻址法的介绍,http://blog.csdn.net/shaobingj126/article/details/8156675。在此基础上,本文进行更为准确更为恶心地补充说明。在进行坑位选择时,顾客对所有的坑位有一个喜好排序,然后按照特定排序方法,尽量选择最喜欢的坑位,检查里面是否有人,然后进行蹲坑,这就是进行insert操作。而search,可以认为是有人来厕所找人,他知道被找人的喜好,然后按照被找人的喜好,依次查找,如果找到某个人,可以返回位置信息。如果按顺序找到一个“干净”的坑位,就之间返回要找的人没在厕所。“干净”的坑位可以理解是没有人使用过该坑位。假设上厕所的人都不冲厕所,即如果有人用过某坑,会有一个标记,该坑没有记录使用者的信息,只标记被使用过了,而且现在没人,即这编码被insert过,而且又delete掉了。尽管坑可能被用过,但是只要按照喜好顺序,只要发现没人,顾客就会选择这个坑位,被insert到这个位置。而找人时,发现脏的没人的坑位,需要继续寻找,因为可能被找的人已经离开厕所了,也可能之前有人,被找的人在下一个位置,因此直到找到“干净”的坑位,确定,目前厕所里面没有要找的人。
坑位编号是0,1,……m-1,但是喜好编号是另一个顺序h(k,0),h(k,1),……h(k,m-1),两个集合是一一映射,但是不是按顺序对应的。常用的对应算法有一下几种。
线性探查
h(k,i)=(h(k)+i)modm。该算法相当于,通过某种映射首先选择某个最喜欢的坑位,然后依次选择下一个坑位,到了m-1,再回到初始0号坑位,一共有m种不同的喜好顺序。
凭我们的历史经验可知道,当这个坑被选择时,相邻的坑位被选择几率会很大,《算法导论》中说某坑位前有i个位置都被占了,则该位置为下一个被占用的概率是(i+1)/m,没有想清楚为什么。于是乎有了下面
二次探查
h(k,i)=(h(k)+c1i+c2i2)modm,也是存在m中不同的喜好序列。
双重散列
h(k,i)=(h1(k)+ih2(k))modm,该算法有m2中探查序列,因为h1(k)modm 结果指向某一个特定的初始位置,有m种可能,而h2(k)modm又指向m种特定偏移的一种。为了查找整个散列表,要求所有的h2(k)和m互质。因为如果h2(k)和m的最大公约数是d,h2(k)modm和m的最大公约数也是d(辗转相除算法的由来),则t[0,m1]th2(k)modm可以整除d,因此,该双重散列只能遍历散列表中1/d个元素,因此当d=1时,即h2(k)和m互质,则可以遍历整个散列表。

0 0