簡體   English   中英

在 uint32_t 數組中查找 0 位的最有效方法

[英]Most efficient way to find the bit with 0 in an array of uint32_t

我有一個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 處。那么解決這個問題的最有效算法是什么?

您有 1024 個字來制作 32768 位的位掩碼。

除此之外,我將使用 32 個字來制作位掩碼,指示這 1024 個字中哪些是滿的或未滿的,然后用一個字來制作這 32 個字中哪些是滿的位掩碼。

這只是額外的 33 個單詞,但是這樣你可以很快找到第一個 0 -- 使用頂級掩碼找到第一個非完整的中級掩碼,使用中級掩碼找到第一個非-完整的單詞,然后找到該單詞中的第一個 0。

當然,快速執行此操作需要快速找到在一個字中設置或清除的最低有效位的索引。 這是一個常見的話題: 設置的最低有效位的位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM