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 download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
将php数组输出html表格的方法
Feb 24 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 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
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
Python实现代码统计工具(终极篇)
2016/07/04 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
员工试用期考核自我鉴定
2014/04/13 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
php引用传递
2021/04/01 PHP
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
angular异步验证器防抖实例详解
2022/03/31 Javascript
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android