学习笔记|数据结构——跳表

学习笔记|数据结构——跳表

跳表:链表加多级索引的动态数据结构
插入、删除、查找时间复杂度:O(logn)
空间复杂度:O(n)
思想:空间换时间,对链表建议一级索引,每n个节点提取一个节点到上一级,把抽出来的那一级叫做索引层,通过down指针指向下一级结点
学习笔记|数据结构——跳表_第1张图片
举例:比如要查找节点10,现在索引层遍历,当遍历到索引层值为9的节点时,下一个节点是13,那要查找的元素在下一层中,通过forwards[–i]跳到下一层,继续遍历,直到找到10。
某种意义上也是分治分区思想,先将链表分成几个大区,通过一次次筛选区,达到最终查找元素的目的。
当链表的长度很大时,比如1千、1万时,在构建索引之后,查找效率的提升巨大
时间复杂度分析
假设每两个节点抽出一个节点作为上一级索引的节点,那第一级索引的节点个数是n/2,第二级是n/4,依次类推,第k级索引节点的个数就是n/(2k)
假设索引有h层,最高一级的索引有2个节点。通过公式可得到 n/(2h)=2,求解得h=logn-1。如果包含原始链表这一层,整个跳表得高度就是logn,如果每一层都要遍历m个节点,那查询一个数据得时间复杂度就是O(m*logn),其中m取决于你是几个节点提取一个节点到上级索引层得,是一个常数,因此查找的时间复杂度就是O(logn)
空间复杂度分析
跳表的所有节点总和是一个等比数列求和,sum=n-2,因此跳表的空间复杂度是O(n)
在实际软件开发中,原始链表中存储的可能是很大的对象,而索引节点只需要存储关键值和几个指针,并不需要存储对象,所以当对象比索引大很多时,那索引占用的额外空间就可以忽略了
插入和删除操作
详细思想见代码
代码地址
学习笔记|数据结构——跳表_第2张图片
跳表索引动态更新:如果链表中节点多了,索引节点就要相应的增加,以维护索引和原始链表大小之间的平衡。尤其是插入时,需要通过一个随机函数,决定将这个节点插入到哪几级索引中,比如随机函数生成了值K,我们就将这个节点添加到第一级到第K级这K级索引中,保证跳表的索引大小和数据大小平衡性

你可能感兴趣的:(数据结构学习笔记,数据结构,java,算法,链表)