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 相关文章推荐
使用php实现截取指定长度
Aug 06 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
php获取当月最后一天函数分享
Feb 02 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
YII框架页面缓存操作示例
Apr 29 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
PHP7 标准库修改
2021/03/09 PHP
Javascript 继承实现例子
2009/08/12 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
python中zip和unzip数据的方法
2015/05/27 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
关于numpy数组轴的使用详解
2019/12/05 Python
pytorch梯度剪裁方式
2020/02/04 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Python之字典添加元素的几种方法
2020/09/30 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
专业销售业务员求职信
2013/11/18 职场文书
承诺书模板
2014/08/30 职场文书
学习十八大宣传标语
2014/10/09 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL