algorithm - 链表的简单排序

标签 algorithm linked-list language-agnostic

我想创建一个带有顺序序列(整数属性)的双向链表,这样按顺序排序可以创建一个实际上等同于链表的数组。

given: a <-> b <-> c

a.index > b.index 
b.index > c.index

该索引需要有效地处理任意数量的插入。

是否有已知的算法来完成此操作? 问题是当列表变大并且索引序列变得紧凑时。在那种情况下,必须扫描列表以恢复松弛。 我只是不确定这应该如何完成。理想情况下会有某种自动平衡,以便这种借贷既快速又罕见。

将所有左索引或右索引更改为 1 以便为插入腾出空间的简单解决方案是 O(n)。

我更喜欢使用整数,因为我知道数字在 float 中的可靠性往往会降低,因为它们在大多数实现中接近零。

最佳答案

这是我最喜欢的问题之一。在文献中,它被称为“在线列表标签”,或简称为“列表标签”。维基百科上有一点:https://en.wikipedia.org/wiki/Order-maintenance_problem#List-labeling

可能对您的目的实用的最简单的算法是这里的第一个:https://www.cs.cmu.edu/~sleator/papers/maintaining-order.pdf .

它以分摊的 O(log N) 时间处理插入,并且要管理 N 个项目,您必须使用大到足以容纳 N^2 的整数。几乎所有实际情况下,64 位整数都足够了。

关于algorithm - 链表的简单排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986849/

相关文章:

用于在进行选择时动态查找允许的子集的算法/数据结构

algorithm - 给定一个函数 rand7(),编写一个函数 rand10() 统一

c - 将节点添加到链表末尾的函数签名有问题

c++ - 双向链表 2 个值 C++

language-agnostic - 准确的MIME类型检测需要多少个字节?

algorithm - 经典(基于递归)深度优先搜索是否比基于堆栈的 DFS 的内存效率更高?

c# - 在 C# 2.0 中同步两个 IList 的最佳算法

创建链表并打印元素?

c# - 格式化逻辑属于 MVC 的什么地方?

algorithm - 如何用常数值填充二维数组,效率比 n^2 更高?