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下通过POST还是GET来传值
Jun 05 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
php事件驱动化设计详解
Nov 10 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
php出租房数据管理及搜索页面
May 23 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 PHP
php慢查询日志和错误日志使用详解
Feb 27 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中uploaded_files函数使用方法详解
2011/03/09 PHP
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
用Python编写web API的教程
2015/04/30 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
卖车协议书
2014/04/21 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
活动总结格式范文
2014/04/26 职场文书
品质口号大全
2014/06/17 职场文书
工程进度款催款函
2015/06/24 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电
apache ftpserver搭建ftp服务器
2022/05/20 Servers