更详细的见点击打开链接,这里只说一下自己的观点。
这里是以槽位为操作对象的,本人认为在头脑中建立一个好的数学模型对于编程有很大帮助。
每个槽位定义为一个node{key,flag,pre,next}
需要一个自由链表,单链表即可。表头是Free=0;
定义两个操作自由链表的函数,这很容易想到,即从自由链表中移出一个结点RemoveFromFree(槽对象),或将一个(node)槽对象加入到自由链表FreeToFree.
RemoveFromFree函数的原理是:需要从自由表中移除的node为A[h],则找出它的pre和next结点。A[h].pre的next指向A[h]的next...A[h].next的pre指向A[h]的pre.这样就可以隔离出A[h].返回A[h]的索引h就可以。(中间的判断next和pre是否存在是小细节,慢慢调就可以)
FreeFromFree:释放node到自由链表中的原理:将A[h]插入到链表开头,将A[h]的key置-1,pre=-1。
Search x,通过hash将x映射到槽位h上,如果槽位为空或者原先占据这个槽位的关键字并不属于这个槽位,则查找出错。为什么呢?这有些难理解,这需要结合insert来说,
因为insert操作是,如果要插入的槽位为空,则直接插入,如果插入的槽位不为空而且占据该槽位的关键字也属于该槽位,即相同优先级的两个关键字在同一槽位上冲突,处理策略是旧