当前位置:首页 > PHP

php实现bitmap

2026-01-29 20:42:19PHP

PHP 实现 Bitmap

Bitmap(位图)是一种高效的数据结构,适用于大规模数据的快速查询、去重和统计。以下是 PHP 中实现 Bitmap 的方法。

php实现bitmap

使用 PHP 的位运算实现 Bitmap

Bitmap 的核心思想是利用一个二进制位数组(通常用整数数组实现)来标记数据是否存在。每个位可以表示一个数字是否存在(1 表示存在,0 表示不存在)。

class Bitmap {
    private $bitmap = [];

    // 设置某个数字存在
    public function set($number) {
        $index = (int)($number / 32);
        $offset = $number % 32;
        if (!isset($this->bitmap[$index])) {
            $this->bitmap[$index] = 0;
        }
        $this->bitmap[$index] |= (1 << $offset);
    }

    // 检查某个数字是否存在
    public function get($number) {
        $index = (int)($number / 32);
        $offset = $number % 32;
        if (!isset($this->bitmap[$index])) {
            return false;
        }
        return ($this->bitmap[$index] & (1 << $offset)) != 0;
    }

    // 清除某个数字的标记
    public function clear($number) {
        $index = (int)($number / 32);
        $offset = $number % 32;
        if (isset($this->bitmap[$index])) {
            $this->bitmap[$index] &= ~(1 << $offset);
        }
    }
}

示例用法

$bitmap = new Bitmap();
$bitmap->set(10);
$bitmap->set(20);

var_dump($bitmap->get(10)); // true
var_dump($bitmap->get(15)); // false
var_dump($bitmap->get(20)); // true

$bitmap->clear(20);
var_dump($bitmap->get(20)); // false

使用字符串模拟 Bitmap

如果数字范围较大,可以用字符串来模拟 Bitmap,节省内存。

class StringBitmap {
    private $bitmap = '';

    // 设置某个数字存在
    public function set($number) {
        $byteIndex = (int)($number / 8);
        $bitOffset = $number % 8;
        if (strlen($this->bitmap) <= $byteIndex) {
            $this->bitmap .= str_repeat("\0", $byteIndex - strlen($this->bitmap) + 1);
        }
        $this->bitmap[$byteIndex] = $this->bitmap[$byteIndex] | chr(1 << $bitOffset);
    }

    // 检查某个数字是否存在
    public function get($number) {
        $byteIndex = (int)($number / 8);
        $bitOffset = $number % 8;
        if (strlen($this->bitmap) <= $byteIndex) {
            return false;
        }
        return (ord($this->bitmap[$byteIndex]) & (1 << $bitOffset)) != 0;
    }

    // 清除某个数字的标记
    public function clear($number) {
        $byteIndex = (int)($number / 8);
        $bitOffset = $number % 8;
        if (strlen($this->bitmap) > $byteIndex) {
            $this->bitmap[$byteIndex] = $this->bitmap[$byteIndex] & chr(~(1 << $bitOffset));
        }
    }
}

示例用法

$bitmap = new StringBitmap();
$bitmap->set(100);
$bitmap->set(200);

var_dump($bitmap->get(100)); // true
var_dump($bitmap->get(150)); // false
var_dump($bitmap->get(200)); // true

$bitmap->clear(200);
var_dump($bitmap->get(200)); // false

注意事项

  • Bitmap 适用于数字范围已知且分布密集的场景。
  • 数字范围过大时,Bitmap 可能会占用较多内存,可以通过分段或压缩优化。
  • PHP 的整数大小受限于系统(32 位或 64 位),需注意溢出问题。

php实现bitmap

标签: phpbitmap
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证…