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
JpGraph php柱状图使用介绍
Aug 23 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
Jul 01 PHP
PHP添加Xdebug扩展的方法
Feb 12 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php实现快速排序法函数代码
2012/08/27 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
php实现URL加密解密的方法
2016/11/17 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
在Python中marshal对象序列化的相关知识
2015/07/01 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
python数据归一化及三种方法详解
2019/08/06 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
什么是python的必选参数
2020/06/21 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
一份Java笔试题
2012/02/21 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
单位办理社保介绍信
2014/01/10 职场文书
初一地理教学反思
2014/01/16 职场文书
文明风采获奖感言
2014/02/18 职场文书
学生鉴定评语大全
2014/05/05 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang