背景:
我正在写一个物理内存分配器,它分配4kib块。它使用一个位集来标记已经使用了哪些4KiB内存块我没有可用的标准C库。
问题:
我正在寻找一个算法,它将找到N个连续的未设置位,在最小的间隙,这样我可以留下最大的未设置位的间隙可用。
例子:
假设一个位集包含以下位:

 0010 0000 0111 0001 1100 0011

如果我想设置4位,算法应该返回第18位。

最佳答案

我想你可以两次传球:
通过1:
扫描阵列,记录连续零位的数量,以及这些位的开始。
根据您的示例,扫描将生成:

2 bits, starting at 0
6 bits, starting at 3
3 bits, starting at 12
4 bits, starting at 18

通过2:
扫描pass 1中的数据,查找目标值(4)或大于目标值的最小值。
用C编写这两个过程似乎都很简单,而且这应该是在所有情况下都有效的通用解决方案。
在您完成这项工作之后,我还看到了一些优化,以便在某些情况下您可能根本不必运行pass 2。

08-16 20:15