Answers:
最明显的候选者是持久性平衡二叉树。您列出的所有操作都可以使用路径复制在或时间内执行。有关如何实现此运行时的更多详细信息,请参阅下面引用的Chris Okasaki的书或此处的答案。
当然,作为一种变体,这样一棵树的每个叶子本身可以包含一个不可变的数组(连续值的序列)。这会使更新值的效率降低,但是,如果您从不打算修改现有值,只需追加和前置,就可以很好地适应您的情况。这样,您的向量就表示为不可变序列的序列,表示为叶子中具有不可变数组的平衡二叉树。这样可以实现快速索引(叶数为对数),快速追加和前置以及快速迭代。最坏情况下的渐进复杂度并没有改善,但实际上性能可能会明显改善。
标准参考是Chris Okasaki的1998年著作“纯函数数据结构”。
也可以看看
我在有关增量正则表达式匹配的文章中描述了这种数据结构的一种实现-请参见http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation以及该节上下的文字。
它是各种高度恒定的树(例如B树或2-3树)。基本上是一棵(2,3)树,其叶子是(N,2N-1)个数组,以避免每个元素的开销。(一个(N,2N-1)数组是一个长度在N..2N-1范围内的数组。)N越大,开销越小,但线性增加了拆分和级联的复杂性。索引,拆分和连接之类的操作与它们在2-3棵树中的工作方式非常相似,在叶级别上一般化为(N,2N-1)。