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 Ajax乱码
Apr 09 PHP
PHP常用函数小技巧
Sep 11 PHP
php中使用sftp教程
Mar 30 PHP
php+mysql实现无限级分类
Nov 11 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
PHP实现获取并生成数据库字典的方法
May 04 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
PHP实现的多进程控制demo示例
Jul 22 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 缓冲的免费实现方法
2006/10/09 PHP
php intval的测试代码发现问题
2008/07/27 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
php Smarty 字符比较代码
2011/02/27 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
vuex 的简单使用
2018/03/22 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
详解在Python程序中使用Cookie的教程
2015/04/30 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
介绍一下sql server的安全性
2014/08/10 面试题
品质口号大全
2014/06/17 职场文书
日语系毕业求职信
2014/07/27 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
总经理聘用协议书
2015/09/21 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers