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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
PHP PDO函数库详解
Apr 27 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
php 保留字列表
Oct 04 PHP
php获得用户ip地址的比较不错的方法
Feb 08 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
php实现的http请求封装示例
Nov 08 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
Laravel 在views中加载公共页面的实现代码
Oct 22 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python append、extend与insert的区别
2016/10/13 Python
儿童编程python入门
2018/05/08 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python实现静态web服务器
2019/09/03 Python
Pytorch中.new()的作用详解
2020/02/18 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python使用Pygame绘制时钟
2020/11/29 Python
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
总务岗位职责
2013/11/19 职场文书
文化宣传方案
2014/03/13 职场文书
元旦晚会活动总结
2014/07/09 职场文书
英文感谢信格式
2015/01/21 职场文书
免职通知
2015/04/23 职场文书
小学运动会通讯稿
2015/07/18 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android