【发布时间】:2015-12-06 04:53:36
【问题描述】:
我有一个不可变的基本项目列表,我想对其执行许多操作:编辑、添加、删除、读取。实际操作将排队并在其他地方执行(发送到服务器并向下发送一个新列表),但我想要表示当前一组操作应用于基本列表时列表的外观。
我当前的实现保留了一个范围向量以及它们映射到的位置。因此,未经编辑的列表具有从 0 到直接映射到基本列表的长度的一个范围。如果在索引 5 中执行添加,那么我们有 3 个范围:0-4 映射到基本列表 0-4。 5 映射到新项目,6-(length+1) 映射到 5-length。这是可行的,但是随着大量的添加和删除,读取会降级到 O(n)。
我曾考虑过使用哈希图,但插入和删除可能发生的范围变化带来了挑战。有没有办法实现这一点,使读取仍然在 O(1) 左右?
【问题讨论】:
-
如果原始列表是不可变的,你打算如何执行添加?
-
当您添加计算虚拟结果列表所需的操作时,您将无法避免性能下降。我对尽可能高效的解决方案感兴趣,因为我有类似的非破坏性编辑问题。
-
更改将应用到服务器上,我们稍后会获得更新版本。
-
那么为什么不只存储索引列表而不是范围呢?
-
这是我考虑过的一种可能性,但是每次都需要完整的 O(n) 内存空间。如果列表充满了数以万计的项目并且每帧更新,这可能会很昂贵。
标签: c++ algorithm list dictionary vector