c - 寻找算法以在位集中找到 n 个未设置的位

标签 c algorithm

背景: 我正在编写一个分配 4KiB block 的物理内存分配器。它使用一个位集来标记哪些 4KiB 内存块已被使用。我没有可用的标准 C 库。

问题: 我正在寻找一种算法,它会在最小的间隙中找到 n 个连续的未设置位,这样我就可以留下最大的未设置位可用间隙。

例子: 假设一个位集包含以下位:

 0010 0000 0111 0001 1100 0011

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

最佳答案

我认为你可以分 2 次完成:

第 1 关:
扫描数组,注意连续零位的数量,以及这些位的开头。

根据您的示例,扫描将产生:

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

第 2 轮:
扫描第 1 遍的数据,寻找目标值 (4),或大于目标的最小值。

用 C 编写这两个过程似乎微不足道,这应该是适用于所有情况的通用解决方案。

在您完成这项工作后,我还看到了一些优化,因此在某些情况下您可能根本不需要运行第 2 次传递。

关于c - 寻找算法以在位集中找到 n 个未设置的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131244/

相关文章:

c - N Queens Puzzle - 此解决方案中的回溯在哪里?

.net - 覆盖 GetHashCode 的最佳算法是什么?

c++ - 选择阶梯数组的骑士之旅回溯实现

c - Linux内核中wake_up_sync/wake_up_interruptible_sync的用途

c - 在循环中使用 scanf 处理 SIGINT

从 FORTRAN 调用 C 代码

java - 下水道设计的最佳路径

algorithm - 什么更大 : O(mn) OR O((m^2)/n)?

计算逆矩阵?

c - 如何在 C 中为 scanf 添加循环?