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 相关文章推荐
对盗链说再见...
Oct 09 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
php getsiteurl()函数
Sep 05 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
php实现的http请求封装示例
Nov 08 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
PDO::quote讲解
Jan 29 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php编程每天必学之验证码
2016/03/03 PHP
重定向实现代码
2006/11/20 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
pyside写ui界面入门示例
2014/01/22 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
python实现彩色图转换成灰度图
2019/01/15 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
空字符串(“”)和null的区别
2012/11/13 面试题
缴纳养老保险的证明
2014/01/10 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
党风廉政承诺书
2014/03/27 职场文书