如何跟踪列表的更改

时间:2015-09-10 03:44:01

标签: c++ algorithm list dictionary vector

我有一个不可变的项目列表,我想对其执行许多操作:编辑,添加,删除,读取。实际操作将排队并在其他地方执行(发送到服务器并将向下发送新列表),但我希望表示列表在应用于基本列表的当前操作集时的样子。

我当前的实现保留了范围向量和它们映射到的位置。因此,未编辑的列表具有从0到长度的一个范围,该范围直接映射到基本列表。如果在索引5中执行添加,则我们有3个范围:0-4映射到基本列表0-4。 5映射到新项目,6-(长度+ 1)映射到5长度。这有效,但是有很多添加和删除,读取会降级为O(n)。

我曾考虑使用散列图,但插入和删除时可能出现的范围变化带来了挑战。有没有办法实现这一点,以便读取仍然在O(1)附近?

1 个答案:

答案 0 :(得分:0)

如果你有一个大致平衡的范围树,每个节点都保留了树中它下面元素总数的记录,你可以在最坏的情况下回答树的深度,这应该是关于日志的(N)。也许https://en.wikipedia.org/wiki/Treap可能是为此实现的更容易平衡的树之一。

如果您有大量的重复读取和少量修改,您可能会通过保留自上次修改后读取结果的散列图,并在修改时清除它来获得。