集团新闻

保存脏数据时如何合并区间并计算对齐开销:4字节块的七组脏区间合并·实例03


回放或地图编辑可能只改动缓冲区中的几段字节。先把重叠或相邻区间合并可以避免重复写;若底层按整块保存,还需要区分真实修改量与对齐后涉及的量。

下面把一个游戏界面或模拟规则拆成可复查的记录。每组输入独立给出,先确认单位、先后次序和边界,再核对结果。它不依赖具体游戏的隐藏参数,读者可以直接挑选几步手工复算。

输入与规则

缓冲区有六十四个字节,区间用开始包含、结束排除表示。每组五个修改区间,合并重叠和首尾相接的区间,再按给定块大小覆盖所有涉及块。未修改但位于覆盖块内的字节算对齐开销。

缓冲区64字节,块大小4,所有区间左闭右开

逐步记录

第1组修改区间[[3, 6], [9, 11], [52, 60], [47, 48], [5, 7]],合并后[[3, 7], [9, 11], [47, 48], [52, 60]],实际修改15字节。涉及块编号[0, 1, 2, 11, 13, 14],整块覆盖24字节,对齐额外覆盖9字节;重叠部分没有重复计算。

第2组修改区间[[11, 14], [41, 46], [6, 13], [28, 32], [44, 51]],合并后[[6, 14], [28, 32], [41, 51]],实际修改22字节。涉及块编号[1, 2, 3, 7, 10, 11, 12],整块覆盖28字节,对齐额外覆盖6字节;重叠部分没有重复计算。

第3组修改区间[[12, 17], [10, 17], [8, 10], [50, 51], [9, 13]],合并后[[8, 17], [50, 51]],实际修改10字节。涉及块编号[2, 3, 4, 12],整块覆盖16字节,对齐额外覆盖6字节;重叠部分没有重复计算。

第4组修改区间[[44, 47], [17, 22], [38, 45], [40, 43], [18, 23]],合并后[[17, 23], [38, 47]],实际修改15字节。涉及块编号[4, 5, 9, 10, 11],整块覆盖20字节,对齐额外覆盖5字节;重叠部分没有重复计算。

第5组修改区间[[29, 30], [55, 63], [27, 33], [48, 51], [1, 8]],合并后[[1, 8], [27, 33], [48, 51], [55, 63]],实际修改24字节。涉及块编号[0, 1, 6, 7, 8, 12, 13, 14, 15],整块覆盖36字节,对齐额外覆盖12字节;重叠部分没有重复计算。

第6组修改区间[[28, 33], [47, 53], [21, 25], [13, 14], [35, 40]],合并后[[13, 14], [21, 25], [28, 33], [35, 40], [47, 53]],实际修改21字节。涉及块编号[3, 5, 6, 7, 8, 9, 11, 12, 13],整块覆盖36字节,对齐额外覆盖15字节;重叠部分没有重复计算。

第7组修改区间[[25, 33], [46, 49], [35, 40], [18, 24], [11, 14]],合并后[[11, 14], [18, 24], [25, 33], [35, 40], [46, 49]],实际修改25字节。涉及块编号[2, 3, 4, 5, 6, 7, 8, 9, 11, 12],整块覆盖40字节,对齐额外覆盖15字节;重叠部分没有重复计算。

合并区间保留原修改集合,整块对齐可能覆盖更多字节;两者不能作为同一个数量报告。

复核方法和适用范围

不用区间合并,直接枚举原区间里的每个字节形成集合;它应等于合并区间覆盖集合。再把每个修改字节映射到所在块,独立计算覆盖块和总字节数,重叠部分只能计一次。

这只是内存区域的教学记录,不执行文件写入。实际存储设备可能还有其他粒度和元数据开销,因此本例的字节差不能当作真实磁盘写入量。空区间和越界区间不在本例输入中。

练习时可以只改动一项输入,预测从哪一步开始出现变化,再逐步比较。空状态、数值零和无法判断要分别记录;不要为了让最后结果一致而忽略中途的偏差。边界与同分约定同样属于规则,复核时应一并保留。