2014年12月16日 17:15:09

初始化一串全为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

求交集代码:

生成两个bitmap -> 循环两个bitmap 与操作 生成一个新的bitmap -> 还原bitmap为数字

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

参考:

http://kevinbest0702.blog.163.com/blog/static/85409746201291484128939/

http://www.cnblogs.com/dolphin0520/archive/2011/10/19/2217369.html

PHP实现 bitmap 位图排序 求交集的更多相关文章

  1. list1与list2求交集的方法总结!

    一.有序集合求交集的方法有 a)二重for循环法,时间复杂度O(n*n) b)拉链法,时间复杂度O(n) c)水平分桶,多线程并行 d)bitmap,大大提高运算并行度,时间复杂度O(n) e)跳表, ...

  2. Bitmap 位图

    转自: http://dongxicheng.org/structure/bitmap/ 1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现 ...

  3. javascript集合求交集

    两集合求交集 思路: 1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存.该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度. 2. 因为A B 都排过序,所以 ...

  4. Linux 两个文件求交集、并集、差集

    一.交集 sort a.txt b.txt | uniq -d 二.并集 sort a.txt b.txt | uniq 三.差集 a.txt-b.txt: sort a.txt b.txt b.tx ...

  5. ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

    测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...

  6. wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快

    searcher.Search(types.SearchRequest{Text: "百度中国"}) // 查找满足搜索条件的文档,此函数线程安全 func (engine *En ...

  7. ACM_求交集

    求交集 Time Limit: 2000/1000ms (Java/Others) Problem Description: 输入集合A和B,按大小顺序输出A和B的交集. Input: 输入包含多组测 ...

  8. BitMap位图

    BitMap位图算法https://blog.csdn.net/varyall/article/details/79662029 常见面试题 题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2 ...

  9. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

随机推荐

  1. Java 关键字 native

    native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件中,而是在用其他语言实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言 ...

  2. ActiveRecord中andFilterWhere使用

    查询数据库时 $model; if(!empty($name)) { $model->andWhere(['name'=>$name]); } 可以用andFilterWhere,自动的把 ...

  3. 【转】pageX、clientX、screenX、offsetX、layerX、x

    参考:http://www.cnblogs.com/xesam/archive/2011/12/08/2280509.html chrome: e.pageX——相对整个页面的坐标e.layerX—— ...

  4. BIEE修改图片步骤:修改BANNER

    1.进入目录地址: D:\Oracle\Middleware\user_projects\domains\bifoundation_domain\servers\bi_server1\tmp\_WL_ ...

  5. 利用symbolsource/gitlink调试你的nuget包

    关键字: 如何调试Nuget下载的dll? VS  github  调试 参考文章: http://docs.nuget.org/create/creating-and-publishing-a-sy ...

  6. ajax提交特殊字符的处理

    前台页面用encodeURIComponent()这个js方法 rule=encodeURIComponent(rule);//对特殊字符编码 后台页面 java.net.URLDecoder url ...

  7. poj1631Bridging signals(最长单调递增子序列 nlgn)

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12251   Accepted: 6687 ...

  8. 在多浏览器使用JS复制内容到剪切板,无需插件

    最近在学习DHTMLX,下载了一些JS源码,使用谷歌浏览器,在学习dhtmlxGrid部分进行复制表格内容时,发现,在线版的可以复制成功,而本地的不可以复制,报类似访问剪切板错误,经查找原因,原来是谷 ...

  9. VirtualBox 网络设置

    VirtualBox是什么 VirtualBox 是一款 x86 虚拟机软件.原由德国innotek公司开发,2008年Sun收购了Innotek,而Sun于2010年被Oracle收购,2010年1 ...

  10. IE浏览器模式设置

    文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE ...