首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 位圖(Bitmap)詳解:實現、應用與優化

     編輯:關於C++

什麼是位圖

位圖(Bitmap)是一種用連續位來表示集合的數據結構。每個位對應一個元素的存在性(0/1),極其節省空間。常用於大規模數據去重、快速查找、壓縮存儲等場景。

核心操作實現

假設用 int 數組 bitmap[] 存儲,每個 int 32 位。

#define SHIFT 5          // 2^5 = 32
#define MASK 0x1F        // 32-1 = 31,用於取模
#define MAX 1024*1024*1024
int bitmap[MAX / 32];

// 設置第 i 位為 1
void set(int i) {
    bitmap[i >> SHIFT] |= (1 << (i & MASK));
}

// 測試第 i 位
int test(int i) {
    return bitmap[i >> SHIFT] & (1 << (i & MASK));
}

// 清除第 i 位
void clear(int i) {
    bitmap[i >> SHIFT] &= ~(1 << (i & MASK));
}

關鍵技巧:i >> 5 等價 i / 32 定位數組下標;i & 31 等價 i % 32 定位位偏移。

C++ STL bitset

標準庫提供 <bitset>,固定大小編譯期確定,功能豐富(set, reset, test, count, any, none, to_string 等)。動態大小可用 vector<unsigned long> 或 boost::dynamic_bitset。

典型應用場景

1. 枚舉子集 / 全組合

長度 n 字符串的所有子集對應 0 ~ (1< 的二進制掩碼。遍歷掩碼即可生成所有組合。

2. 漢明距離 / 曼哈頓距離優化

對多維點,通過枚舉符號組合(正/負),將最大距離問題轉化為對每種符號模式記錄極值,再取差值最大者。位圖加速符號枚舉。

3. 搜索剪枝狀態壓縮

DFS/BFS 中記錄訪問狀態,用位圖代替 bool[] 或 set,大幅降低內存佔用。

4. 海量數據去重 / 存在性查詢

  • 2.5 億整數找不重複:4 億位 ≈ 500 MB,可放入內存,一次掃描建立位圖,二掃描輸出唯一值。
  • 40 億無序 unsigned int 判斷某數是否存在:同理,位圖 512 MB,O(1) 查詢。

總結

位圖是「空間換時間」的極致體現:以極小空間實現 O(1) 設置/查詢/清除。掌握位運算技巧(移位、掩碼、XOR 等)是高效使用位圖的關鍵。從底層手寫到 STL bitset,再到 dynamic_bitset,根據場景選擇最合適的工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved