漫谈数据结构——跳表空间复杂度效率分析

119 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

前言

在上一篇文章中我们分析了跳表的时间复杂度,因为跳表采用了建立多级索引的方式,带来的必定就是空间的消耗,那么今天我们就来分析一下跳表的空间复杂度以及它的基本操作的效率如何?

跳表空间复杂度效率分析

假设我们的原始链表的长度为n,按照我们之前的每两个结点抽取一个结点进入上级,那么我们一级索引就会有n/2结点,二级索引会有n/4结点,三级索引就会有n/8个结点。每上升一级的话,就会有减少一半的结点数,知道最后一级,只剩下2个结点。根据数值相加,形成一个等比序列。结点的总和就是n-2。由此可得跳表的空间复杂度就是O(n),也就是说,我们长度为n的链表去构建跳表,需要额外的n个结点的空间,但是只是理论上的值,假设我们每三个结点或者每六个结点抽取一层,由每三个结点抽取的公式可得结点的总和为n/2,对比两个结点的构建方式,虽然理论的空间复杂度是O(n),但是空间消耗减少了将近一半。因为我们在日常开发中,操作的一半都是对象,对象也是引用的方式,所以整个消耗的空间还是比较少的。除非真的是由该跳表代码产生性能瓶颈后,再去具体分析也不迟。

那么我们在跳表中插入一个数据会怎么样呢,其实这个问题马上就可以知道了,因为在单链表中,我们插入一个数据的话,是需要先去遍历链表查找对应的插入位置的,执行插入操作的话是O(1),但是查找操作的话是O(n),所以跳表上的插入操作的话就等同于跳表的查找效率的,时间复杂度就是O(logn)的,相应的删除操作的话,时间复杂度也是O(logn)的。

总结

跳表采用了以空间换取时间的思想来提供查询效率的,是一个非常优秀的数据结构的。