高效查找应用了数据修改堆栈的缓冲区
Efficient lookup of a buffer with stack of data modifications applied
我正在尝试编写一个 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 - 或者根据这些术语进行网络搜索。我认为你可以用一棵持久的树来做到这一点,它的叶子带有短弦。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 绕过堆栈护罩缓冲区溢出
- 如何在堆栈上对齐缓冲区
- 如何在Windows上报告堆栈缓冲区溢出
- 0x00363A09处出现未处理的异常,堆栈cookie检测代码检测到基于堆栈的缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- 从缓冲区指针计算堆栈中的返回地址
- 在堆栈和堆上使用较低级别的方法获取缓冲区的长度
- 高效查找应用了数据修改堆栈的缓冲区
- 基于堆栈的缓冲区溢出
- 将ptr返回到堆栈缓冲区