【发布时间】:2012-09-24 15:44:49
【问题描述】:
我有一组范围,例如 {(2-8)、(13-22)、(380-7931)、(40032-63278)}。为简单起见,我们可以假设它们不重叠(重叠范围已经合并)。
我的目标是使用一组给定的“长度”组合来“覆盖”这些范围,例如 {4,64,1024,16384}。我被限制使用最多 N 个长度,例如 N=32。我不在乎我使用了多少“长度”,只要我低于我的最大值,但我想最小化总“额外”区域 - 由不在初始范围集中的长度“覆盖”的数字。
由 (2-66) 覆盖的示例 {(2-8)}(使用长度为 64)有 58 个“额外”数字。 {(2-6), (6-10)} 覆盖的 {(2-8)} (两个长度为 4)只有 2 个“额外”数字,是可取的。
我的实际应用程序涉及对固定的 MMU TLB 进行预编程,以确保只能访问特定范围的内存地址(TLB 未命中因此表示禁止访问并且可以相应地处理)。我想尽可能紧密地覆盖范围,以便尽早发现违规行为,但我只有 32 个插槽和 4 个固定页面大小。我可以手动将我的代码调整到足够的性能水平,但我很好奇是否有更优雅/通用的解决方案来解决这个问题。它似乎与背包问题有关,但差异很大,很难搜索。
【问题讨论】: