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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
PHP 加密与解密的斗争
Apr 17 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
php selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
10条php编程小技巧
Jul 07 PHP
php单元测试phpunit入门实例教程
Nov 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
python提取字典key列表的方法
2015/07/11 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
园林设计师自荐信
2013/11/18 职场文书
投标承诺书范本
2014/03/27 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
文秘应届生求职信
2014/07/05 职场文书
小学生安全保证书
2015/05/09 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
Python序列化模块JSON与Pickle
2022/06/05 Python