我正在寻找在任何索引上针对任意插入优化的列表数据结构,但我没有找到关于此问题的大量信息,除了一些有趣的二叉树和很多痛苦的阵列操作。
二叉树很有用,但我认为广义列表更适合这个目的。我不知道为什么它们不像树木一样广泛使用。
但是,广义列表本身并不足以实现列表:它们必须具有可以保持清晰的属性,而不是在随机插入后的许多子列表中退化。
我建议使用:广义列表不能包含与其包含列表相同或更多项目的子列表。如果这个属性是 如果我们泄漏子列表的元素,它就可以恢复 在父列表中。
例如(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)
我的问题是这些:之前是否已经描述过这些数据结构了吗?我的意思是,我认为它非常有用,而且几乎是琐碎。如果以前存在,为什么不这么知道呢? 它真的有用吗?它有名字吗?我觉得它很有用,但我可能错了。
我implemented it in a persistent fashion,但我的代码(Java)有点混乱和丑陋,虽然它似乎有用,但它也有记录。你觉得怎么样?