Algorithm 可通过插入顺序和数量级进行遍历的数据结构

Algorithm 可通过插入顺序和数量级进行遍历的数据结构,algorithm,sorted,inorder,Algorithm,Sorted,Inorder,是否有一个数据结构可以以O(n)的插入顺序和数量级进行遍历,最多可以插入和删除O(log(n)) 换句话说,给定元素5、1、4、3、2(按此顺序插入),它可以作为1,2,3,4,5或作为5,1,4,3,2在O(n)时间内遍历 当然,我可以使用数组并在遍历之前对其进行简单排序,但这需要一个O(n*log(n))预遍历步骤。此外,我可以使用一个多链接列表来实现O(n)遍历,但是在这种情况下,插入和删除操作也需要O(n),因为我不能保证最新的元素必然是最大的 如果存在这样一个数据结构,请为我提供一个正

是否有一个数据结构可以以O(n)的插入顺序和数量级进行遍历,最多可以插入和删除O(log(n))

换句话说,给定元素5、1、4、3、2(按此顺序插入),它可以作为
1,2,3,4,5
或作为
5,1,4,3,2
在O(n)时间内遍历

当然,我可以使用数组并在遍历之前对其进行简单排序,但这需要一个O(n*log(n))预遍历步骤。此外,我可以使用一个多链接列表来实现O(n)遍历,但是在这种情况下,插入和删除操作也需要O(n),因为我不能保证最新的元素必然是最大的

如果存在这样一个数据结构,请为我提供一个正式的名称,以便我可以进一步研究它,或者如果它没有,一个简短的表面级描述将不胜感激


谢谢

评论者是对的:您最好将对象存储两次:一次在链表中(插入顺序),一次在二叉树中(内在排序顺序)


这并不像听起来那么糟糕,因为您不必复制对象,因此唯一的成本是列表/树支架,这将花费您存储的每个对象4个机器字。

评论者是对的:您最好将对象存储两次:一次在链接列表(插入顺序)中,一次在二叉树中(内在排序顺序)


这并不像听起来那么糟糕,因为您不必复制对象,因此唯一的成本是列表/树支架,这将为您存储的每个对象花费4个机器字。

一个允许次线性删除的解决方案是构建一个数据结构
D
,该结构使用链表
D.L
进行中的遍历插入顺序,以及按数量级遍历的排序树
D.T
。但如何链接它们以在次线性时间内额外实现删除操作?诀窍在于
D.T
不应存储值,而应仅存储
D.L
中对应链表元素的引用

插入:在时间O(1)中附加到
D.L
,并在时间O(log(n))中将附加元素的引用插入到
D.T
。当然,
D.T
中的任何比较都是根据引用值进行的,而不是通过引用本身进行的)

按插入顺序(或向后)遍历:只需在时间O(n)内以线性方式遍历
D.L

按数量级(或向后)遍历:只需通过树行走在时间O(n)内遍历
D.T


删除:首先在时间O(log n)中查找并删除
D.T
中的元素,这也为您提供了进入
D.L
的正确元素引用,因此它可以在时间O(1)中从
D.L
中删除.

允许次线性删除的一个解决方案是构建一个数据结构
D
,它使用链表
D.L
按插入顺序进行遍历,使用排序树
D.T
按数量级进行遍历。但如何将它们链接起来,以在次线性时间内额外实现移除操作?诀窍在于
D.T
不应存储值,而应仅存储对
D.L
中相应链表元素的引用

插入:在时间O(1)中追加到
D.L
,并在时间O(log(n))中将追加元素的引用插入到
D.T
。当然,
D.T
中的任何比较都是根据参考值进行的,而不是参考值本身)

按插入顺序(或向后)遍历:只需在时间O(n)内以线性方式遍历
D.L

按数量级(或向后)遍历:只需通过树行走在时间O(n)内遍历
D.T


删除:首先在时间O(logn)中找到并删除
D.T
中的元素,这也为您提供了对
D.L
的正确元素引用,因此它可以在时间O(1)中从
D.L
中删除。

您甚至不需要两个数据结构。只需使用二叉树,而不是插入对象,将其包装在一个对象中,该对象还包含指向上一个和下一个对象的指针。这在主流语言(如java)中非常简单,在java中,您可以使用默认的树实现和比较器来按属性对树进行排序


只要保留对第一个和最后一个元素的引用,就可以使用对象的内部指针按顺序遍历它们。

甚至不需要两个数据结构。只需使用二叉树,而不是插入对象,将其包装在一个对象中,该对象还包含指向上一个和下一个对象的指针。这在主流语言(如java)中非常简单,在java中,您可以使用默认的树实现和比较器来按属性对树进行排序


只要保留对第一个和最后一个元素的引用,就可以使用对象的内部指针按顺序遍历它们。

列表+二进制搜索树如何?如果存在这样的结构,我会感到惊讶。例如,你当然可以简单地构建两个排序树,或者一个排序树和一个链表。@DavidEisenstat是的,我是按照同样的思路思考的,但我不确定如何将它们连接起来,以便当我从一个元素中删除一个元素时,它也会在sub-O(n)时间内从另一个元素中删除。@G.Bach Me,但我想我会问以防万一。树和列表组合实际上可能会工作,但我需要注意如何链接元素。列表+二进制搜索树呢?如果存在这样的结构,我会感到惊讶。例如,您当然可以简单地构建两个排序树,或者一个排序树和一个链表。@DavidEisenstat是的,我是按照同样的思路思考的,但我不确定如何将它们连接起来,以便当我从一个元素中删除一个元素时,它将从子元素中的另一个元素中删除