链表的简单排序

时间:2016-12-06 02:29:37

标签: algorithm linked-list language-agnostic

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

given: a <-> b <-> c

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

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

是否有已知的算法来实现此目的? 问题是当列表变大并且索引序列已经打包时。在那种情况下,必须扫描列表以放松。 我只是不确定应该如何实现。理想情况下会有某种自动平衡,因此这种借贷既快又罕见。

将所有左或右的凹痕改变1以为插入物腾出空间的天真解决方案是O(n)。

我更喜欢使用整数,因为我知道数字在浮点数上往往不太可靠,因为在大多数实现中它们接近于零。

2 个答案:

答案 0 :(得分:0)

这是我最喜欢的问题之一。在文献中,它被称为&#34;在线列表标签&#34;或者只是&#34;列出标签&#34;。维基百科上有一点点: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位整数就足够了。

答案 1 :(得分:0)

我最后想要的是一个自己动手的解决方案,因为看起来算法想要在插入下一个节点之前将整个列表放在内存中。这不好。

我的想法是借用算法的一些想法。我做的是让Ids整理和排序多头。然后算法是懒惰的,在任何适合的地方填充条目。一旦它在一些小块的空间中耗尽,它就会开始从丛中上下扫描并尝试建立一个均匀的间距,这样如果有n个项被扫描,它们需要在它们之间共享n ^ 2个填充。

理论上这将意味着随着时间的推移,列表将被完美填充,并且鉴于我的ID是整数并且我的排序顺序很长,因此永远不会出现无法实现n ^ 2填充的情况。我不能说出操作次数的上限,但我的胆量告诉我,通过以1 /多项式频率进行多项式工作,我会做得很好。