PHP中使用BigMap实例


Posted in PHP onMarch 30, 2015
<?php
//所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。

/*

若 N =1 ; 申请内存空间为 int a[2] ; 
假设需要排序或者查找的总数N=10000000,那么我们需要申请内存空间的大小为int a[1 + N/32],其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推: 

1.求十进制0-N对应在数组a中的下标: n/32 

2.求0-N对应0-31中的数: N%32=M

3.利用移位0-31使得对应32bit位为1: 1<<M,并置1;

举例 : 

如果想存储 3 
(1) a下标 30/ 32 = 0 ; 放在a[0] 中; 
(2) 3% 32 = 30; 
(3) 左移 30 位 01000000 00000000 00000000 00000000 这个对应的值$a[0] = 1073741824 ; 


1.求十进制0-N对应在数组a中的下标: 
十进制0-31,对应在a[0]中,先由十进制数n转换为与32的余可转化为对应在数组a中的下标。比如n=24,那么 n/32=0,则24对应在数组a中的下标为0。又比如n=60,那么n/32=1,则60对应在数组a中的下标为1,同理可以计算0-N在数组a中的下标。 

2.求0-N对应0-31中的数: 

十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得对应0-31中的数。 

3.利用移位0-31使得对应32bit位为1. 

找到对应0-31的数为M, 左移M位:即2^M. 然后置1.

 由此我们计算10000000个bit占用的空间:

1byte = 8bit

1kb = 1024byte

1mb = 1024kb
占用的空间为:10000000/8/1024/1024mb。

大概为1mb多一些。
 
 */
 
 class bigMap {
	 //使用两个字节保存 
	private $mask = 0x1f ;
	private $bitsperword = 32 ;
	// 移位的位数为5 pow(2,5) = 32 
	private $shift = 5 ;
	// 存储数据的数组 
	 public $bitArray = array(); 
 
	 /**
	 $i 对应的数归零 
	 */
	 function clearbit($i){
		 ////则将当前byte中的指定bit位取0,&后其他对方数组bit位必然不变,这就是 1 的妙用
		 // $i>>SHIFT 这里相当于 intval($i /32) ;
		 // $i & $this->mask 这里相当于 $i % $this->mask ,取余
		 @$this->bitArray[$i >> $this->shift] &= ~(1<<($i & $this->mask)); 
	}
 
 	 /**
	 $i 对应的数致1 
	 */
	 function setbit($i){
		 @$this->bitArray[$i >> $this->shift] |= (1<<($i & $this->mask)); 
	}
 
 //test 测试所在的bit为是否为1 
 function testbit($i){ 
		return $this->bitArray[$i >> $this->shift] & (1<<($i & $this->mask)); 
	} 	 
 }


$oBig = new bigMap() ; 

$oBig->setbit(30) ; 

var_dump($oBig->testbit(2)) ; 
var_dump($oBig->bitArray) ; 

echo decbin($oBig->bitArray[0]),"<br>";
PHP 相关文章推荐
做个自己站内搜索引擎
Oct 09 PHP
oracle资料库函式库
Oct 09 PHP
php框架Phpbean说明
Jan 10 PHP
介绍php设计模式中的工厂模式
Jun 12 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
php中的buffer缓冲区用法分析
May 31 PHP
Laravel相关的一些故障解决
Aug 19 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 #PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 #PHP
smarty模板引擎之分配数据类型
Mar 30 #PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 #PHP
smarty模板引擎基础知识入门
Mar 30 #PHP
php array_merge函数使用需要注意的一个问题
Mar 30 #PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 #PHP
You might like
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
高校十八大报告感想
2014/01/27 职场文书
环保口号大全
2014/06/12 职场文书
师范生求职自荐信
2014/06/14 职场文书
新店开张活动方案
2014/08/24 职场文书
授权收款委托书
2014/09/23 职场文书
校长四风对照检查材料
2014/09/27 职场文书
政风行风整改方案
2014/10/25 职场文书
学年个人总结范文
2015/03/05 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书