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 相关文章推荐
第九节--绑定
Nov 16 PHP
PHP 事务处理数据实现代码
May 13 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
php导入模块文件分享
Mar 17 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
php文件管理基本功能简单操作
Jan 16 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PDO::lastInsertId讲解
Jan 29 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 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 魔术变量和魔术函数详解
2015/02/25 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
JS中style属性
2006/10/11 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
草莓网官网:StrawberryNET
2019/08/21 全球购物
教师求职自荐信
2014/03/09 职场文书
学校春季防火方案
2014/06/08 职场文书
保密工作整改报告
2014/11/06 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技