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 简单数组排序实现代码
Aug 05 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php PDO异常处理详解
Nov 20 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
Dec 25 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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
WordPress判断用户是否登录的代码
2011/03/17 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
yii分页组件用法实例分析
2015/12/28 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
Python Trie树实现字典排序
2014/03/28 Python
Python中使用PDB库调试程序
2015/04/05 Python
浅谈MySQL中的触发器
2015/05/05 Python
Python实现简单字典树的方法
2016/04/29 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
常用的10个Python实用小技巧
2020/08/10 Python
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
项目开发计划书
2014/01/09 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
2014年计生工作总结
2014/11/21 职场文书
2014年妇女工作总结
2014/12/06 职场文书