【问题标题】:Most efficient way to find the bit with 0 in an array of uint32_t在 uint32_t 数组中查找 0 位的最有效方法
【发布时间】:2022-06-10 21:30:28
【问题描述】:

我有一个 uint32_t 类型的数组,大小为 1024。

int32_t *handle_generator= calloc(1024, sizeof(uint32_t));

我将使用这个数组 handle_generator 来为特定类型的元素生成句柄 - myType_t。 当创建myType_t 的元素时,我必须从数组handle_generator 中找到第一位为零并返回该索引值。我将使用这个值作为我新创建的元素的句柄。

myType_t 类型的已创建元素也可以被销毁。在这种情况下,该被破坏元素的句柄值变得空闲并且可以重用。所以数组handle_generator(匹配那个句柄值)中的索引应该设置为0。

在多次创建和删除元素myType_t 后,数组handle_generator 中会出现一系列0 和1 位。 在这种情况下,找到第一个值为 0 的位的有效方法是什么?

最简单的方法是通过检查每个位来遍历数组handle_generator,其时间复杂度为0(n);其中 n 是位数。


例如,经过多次增删改查,如果handle_generator数组中的位如下

 0th                       13th
 |                         |
 v                         v
+-------------------------------------------------------------------------+
|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|...|0|0|0|
+-------------------------------------------------------------------------+

如果我们必须找到数组中的第一位 - handle_generator,其值为 0,那么它位于索引 13。那么解决这个问题的最有效算法是什么?

【问题讨论】:

    标签: arrays algorithm search bit-manipulation hashtable


    【解决方案1】:

    您有 1024 个字来制作 32768 位的位掩码。

    除此之外,我将使用 32 个字来制作位掩码,指示这 1024 个字中哪些是满的或未满的,然后用一个字来制作这 32 个字中哪些是满的位掩码.

    这只是额外的 33 个单词,但是你可以很快找到第一个 0 -- 使用顶级掩码找到第一个非完整的中级掩码,使用中级掩码找到第一个非完整词,然后找到该词中的第一个 0。

    当然,快速执行此操作需要快速找到在一个字中设置或清除的最低有效位的索引。这是一个共同的话题:Position of least significant bit that is set

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 2018-08-12
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2014-01-31
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多