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 相关文章推荐
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
PHP 观察者模式的实现代码
May 10 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
php 强制下载文件实现代码
Oct 28 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP调用接口API封装的例子
Oct 11 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
jquery css实现流程进度条
2020/03/26 jQuery
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
Python本地与全局命名空间用法实例
2015/06/16 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
python字符串与url编码的转换实例
2018/05/10 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python列表与元组的异同详解
2019/07/02 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
绿色环保家庭事迹材料
2014/08/31 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
2015年档案室工作总结
2015/05/23 职场文书
教师教育教学随笔
2015/08/15 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书