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学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
php 归并排序 数组交集
May 10 PHP
php计算十二星座的函数代码
Aug 21 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
php一个解析字符串排列数组的方法
May 12 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
PHP连接MYSQL数据库实例代码
Jan 20 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
php 中的closure用法详解
Jun 12 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
PHP获取HTTP body内容的方法
Dec 31 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
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php 可变函数使用小结
2018/06/12 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
vue组件间通信解析
2017/03/01 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
python 实现屏幕录制示例
2019/12/23 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
大学运动会通讯稿
2014/01/28 职场文书
党风廉政建设责任书
2014/04/14 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
给老婆道歉的话
2015/01/20 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
Java版 单机五子棋
2022/05/04 Java/Android