数据结构与算法(跳表)

回顾上节:上节课中我们学习了二分法查找,最基本的二分法查找需要随机的访问数据,底层都是基于数组的存储结构

 1>思考问题,如果底层是基于链表的方式存储数据.是否能用二分法查找呢?

        我们只要对数组进行稍微改造,基于链表实现,并在链表的基础上分别建立对于的索引,就可以快速的基于链表的方式进行查找,而且该种方式支持随机的插入,删除操作,Redis就是基于这种数据结构来存放有序的数据集合的.

2>如何理解跳表这种数据结构

        至于链表的数据结构,我们为查找一个元素,需要遍历这张表,直到找到对应的数据即可,这样需要遍历整张表的时间复杂度是O(n);效率仍然还是很高,

      我们可以在基于链表的基础上,每隔2个节点去建立一个索引层,使用该索引层可以很快的找到对应的数据,其中down指针指向下一节节点.

     

  说明:比如我们需要查找的数据是16,我们首先会去遍历第一级索引,当遍历到13的时候,后面的数据是17,16在13和17之间,我们在13这一数据down到下一级,从下一级的13向后遍历1个数据就可以找到我们需要的数据16,这样的查找性能有个较大的提升.加上这样的索引层之后,相比遍历整张链表,需要遍历的数据减少.在效率上提升.

 3>可以建立多级索引来实现遍历的效率

           在上图的基础上,我们可以在第一级索引上每隔2个数据继续建立索引,叫第2级索引.,这要查找的话需要遍历的数据更加少了

总结:这种链表+索引的结构就叫做跳表,他比链表需要更多的存储空间,来存放索引结构,但是在查找效率上有大的提升,用到的思想还是空间来换取时间.根据调表的查询效率的时间复杂度是O(logn)

     4>跳表支持高效的动态插入和删除,时间复杂度是O(logn)

                   在单链表中,随机的插入删除的时间复杂度是O(1),,但是只要保证链表的有序性,单链表的插入和删除的时间复杂度也会变为O(n),但是基于这种跳表的结构就不会,在插入的时候,更跳表的查找思路是一样的,所以时间复杂度为O(logn)

                  现在来看看跳表的删除:如果删除的数据在原始链表中,删除即可,如果同时在索引和原始链表中,我们既要删除原始链表的数据又要删除索引中的数据,.

      

      总结:跳表的插入过程:遍历第3级索引:6在1和13之间,down到第2级索引,遍历第2级索引,6在1和7之间,down到第一级索引,遍历第一级索引,6在4和7之间,从4 down到原始链表进行遍历,将6插入到相应的位置.

  4>跳表结构带来的弊端

              当我们很频繁的往跳表中增加删除元素,我们会发现,2个索引之间的数据过多,容易退化成单链表

基于这种情况,

我们会生成一个随机数字 k,决定这个数据在原始链表中存在,且在第k级索引中建立该数据的索引,这样能大大的避免2节点之间的数据过多而退化成单链表的数据结构

     

 

这节课的总结:基于有序链表我们也能实现快速的查找操作,且可以支持频繁的插入删除操作,这种数据结构是跳表,查找,删除,增加的时间复杂度是O(logn),它是一种动态的数据结构.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值