PHP实现bitmap位图排序与求交集的方法


Posted in PHP onJuly 28, 2016

本文实例讲述了PHP实现bitmap位图排序求交集的方法。分享给大家供大家参考,具体如下:

初始化一串全为0的二进制;

现有一串无序的整数数组;

如果整数x在这个整数数组当中,就将二进制串的第x位置为1;

然后顺序读取这个二进制串,并将为1的位转换成整数,顺序存放到新的集合中,就是排好序的了

排序代码:

function sort()
{
    // var_dump(PHP_INT_MAX, PHP_INT_SIZE);
    // int 9223372036854775807
    // int 8
    $bitmap = array_fill(0, 50, 0); //申请一个整形数组, 50个元素, 初始化为整数0
    $int_bit_size = PHP_INT_SIZE * 8; //$bitmap中每个整形的二进制位数 (本例中int = 8*8 = 64bit; $bitmap数组一共50*64 = 3200个bit位),也就是说能为最大值小于等于3200的整数集合排序
    $a = array(1,4,3,50,34,60,100,88,200,150,300); //定义一个乱序的数组
    //扫描$a中的每一个数, 将其转换为 x*64 + y
    foreach ($a as $k => $v) {
      $shang = $v / $int_bit_size;
      $yushu = $v % $int_bit_size;
      $offset = 1 << $yushu;
      $bitmap[$shang] = $bitmap[$shang] | $offset;//将bit位置为1
    }
    //将$bitmap中的bit位依次还原为整数输出,即可得到排序后的数组
    $b = array();
    foreach ($bitmap as $k => $v) {
      for ($i = 0; $i < $int_bit_size; $i++) {
        $tmp = 1 << $i;
        $flag = $tmp & $bitmap[$k];
        // $b[] = $flag ? $k * $int_bit_size + $i : false;
        if ($flag) {
          $b[] = $k * $int_bit_size + $i;
        }
      }
    }
    var_dump($b);exit;
}

浏览器输出:

array
  0 => int 1
  1 => int 3
  2 => int 4
  3 => int 34
  4 => int 50
  5 => int 60
  6 => int 88
  7 => int 100
  8 => int 150
  9 => int 200
  10 => int 300

求交集代码:

public function sort($a = array())
{
    // var_dump(PHP_INT_MAX, PHP_INT_SIZE);
    // int 9223372036854775807
    // int 8
    $bitmap = array_fill(0, 50, 0); //申请一个整形数组, 50个元素, 初始化为整数0
    $int_bit_size = PHP_INT_SIZE * 8; //$bitmap中每个整形的二进制位数 (本例中int = 8*8 = 64bit; $bitmap数组一共50*64 = 3200个bit位)
    // $a = array(1,4,3,50,34,60,100,88,200,150,300); //定一个乱序的数组
    //扫描$a中的每一个数, 将其转换为 x*64 + y
    foreach ($a as $k => $v) {
      $shang = $v / $int_bit_size;
      $yushu = $v % $int_bit_size;
      $offset = 1 << $yushu;
      $bitmap[$shang] = $bitmap[$shang] | $offset;//将bit位置为1
    }
    return $bitmap;
  }
  public function intersect()
  {
    $int_bit_size = PHP_INT_SIZE * 8;
    $a = array(1,4,3,50,34,60,100,88,200,150,300);
    $b = array(1,5,3,50,34,55,100,87,222,150,300);
    $bit_a = $this->sort($a);
    $bit_b = $this->sort($b);
    $c = array();
    foreach ($bit_a as $k => $v) {
      $c[$k] = $bit_a[$k] & $bit_b[$k]; //二进制 & 计算求交集
    }
    $d = array();
    foreach ($c as $k => $v) {
      for ($i = 0; $i < $int_bit_size; $i++) {
        $tmp = 1 << $i;
        $flag = $tmp & $c[$k];
        // $b[] = $flag ? $k * $int_bit_size + $i : false;
        if ($flag) {
          $d[] = $k * $int_bit_size + $i;
        }
      }
    }
    var_dump($d);exit;
}

浏览器输出:

array
  0 => int 1
  1 => int 3
  2 => int 34
  3 => int 50
  4 => int 100
  5 => int 150
  6 => int 300

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的FTP学习(四)
Oct 09 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
PHP动态创建Web站点的方法
Aug 14 PHP
深入php多态的实现详解
Jun 09 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
PHP中$this和$that指针使用实例
Jan 06 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 #PHP
apache php mysql开发环境安装教程
Jul 28 #PHP
Yii中的cookie的发送和读取
Jul 27 #PHP
Yii框架连接mongodb数据库的代码
Jul 27 #PHP
Laravel搭建后台登录系统步骤详解
Jul 26 #PHP
laravel中的错误与日志用法详解
Jul 26 #PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 #PHP
You might like
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
克隆javascript对象的三个方法小结
2011/01/12 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
Python计算两个矩形重合面积代码实例
2019/09/16 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
python scatter函数用法实例详解
2020/02/11 Python
Python PyQt5整理介绍
2020/04/01 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
商务专员岗位职责
2013/11/23 职场文书
教师党员思想汇报
2014/01/06 职场文书
《乡愁》教学反思
2014/02/18 职场文书
情人节寄语大全
2014/04/11 职场文书
护理学专业求职信
2014/06/29 职场文书
2015个人半年总结范文
2015/03/09 职场文书
出生证明范本
2015/06/15 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技