【问题标题】:How to track changes to a list如何跟踪对列表的更改
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多