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实现的生成静态HTML速度快类库
Mar 31 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
深入了解PHP类Class的概念
Jun 14 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php递归函数中使用return的注意事项
Jan 17 PHP
Yii学习总结之安装配置
Feb 22 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
PHP实现简易blog的制作
Oct 24 PHP
PHP fclose函数用法总结
Feb 15 PHP
PHP递归算法的简单实例
Feb 28 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过滤敏感词的示例
2014/03/31 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
Angular2使用jQuery的方法教程
2017/05/28 jQuery
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
使用python获取电脑的磁盘信息方法
2018/11/01 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
python实现猜拳游戏项目
2020/11/30 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
大学新学期计划书
2014/04/28 职场文书
社区党建工作方案
2014/06/10 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
Mysql 如何查询时间段交集
2021/06/08 MySQL
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技