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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
Windows下安装Memcached的步骤说明
Apr 25 PHP
PHP文件上传原理简单分析
May 29 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
php实现aes加密类分享
Feb 16 PHP
PHP解密Unicode及Escape加密字符串
May 17 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
9个比较实用的php代码片段
Mar 15 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
可实现多表单提交的javascript函数
2007/08/01 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
python k-近邻算法实例分享
2014/06/11 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python生成随机验证码的两种方法
2015/12/22 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
python实现分页效果
2017/10/25 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python创建学生成绩管理系统
2019/11/22 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
JAVA程序员面试题
2012/10/03 面试题
委托证明的格式
2014/01/10 职场文书
接受捐赠答谢词
2014/01/27 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书