为啥不使用指针数组来优化链表而使用跳过列表呢?

Posted

技术标签:

【中文标题】为啥不使用指针数组来优化链表而使用跳过列表呢?【英文标题】:Why not use an array of pointers to optimize linked list but use skip list?为什么不使用指针数组来优化链表而使用跳过列表呢? 【发布时间】:2020-07-01 14:03:32 【问题描述】:

最近我在学习跳过列表,我了解到它旨在加快链表的查找速度。但我想知道为什么不使用基于链表结构添加所有节点指针数组的数据结构?对于2^n节点的列表,如果每一层我们有下一层的指针数量的一半,我们将添加2^n-1 ponters,这几乎与添加每个节点的指针列表的数量相同,并且在同时按索引访问是 O(1)。

不执行我的想法肯定有一些原因,谁能告诉我?

【问题讨论】:

当新元素出现时你会更新指针数组(基本上是标准数组)吗? 为什么您认为您提出的数据结构允许在 O(1) 时间内进行随机访问? 这个想法类似于数据库,它们通常按主键排序,但具有层级键数组以加快键值搜索。例如,用于记录每 256 条记录的索引映射的第一级键。对于每 256 个一级条目,一级索引可能有一个二级键。根据数据库的大小,可能还有第三个级别。跳过列表是一个类似的想法,你可以有一个跳过列表到一个跳过列表到一个链接列表。 您能否详细说明一下这些数组是什么以及它们如何表示? @kaya3 如果要访问第n个节点,只要访问数组的第n个元素就可以得到它的指针 【参考方案1】:

跳过列表提供O(log(n)) 的平均性能来读取、插入、更新和删除任何索引处的元素。

您的指针数组想法为相同的操作提供了O(1)O(n)O(1)O(n) 的平均性能。诚然,O(n) 操作有一个很好的常数,但这仍然是它的扩展方式。

这两种数据结构都在实践中使用。它们只是用于不同的情况。

【讨论】:

谢谢,刚查了一下添加元素时重建索引的机制,发现是O(log(n))。你能举一个实际使用的指针数组的例子吗? 指针数组被到处使用。举一个完全随机的例子,docs.huihoo.com/doxygen/linux/kernel/3.7/fdtable_8h_source.html 的第 26 行声明fd_table 中的fd 是一个指向文件描述符对象指针数组的指针。

以上是关于为啥不使用指针数组来优化链表而使用跳过列表呢?的主要内容,如果未能解决你的问题,请参考以下文章

我找不到我的链表的错误(为啥我的头指针在移动?)

为啥链表使用指针而不是在节点内存储节点

为啥宁愿使用指向结构的指针而不是链表中的常规结构类型变量?

动态分配的指向结构(链表)的指针数组,以及如何访问每个列表?

用数组代替指针实现静态链表

结构中的指针分配不工作,为啥值没有改变?