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+DBM的同学录程序(5)
Oct 09 PHP
PHP Google的translate API代码
Dec 10 PHP
PHP 变量定义和变量替换的方法
Jul 30 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
基于PHP服务端图片生成缩略图的方法详解
Jun 20 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
JavaScript实现滚动栏效果的方法
Apr 27 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
浅析PHP echo 和 print 语句
Jun 30 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
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
Python Django使用forms来实现评论功能
2016/08/17 Python
python绘制条形图方法代码详解
2017/12/19 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
大学生毕业自我鉴定范文
2013/11/03 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书