跳表
如数组的二分查找,链表中逐渐缩小查找区域,来查询目标数据。
在单链表中查找数据,即使有序,由于指针方向也只能从头到尾遍历链表。如何进行优化,让查找次数减少呢? —— 跳表
如果再建立一层:
如果在数据量比较大的情况,在链表中查找的效率会明显提升。
这种在链表上加多级索引的结构,就是跳表。查找到过程就是一个逐渐缩小范围的过程。
时间复杂: 每层结点数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大一些,空间复杂度会更加降低。同时,实际开发中索引层级中的节点只需要存储需要进行比较的关键值和指针就行,相比于数据节点的对象来说,索引额外占用的空间可以忽略掉了。
插入删除
插入:
删除: 注意:当删除节点的同时,索引也要删除。还要找到前驱结点。
跳表索引动态更新
索引表添加节点