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若干单维数组遍历方法的比较
Sep 20 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
PHP.vs.JAVA
Apr 29 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
php压缩文件夹最新版
Jul 18 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 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 星际争霸
php重定向的三种方法分享
2012/02/22 PHP
YII中assets的使用示例
2014/07/31 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
百度地图api如何使用
2015/08/03 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
Python assert语句的简单使用示例
2019/07/28 Python
python global关键字的用法详解
2019/09/05 Python
tensorflow 查看梯度方式
2020/02/04 Python
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
几道Java和数据库的面试题
2013/05/30 面试题
物理教学随笔感言
2014/02/22 职场文书
心理健康日活动总结
2014/05/08 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
八年级英语教学计划
2015/01/23 职场文书
党支部培养考察意见
2015/06/02 职场文书
工作感想范文
2015/08/07 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL