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模板引擎SMARTY
Oct 09 PHP
example1.php
Oct 09 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
19个超实用的PHP代码片段
Mar 14 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
Yii实现简单分页的方法
Apr 29 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
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 SEO优化之URL优化方法
2011/04/21 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
答题辅助python代码实现
2018/01/16 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
基于python实现百度翻译功能
2019/05/09 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
《从现在开始》教学反思
2014/04/15 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
节能标语大全
2014/06/21 职场文书
师德师风的心得体会
2014/09/02 职场文书
趣味运动会广播稿
2014/09/13 职场文书
教导主任个人总结
2015/03/03 职场文书
趣味运动会标语口号
2015/12/26 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers