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环境搭建最新方法
Sep 05 PHP
输出控制类
Oct 09 PHP
用PHP中的 == 运算符进行字符串比较
Nov 26 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
PHP可变函数的使用详解
Jun 14 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 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
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
numpy数组拼接简单示例
2017/12/15 Python
Django开发中复选框用法示例
2018/03/20 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python如何随机生成高强度密码
2020/08/19 Python
夜班门卫岗位职责
2013/12/09 职场文书
公司清洁工岗位职责
2013/12/14 职场文书
《菜园里》教学反思
2014/04/17 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
实习护士自荐信
2014/06/21 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
小学班主任个人总结
2015/03/03 职场文书
九不准学习心得体会
2016/01/23 职场文书
Golang jwt身份认证
2022/04/20 Golang