高效查找应用了数据修改堆栈的缓冲区

Efficient lookup of a buffer with stack of data modifications applied

本文关键字:堆栈 缓冲区 修改 数据 查找 应用 高效      更新时间:2023-10-16

我正在尝试编写一个 C++11 库作为更广泛项目的一部分,该项目实现了在原始缓冲区之上实现的更改堆栈(修改、插入和删除)。然后,目标是能够快速"浏览"更改并获取修改后的数据。

我目前的方法是:

    维护更改的
  • 有序列表,按更改开始的偏移量排序
  • 还要维护相同更改的堆栈,以便可以按顺序回滚它们
  • 新更改被推送到堆栈中,并插入到正确的位置
  • 如果更改与其他更改交互,则可能会修改偏移更改列表
    • 例如,对字节 5-10 的修改会使从 8-12 开始的早期修改无效
    • 此外,插入或删除更改将更改它们之后发生的数据的明显偏移量(删除字节 5-10 意味着过去是字节 20 的内容现在位于 15)
  • 要查找修改后的数据,您可以在列表中查找适用的更改(以及该更改中应用的偏移量 - 另一个更改可能使其中一些更改无效),或者如果没有更改触及该偏移量,则可以在原始数据中找到正确的偏移量
    • 这里的目的是使查找速度更快 - 添加更改可能需要一些努力来弄乱列表,但是稍后的查找(这将大大超过修改)在有序列表中应该非常简单。
    • 此外,您不需要连续复制数据 - 每个更改的数据都随之保留,原始数据保持不变
  • 然后,通过
  • 从堆栈中弹出最后一个更改并回滚此更改的添加对其所做的任何更改来实现撤消。

这似乎是一项相当艰巨的任务 - 有很多事情需要处理,我正在快速堆积复杂的代码!

我确信这一定是其他软件中已经处理过的问题,但是环顾各种十六进制编辑器等并没有为我指出有用的实现。这个问题有没有一个名字("数据撤消堆栈"和朋友并没有让我走得很远!),或者一个可以用于这种事情的库,甚至可以作为参考?

我相信最常见的方法(我过去成功使用过的方法)是简单地存储原始状态,然后将每个更改操作(正在执行的操作 + 参数)放在撤消堆栈上。然后,要达到特定的先前状态,您可以从原始状态开始并应用除要撤消的更改之外的所有更改。

这比尝试识别数据的哪些部分更改要容易得多,并且除非操作本身非常耗时(因此"重播"到原始状态很慢),否则它运行良好。

我会查看持久数据结构,例如 https://en.wikipedia.org/wiki/Persistent_data_structure 和 http://www.toves.org/books/persist/#s2 - 或者根据这些术语进行网络搜索。我认为你可以用一棵持久的树来做到这一点,它的叶子带有短弦。