Java 一个新的列表数据结构优化了在任何地方插入?

Java 一个新的列表数据结构优化了在任何地方插入?,java,arrays,algorithm,data-structures,Java,Arrays,Algorithm,Data Structures,我在寻找一个列表数据结构,该结构针对任意索引的任意插入进行了优化,但除了一些有趣的二叉树和许多痛苦的数组操作之外,我没有找到关于这个问题的很多信息 二叉树是有用的,但我认为广义列表更适合这个目的。不管怎样,我不知道为什么它们不像树木那样被广泛使用 然而,一般化列表本身并不足以实现列表:它们必须具有一个属性,可以保持它们的清晰性,在随机插入后不会在许多子列表中退化 我提出了这个属性:一个通用列表的子列表不能有与其包含列表相同或更多的项。如果这个属性是 如果我们溢出子列表中的元素,就可以恢复它 在父

我在寻找一个列表数据结构,该结构针对任意索引的任意插入进行了优化,但除了一些有趣的二叉树和许多痛苦的数组操作之外,我没有找到关于这个问题的很多信息

二叉树是有用的,但我认为广义列表更适合这个目的。不管怎样,我不知道为什么它们不像树木那样被广泛使用

然而,一般化列表本身并不足以实现列表:它们必须具有一个属性,可以保持它们的清晰性,在随机插入后不会在许多子列表中退化

我提出了这个属性:一个通用列表的子列表不能有与其包含列表相同或更多的项。如果这个属性是 如果我们溢出子列表中的元素,就可以恢复它 在父列表中

例如,(1 2 3(4 5 7(9 1)0))是“不稳定的”,因为它的子列表的“槽”比其父列表多(不递归计算元素)。可以使用先前建议的属性将其重写为(1 2 3 4 5 7(9 1)0)

此外,新元素将创建新的子列表,而不是直接添加到父列表中。例如:

如果将新元素“x”添加到

(1 2 3 5)
那就是

(1 ("x" 2) 3 4)
如果将“y”添加到索引1中,则

(1 (("y" "x") 2) 3 4)
这是“不稳定的”,因此它将被转换为

(1 ("y" "x" 2) 3 4)
(1 "y" "x" 2 3 4)
这也是不稳定的,所以它会转化为

(1 ("y" "x" 2) 3 4)
(1 "y" "x" 2 3 4)
我的问题是:这个数据结构以前被描述过吗?我的意思是,我认为它真的很有用,而且它几乎是微不足道的。如果它以前存在过,为什么不那么为人所知它真的有用吗?它有名字吗?我确实认为这很有用,但我可能错了


我知道,但是我的代码(Java)有点凌乱和难看,尽管它似乎可以工作,而且也有文档记录。你觉得怎么样?

这听起来像是跳过列表:

我觉得这根本不像是跳过列表。跳过列表最好用作有序数据结构。OP讨论的是索引数据结构。跳过列表做得不好。@JimMischel在跳过列表中添加索引功能是一个技术细节:但我并不坚持OP的列表与跳过列表非常相似,因为坦率地说,我并不完全理解OP的想法。有趣。我必须阅读链接的PDF,看看如何处理插入。假设它是合理的,那么它肯定与OP的想法类似。OP的想法本质上是通过维护子列表来分摊顺序列表中插入的成本,但我不知道它如何有效地处理索引。跳过列表是不确定的。此数据结构是。@Josell有确定性跳过列表,请参阅Wikipedia文章中的参考文献。分摊插入数组的成本是一个有趣的想法,但在我看来,访问项目需要顺序搜索。当然,可能会跳过子列表,但例如,int数组实际上变成了子列表数组(它们本身就是子列表数组,等等),所以它实际上是一棵树。索引跳过列表(见下面的答案)可能会提供更好的性能和更小的内存占用。感谢您提供的信息!我希望有一天它会有用。