我一直在寻找针对任意索引优化的列表数据结构,但我没有找到很多关于这个问题的信息,除了一些有趣的二叉树和很多痛苦的数组操作。
二叉树很有用,但我认为通用列表更适合此目的。无论如何,我不知道为什么它们不像树木那样被广泛使用。
然而,广义列表本身并不足以实现列表:它们必须具有可以保持它们清晰的属性,而不是在随机插入后在许多子列表中退化。
我建议这个属性:广义列表不能有与其包含列表相同或更多项目的子列表。如果违反了这个属性,如果我们将子列表的元素溢出到父列表中,它可以被恢复。
例如(1 2 3 (4 5 7 (9 1) 0))是“不稳定的”,因为它的子列表比其父列表具有更多的“槽”(不递归计算元素)。可以使用先前提出的属性将其重写为(1 2 3 4 5 7 (9 1) 0) 。
此外,新元素将创建新的子列表,而不是直接添加到父列表中。例如:
如果一个新元素“x”被添加到索引 1
(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)
我的问题是:以前是否已经描述过这种数据结构?我的意思是,我认为它真的很有用,而且几乎是微不足道的。如果它以前存在,为什么不那么为人所知? 真的有用吗?它有名字吗?我确实认为它很有用,但我可能错了。
我以持久的方式实现了它,但是我的代码(Java)有点混乱和丑陋,尽管它似乎可以工作并且它也被记录在案。你怎么看?