回放或地图编辑可能只改动缓冲区中的几段字节。先把重叠或相邻区间合并可以避免重复写;若底层按整块保存,还需要区分真实修改量与对齐后涉及的量。
下面把一个游戏界面或模拟规则拆成可复查的记录。每组输入独立给出,先确认单位、先后次序和边界,再核对结果。它不依赖具体游戏的隐藏参数,读者可以直接挑选几步手工复算。
输入与规则
缓冲区有六十四个字节,区间用开始包含、结束排除表示。每组五个修改区间,合并重叠和首尾相接的区间,再按给定块大小覆盖所有涉及块。未修改但位于覆盖块内的字节算对齐开销。
缓冲区64字节,块大小8,所有区间左闭右开
逐步记录
第1组修改区间[[10, 12], [37, 39], [48, 50], [15, 23], [42, 46]],合并后[[10, 12], [15, 23], [37, 39], [42, 46], [48, 50]],实际修改18字节。涉及块编号[1, 2, 4, 5, 6],整块覆盖40字节,对齐额外覆盖22字节;重叠部分没有重复计算。
第2组修改区间[[21, 27], [45, 46], [4, 7], [40, 48], [35, 41]],合并后[[4, 7], [21, 27], [35, 48]],实际修改22字节。涉及块编号[0, 2, 3, 4, 5],整块覆盖40字节,对齐额外覆盖18字节;重叠部分没有重复计算。
第3组修改区间[[20, 28], [51, 54], [20, 22], [27, 28], [26, 31]],合并后[[20, 31], [51, 54]],实际修改14字节。涉及块编号[2, 3, 6],整块覆盖24字节,对齐额外覆盖10字节;重叠部分没有重复计算。
第4组修改区间[[46, 51], [2, 4], [1, 2], [53, 54], [7, 9]],合并后[[1, 4], [7, 9], [46, 51], [53, 54]],实际修改11字节。涉及块编号[0, 1, 5, 6],整块覆盖32字节,对齐额外覆盖21字节;重叠部分没有重复计算。
第5组修改区间[[47, 54], [5, 7], [31, 39], [46, 50], [39, 41]],合并后[[5, 7], [31, 41], [46, 54]],实际修改20字节。涉及块编号[0, 3, 4, 5, 6],整块覆盖40字节,对齐额外覆盖20字节;重叠部分没有重复计算。
第6组修改区间[[42, 45], [25, 30], [52, 59], [3, 7], [27, 35]],合并后[[3, 7], [25, 35], [42, 45], [52, 59]],实际修改24字节。涉及块编号[0, 3, 4, 5, 6, 7],整块覆盖48字节,对齐额外覆盖24字节;重叠部分没有重复计算。
第7组修改区间[[54, 61], [22, 28], [9, 16], [42, 48], [6, 11]],合并后[[6, 16], [22, 28], [42, 48], [54, 61]],实际修改29字节。涉及块编号[0, 1, 2, 3, 5, 6, 7],整块覆盖56字节,对齐额外覆盖27字节;重叠部分没有重复计算。
合并区间保留原修改集合,整块对齐可能覆盖更多字节;两者不能作为同一个数量报告。
复核方法和适用范围
不用区间合并,直接枚举原区间里的每个字节形成集合;它应等于合并区间覆盖集合。再把每个修改字节映射到所在块,独立计算覆盖块和总字节数,重叠部分只能计一次。
这只是内存区域的教学记录,不执行文件写入。实际存储设备可能还有其他粒度和元数据开销,因此本例的字节差不能当作真实磁盘写入量。空区间和越界区间不在本例输入中。
练习时可以只改动一项输入,预测从哪一步开始出现变化,再逐步比较。空状态、数值零和无法判断要分别记录;不要为了让最后结果一致而忽略中途的偏差。边界与同分约定同样属于规则,复核时应一并保留。
