如数组的二分查找,链表中逐渐缩小查找区域,来查询目标数据。git
在单链表中查找数据,即便有序,因为指针方向也只能从头至尾遍历链表。如何进行优化,让查找次数减小呢? —— 跳表 github
若是再创建一层:数组
若是在数据量比较大的状况,在链表中查找的效率会明显提高。优化
这种在链表上加多级索引的结构,就是跳表。查找到过程就是一个逐渐缩小范围的过程。3d
时间复杂: 每层结点数m = n/(2^k); // 每两个结点抽出一层 假设有k级,最高级索引有两个结点。那么有n个数据求层级数: n/(2^k) = 2; k = log2n-1。若是每一个层级都要遍历m个结点,则总的时间复杂度O(m*logn)。 由于每两个结点抽出一层,所以一个范围内最多也就3个结点,m=3。时间复杂度O(logn)指针
空间复杂度:cdn
等比数列求和O(n),m大一些,空间复杂度会更加下降。同时,实际开发中索引层级中的节点只须要存储须要进行比较的关键值和指针就行,相比于数据节点的对象来讲,索引额外占用的空间能够忽略掉了。对象
插入: blog
删除: 注意:当删除节点的同时,索引也要删除。还要找到前驱结点。索引
索引表添加节点