Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 链表的简单排序_Algorithm_Linked List_Language Agnostic - Fatal编程技术网

Algorithm 链表的简单排序

Algorithm 链表的简单排序,algorithm,linked-list,language-agnostic,Algorithm,Linked List,Language Agnostic,我想创建一个带有顺序序列(整数属性)的双链表,这样按顺序序列排序可以创建一个数组,该数组实际上相当于链表 given: a <-> b <-> c a.index > b.index b.index > c.index 给定:a b c a、 索引>b.index b、 索引>c索引 该索引需要有效地处理任意数量的插入 是否有一种已知的算法可以实现这一点? 问题是当列表变大,索引序列被压缩时。在这种情况下,必须对列表进行扫描以将松弛放回。 我只是不确定

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

given: a <-> b <-> c

a.index > b.index 
b.index > c.index
给定:a b c
a、 索引>b.index
b、 索引>c索引
该索引需要有效地处理任意数量的插入

是否有一种已知的算法可以实现这一点? 问题是当列表变大,索引序列被压缩时。在这种情况下,必须对列表进行扫描以将松弛放回。 我只是不确定这应该如何实现。理想情况下,会有某种自动平衡,以便这种借贷既快又少


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


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

这是我最喜欢的问题之一。在文献中,它被称为“在线列表标签”,或者只是“列表标签”。在维基百科这里有一点关于它:

对于您的目的来说,最简单的算法可能是这里的第一个算法:


它在摊销O(logn)时间内处理插入,要管理N个项目,必须使用足够大的整数来容纳N^2。64位整数在几乎所有实际情况下都是足够的。

这是我最喜欢的问题之一。在文献中,它被称为“在线列表标签”,或者只是“列表标签”。在维基百科这里有一点关于它:

对于您的目的来说,最简单的算法可能是这里的第一个算法:


它在摊销O(logn)时间内处理插入,要管理N个项目,必须使用足够大的整数来容纳N^2。64位整数在几乎所有实际情况下都是足够的。

我最终选择的是我自己的解决方案,因为它看起来像是算法希望在插入下一个节点之前将整个列表存储在内存中。这是不好的

我的想法是借用一些算法的想法。我所做的是做Ids INT和排序顺序longs。那么算法就是懒惰的,把条目塞进任何合适的地方。一旦某个地方的某个小簇空间用完,它就会开始从该簇上下扫描,并尝试建立一个均匀的间距,这样,如果扫描了n个项目,它们之间需要共享n^2个填充


理论上,这将意味着随着时间的推移,列表将被完全填充,并且考虑到我的ID是int,排序顺序是long,永远不会出现无法实现n^2填充的情况。我不能谈论运算次数的上限,但我的直觉告诉我,通过以1/多项式频率进行多项式运算,我会做得很好

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

我的想法是借用一些算法的想法。我所做的是做Ids INT和排序顺序longs。那么算法就是懒惰的,把条目塞进任何合适的地方。一旦某个地方的某个小簇空间用完,它就会开始从该簇上下扫描,并尝试建立一个均匀的间距,这样,如果扫描了n个项目,它们之间需要共享n^2个填充


理论上,这将意味着随着时间的推移,列表将被完全填充,并且考虑到我的ID是int,排序顺序是long,永远不会出现无法实现n^2填充的情况。我不能谈论运算次数的上限,但我的直觉告诉我,通过以1/多项式频率进行多项式运算,我会做得很好

为什么哦为什么链接列表?为什么不呢?增长/skrinking,O(log(N))操作没有问题。“将所有左或右索引更改为1以为插入腾出空间的天真解决方案是O(N)。”如果您真的坚持“dlinked paged解决方案”(无论出于何种原因),而不是将松弛分配到所有页面,您可以简单地拆分要插入但页面已达到填充因子的页面。如何将新项目插入到双链接列表中?它们是插在头上还是插在尾上?还是中间的任意位置?请注意,将项目插入到双链接列表的中间需要O(n),除非您要维护指向单个项目的指针,在这种情况下,维护这些额外的指针需要时间。奇怪地类似于以下问题:为什么-为什么-为什么-为什么-链接列表?为什么不呢?增长/skrinking,O(log(N))操作没有问题。“将所有左或右索引更改为1以为插入腾出空间的天真解决方案是O(N)。”如果您真的坚持“dlinked paged解决方案”(无论出于何种原因),而不是将松弛分配到所有页面,您可以简单地拆分要插入但页面已达到填充因子的页面。如何将新项目插入到双链接列表中?它们是插在头上还是插在尾上?还是中间的任意位置?请注意,将项目插入到双链接列表的中间需要O(n),除非您要维护指向单个项目的指针,否则维护这些额外的指针将需要时间。奇怪的是,类似于以下问题:谢谢大家,这看起来真的很酷。实现起来应该不会太难。只是想为所有的.net开发人员补充一下,获取此算法的nuget package manager命令是:安装软件包C5谢谢,这看起来真的很酷。实现起来应该不会太难。只是想为所有的.net开发人员补充一下,获取此算法的nuget package manager命令是:Install package C5