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

时间:2016-01-17 01:09:45

标签: c++ algorithm buffer undo

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

我目前的做法是:

  • 维护一个有序的更改列表,按更改开始的偏移量排序
  • 同时维护一堆相同的更改,以便按顺序回滚
  • 新的更改被压入堆栈并插入到正确位置的列表中
  • 如果更改与其他人进行交互,则可以修改按偏移量更改列表
    • 例如,字节5-10的修改使早期修改的开始从8-12
    • 无效
    • 此外,插入或删除更改将改变它们之后发生的数据的明显偏移(删除字节5-10表示以前在15处发现的是字节20)
  • 要查找已修改的数据,您可以查看适用的更改列表(以及适用的更改中的偏移量 - 另一个更改可能使其中的某些更改无效),或者在原始数据中找到正确的偏移量没有变化触及那个偏移
    • 这里的目的是快速进行查找 - 添加更改可能需要花费一些精力来处理列表,但稍后查找,这将大大超出修改,在一个有序列表中应该非常简单。
    • 此外,您不需要连续复制数据 - 每个更改的数据都保留在原始数据中,原始数据不受影响
  • 然后通过弹出堆栈的最后一次更改并回滚此更改添加对其所做的任何更改来实现撤消。

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

我确信这一定是其他软件中已经处理过的问题,但是查看各种十六进制编辑器等等并没有指出我有用的实现。是否有这个问题的名称(“数据撤销堆栈”,朋友们没有让我走得太远!),或者可以使用的库,甚至可以作为参考,用于此类事情?

2 个答案:

答案 0 :(得分:1)

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

这比尝试识别数据的哪些部分发生变化要容易得多,除非操作本身非常耗时(因此“重放”到原始状态的速度很慢),因此效果很好。

答案 1 :(得分:1)

我会根据这些术语来查看持久性数据结构,例如https://en.wikipedia.org/wiki/Persistent_data_structurehttp://www.toves.org/books/persist/#s2 - 或websearch。我认为你可以用一个持久的树来做这件事,树的叶子带有短的字符串。