数据结构学习笔记(九)跳表、字典的跳表描述

一、跳表

        在使用有序链表描述的n个数对的字典中进行查找,至多需要n词比较。如果使用折半查找的思想,使用跳表来描述,可以大大加快搜索的速度。在下图10-1中,a表示的有序链表有7个数对,该链表增加一个头结点和一个尾节点。对该链表进行搜索最多需要7次关键字的比较。如果像b那样,在中间的节点中加入一个指针,那么比较时先和这个中间节点比较,在决定在前半部分还是后半部分继续搜索,因此搜索最多需要4次关键字的比较。

       也可以像c那样,分别在左半部分和后半部分的中间节点增加一个指针,以进一步减少最坏情况下的比较次数。该图有三级链表,0级链表是初始链表,包含7个数对,1级链表包含字典的二、四、六数对,2级链表只包含第四个数对。查找时,先根据2级链表,判断接下在左半部分还是右半部分继续查找,然后根据1级链表,最后根据0级链表查找,这个过程搜索时最快情况只需要3次比较。

        举个例子,查找关键字为77的数对。首先和2级链表的节点40比较,因为77大,所以接下来在1级链表中和节点75比较。因为还是77大,所以在0级链表中与75后面的节点80比较,最后得知77不在字典中。

      

      诸如c的结构称之为跳表。对于n个数对而言,0级链表包含所有数对,1级链表每2个数对取一个,2级链表每4个数对取一个,i级链表每2^i个数对取一个。一个数对属于i级链表,当且仅当它属于0~i级链表,但不属于i+1级链表。在图c中,关键字是40的数对属于2级链表,关键字为24和75 的数对属于1级链表,关键字为20、30、60、80的数对属于0级链表。

二、跳表的实现:


       插入和删除 

       在插入和删除时,要保持像图中c所示跳表的规则结构,需要耗时O(n)。在规则的跳表结构中,i级链表有n/2^i个记录,在插入要尽量逼近这种结构。插入的新数对属于i级链表的概率为 1 / 2^i。在实际确定新树所属的链表级别时,应考虑各种可能的情况。把新数对插入i级链表的可能性为p^i。在图c中,p=0.5。在一个规则的跳表中,i级链表包含1/p个i-1级链表的节点。

       假设需要插入关键字为77的数对。首先通过搜索确定链表中没有该元素。在搜索时,我们用到了关键字为40 的节点(2级链表指针)、关键字为75 的节点(1级链表指针)和一个0级链表指针。图d中。这几个指针被一条虚线切割。新数对插入的位置在75和80之间。    确定位置后,还要为新数对分配一个级(即确定他属于哪一级链表)。若新数对属于i级链表,则插入结果仅影响有虚线切割的0~i级链表的指针。图e是插入结果。

       删除操作,我们无法控制结构。要删除图e的节点77,首先要找到77。因为77为1级链表中数对的关键字,所以只需要改变0级和1级链表指针即可。当这些指针指向77后面的节点时,就得到图d的结构。


        级数的分配

       我们知道在规则的跳表结构中,i-1级链表的数对个数与i级链表的数对个数之比是一个分数p。因此属于i-1级链表的数对同时属于i级链表的概率是p。假设用一个统一的随机数生成器产生0~1之间的实数,产生的随机数<=p的概率是p。若下一个随机数<=p,则新数对应在1级链表上。要确定该数对是否在2级链表上,要由下一个随机数确定。若新的随机数<=p,则该元素也属于2级链表,重复该过程知道随机数>p为止。

        这种方式分配的级数可能特别大,为此设定一个级数的上限maxLevel,最大值为(见下图)。此外,这种方式还有一个缺点:当插入一个新数对之前有3个链表

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值