首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 位圖實現:用 BigMap 類高效存儲百萬級整數集合

     編輯:PHP 綜合知識

位圖原理

用一個 bit 標記某個整數是否存在。32 個整數僅佔 1 個 32 位整數(4 字節)。百萬整數約需 128KB(1,000,000 / 8 / 1024 ≈ 122KB),極大節省內存。

BigMap 類代碼

class bigMap {
    private $mask = 0x1f;        // 31 = 0b11111,用於取模 32
    private $bitsperword = 32;
    private $shift = 5;          // 2^5 = 32,右移 5 位等同除以 32
    public $bitArray = [];

    // 清除位(置 0)
    function clearbit($i) {
        @$this->bitArray[$i >> $this->shift] &= ~(1 << ($i & $this->mask));
    }
    // 設置位(置 1)
    function setbit($i) {
        @$this->bitArray[$i >> $this->shift] |= (1 << ($i & $this->mask));
    }
    // 測試位
    function testbit($i) {
        return $this->bitArray[$i >> $this->shift] & (1 << ($i & $this->mask));
    }
}

// 測試
$oBig = new bigMap();
$oBig->setbit(30);
var_dump($oBig->testbit(2));  // false
var_dump($oBig->testbit(30)); // true
var_dump($oBig->bitArray);    // [1073741824] (bit 30 置 1)
echo decbin($oBig->bitArray[0]), "<br>"; // 100000000000000000000000000000

核心運算解析

  1. $i >> 5:得出數組下標(每 32 個整數一個元素)。
  2. $i & 31:得出元素內的位偏移(0~31)。
  3. 1 << offset:生成只有該位為 1 的掩碼。
  4. | 置 1,& ~mask 置 0,& mask 測試。

空間效率分析

適合大規模 ID 去重、標記、布隆過濾器底層存儲等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
數據量位圖內存PHP 陣列內存(估算)
10 萬~12 KB~8 MB
100 萬~122 KB~80 MB
1 億~12 MB~8 GB