极客时间课程《数据结构与算法之美》笔记09

跳表

对链表改造一波,可以支持类似“二分”的查找算法,改造成跳表。
快速的插入删除查找,有些时候可以替代红黑树。
核心思想是对链表建立一层索引(比如隔两个结点提取一个结点到上一级),减少遍历节点的数目。
进阶思想是再加一层索引。
链表加多级索引的结构,就是跳表。
我的感觉思想比较接近向上生长的二叉树。

跳表查询的时间复杂度就是O (logn) ,空间换时间。每一层最多遍历m个结点,m数量跟索引规则有关。(隔一个结点取索引的话,m就是3)
虽然占用空间有点多,空间复杂度为O (n) ,但是实际开发中,原始链表的存储可能很大,而索引仅仅是存储关键值和几个指针。新占用的空间和原始数据相比可以忽略。

高效动态插入删除

复杂度也是O (logn) ,仅仅是定位到插入的位置需要复杂度,单个的插入操作的时间复杂度是O(1)。

常常插入和删除之后,需要动态更新索引,要不然会退化成为单链表。

往跳表中插入数据的时候,可以选择同时将这个数据插入到部分索引层中,通过一个随机函数,决定将这个节点插入到哪几级索引中。比如生成K,则将此结点一次添加到第一级到第K级这K级索引中。

原文地址:https://www.cnblogs.com/JackKing-defier/p/11155512.html