数据结构与算法-学习笔记(13)

跳表

如数组的二分查找,链表中逐渐缩小查找区域,来查询目标数据。

在单链表中查找数据,即使有序,由于指针方向也只能从头到尾遍历链表。如何进行优化,让查找次数减少呢? —— 跳表

如图,给链表建立一级索引层

这样我们查找某个节点可以现在第一级查找出大致范围,在逐渐缩小范围,减少了查找次数。

如果再建立一层:

查找次数再次减少。

如果在数据量比较大的情况,在链表中查找的效率会明显提升。

这种在链表上加多级索引的结构,就是跳表。查找到过程就是一个逐渐缩小范围的过程。

时间复杂: 每层结点数m = n/(2^k); // 每两个结点抽出一层 假设有k级,最高级索引有两个结点。那么有n个数据求层级数: n/(2^k) = 2; k = log2n-1。如果每个层级都要遍历m个结点,则总的时间复杂度O(m*logn)。 因为每两个结点抽出一层,因此一个范围内最多也就3个结点,m=3。时间复杂度O(logn)

空间复杂度:

等比数列求和O(n),m大一些,空间复杂度会更加降低。同时,实际开发中索引层级中的节点只需要存储需要进行比较的关键值和指针就行,相比于数据节点的对象来说,索引额外占用的空间可以忽略掉了。

插入删除

插入:

时间复杂度:查找位置+插入 O(logn)

删除: 注意:当删除节点的同时,索引也要删除。还要找到前驱结点。

跳表索引动态更新

索引表添加节点

代码: github.com/wangzheng08…

转载于:https://juejin.im/post/5bee7526e51d4553f42705f4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值