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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP扩展编写点滴 技巧收集
Mar 09 PHP
如何判断php数组的维度
Jun 10 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
php短址转换实现方法
Feb 25 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 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生成EXCEL的东东
2006/10/09 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
php文件缓存类汇总
2014/11/21 PHP
php里array_work用法实例分析
2015/07/13 PHP
jquery JSON的解析方式
2009/07/25 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
使用angular写一个hello world
2015/01/23 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
node.js获取参数的常用方法(总结)
2017/05/29 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
家长会学生演讲稿
2014/04/26 职场文书
技术负责人任命书
2014/06/05 职场文书
国际会计专业求职信
2014/08/04 职场文书
我的生日感言
2015/08/03 职场文书
祝酒词范文
2015/08/12 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
MySQL 分组查询的优化方法
2021/05/12 MySQL
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫