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连接数据库代码应用分析
May 29 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
PHP常用函数和常见疑难问题解答
Mar 05 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
php实现的错误处理封装类实例
Jun 20 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
PHP内置函数生成随机数实例
Jan 18 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
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
javascript天然的迭代器
2010/10/29 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
详谈python read readline readlines的区别
2017/09/22 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Django REST framework视图的用法
2019/01/16 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
2014年打非治违工作总结
2014/11/13 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS