什么是位图?来自http://www.cnblogs.com/dolphin0520/archive/2011/10/19/2217369.html

  位图就是用一个bit来标记某个元素对应的值,键值就是该元素。最大的好处就是节省了内存空间。

可以利用位图进行排序,输入的数据是有要求的(数据不能重复,且大致直到数据的范围)。例如我们对{3,5,2,6,8}进行排序,我们可以利用一个

8bit的二进制向量set[1-8]来表示该集合,如果数据存在那么相应的set位就是1,否则就是0,那么最后我们的set={0,1,1,0,1,1,0,1}

这时候可以根据set集合输出对应的下标就是排序结果。

应用:

  • 1,给40亿个不重复的unsinged int的整数,没有排过序,然后给出一个数,如果快速的判断这个数是否在那40亿个数中。

分析:因为unsigned int数据的最大范围在40亿左右,40*10^8/(1024*1024*8) = 476.837M,因此我们可以申请512M的内存空间,每个bit位表示一个unsigned int。然后读入40亿个数,

并设置相应的bit为1,然后读取要查询的数,查看bit是否为1?

  • 2,给出40亿个unsigned int的整数,如何判断这40亿个数中哪些数是重复的?

我们也可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位设置为1。如果是第一次读取某个数,那么相应的bit位为0;如果是第二次读取该数,那么相应的bit位为1;

============

c语言中没有bit这个概念,因此我们必须通过位操作来实现。

假设有若干不重复的数据,数据的范围是[1-100],就是MAX<=100,MIN>=1,因为我们可以申请一个int a[100/(4*8)+1] = int a[4];

怎么利用c语言实现位图?os内存管理中给出了答案。

假设由数据32,那么应该将逻辑下标为32的二进制设置1,这个逻辑位置有两部分组成: 字节位置(数组下标),位位置

字节位置=数据/32;位运算就是data>>5右移5位

位位置=数据%32,就是data&0x1f(利用位运算求余数问题)

==========

下面的例子就是对1-9999的数字排序。

#define MAX 100
#define SHIFT 5
#define MASK 0x1f
#define DIGITS 32
#define NUMs 10000 class A{
public:///sort 1000000 by decs
int data[NUMs];
int tmp[NUMs/+];
void init(){
memset(data,,sizeof(data));
for(int i = ;i<NUMs;i++){
data[i] = NUMs-i;
}
} ///
void show(){
for(int i = ;i<NUMs;i++){
cout<<data[i]<<" ";
if((i%)==) cout<<endl;
}
} ///
void sort(){
for(int i = ;i<NUMs;i++){
set(data[i]);
}
}
void show_solution(){
for(int i = ;i<NUMs;i++){
if(test(i)) cout<<i<<" ";
if(i%==) cout<<endl;
}
} ///set
void set(int n){
tmp[n>>SHIFT] = tmp[n>>SHIFT]|(<<(n&MASK));
}
///clear
void clear(int n){
tmp[n>>SHIFT] = tmp[n>>SHIFT]&~(<<(n&MASK));
}
///test
int test(int n){
return tmp[n>>SHIFT] & (<<(n&MASK));
} void test(){
cout<<"begining"<<endl;
init();
show();
sort();
show_solution(); cout<<"end"<<endl;
}
};

===========

利用c++中的bitset类型实现?

using namespace std;
#define MAX 100
#define SHIFT 5
#define MASK 0x1f
#define DIGITS 32
#define NUMs 10000 class A{
public:///sort 1000000 by decs
int data[NUMs];
int tmp[NUMs/+];
void init(){
memset(data,,sizeof(data));
for(int i = ;i<NUMs;i++){
data[i] = NUMs-i;
}
}
void test(){
cout<<"begining"<<endl;
bitset<NUMs+> b;
init();
for(int i = ;i<NUMs;i++){
b.set(data[i],);
} for(int i = ;i<NUMs;i++){
if(b[i]==) cout<<i<<" ";
if(i%==) cout<<endl;
} cout<<"end"<<endl;
}
};

void test(){
        cout<<"begining"<<endl;
        cout<<"int-"<<sizeof(int)<<endl;//4
        cout<<"bool-"<<sizeof(bool)<<endl;//1
        cout<<"char-"<<sizeof(char)<<endl;//1
        cout<<"double-"<<sizeof(double)<<endl;//8
        cout<<"float-"<<sizeof(float)<<endl;//4
        cout<<"long-"<<sizeof(long)<<endl;//8
        cout<<"long long-"<<sizeof(long long)<<endl;//8
        cout<<"end"<<endl;
    }

位图 c++ 位图排序的更多相关文章

  1. 疯狂位图之——位图实现12GB无重复大整数集排序

    <Programming Pearls>(编程珠玑)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下. 一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为 ...

  2. 疯狂位图之——位图生成12GB无重复随机乱序大整数集

    上一篇讲述了用位图实现无重复数据的排序,排序算法一下就写好了,想弄个大点数据测试一下,因为小数据在内存中快排已经很快. 一.生成的数据集要求 1.数据为0--2147483647(2^31-1)范围内 ...

  3. 位图切割器&位图裁剪器

    位图切割器: 虽然网上有类似的工具,PhotoShop 也有类似功能,但前者似乎不支持超大位图切割(以 G 计大小),而后者的切割块数量好像有比较小的限定范围,于是自己动手写了这个工具. 至于为什么是 ...

  4. Oracle索引——位图索引

    1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...

  5. 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  6. 数据库 Hash Join的定义,原理,算法,成本,模式和位图

    Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash ...

  7. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  8. Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer

    概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...

  9. 第14章 位图和位块传输_14.4 GDI位图对象(3)

    14.4.10 非矩形的位图图像 (1)“掩码”位图——单色位图,要显示的像素对应的掩码置1,不显示置0(2)光栅操作(点这里,见此文分析) (3)MaskBlt函数 ①MaskBlt(hdcDest ...

随机推荐

  1. hihocoder 第四十周 三分求极值

    题目链接:http://hihocoder.com/contest/hiho40/problem/1 ,一道简单的三分. 题目是在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求 ...

  2. NFS服务器实现文件共享

    NFS服务器运行原理 实战配置NFS服务器 配置Samba服务器及实现文件共享 (一)NFS器服务端描述 NFS服务器: Network File System,网络文件系统使FreeBSD支持的一种 ...

  3. python操作文件目录

    # 查看当前目录的绝对路径: >>> os.path.abspath('.') /Users/NaCl/Documents/GitHub #同样的道理,要拆分路径时,也不要直接去拆字 ...

  4. 前端小记3——iOS与Android问题

    1.消除transition闪屏 (1)-webkit-transform-style:preserve-3d;  /*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/ (2)-webkit-ba ...

  5. JS时间格式和时间戳的相互转换

    时间戳转化为日期的方式 ; var newDate = new Date(); newDate.setTime(timestamp * ); // Mon May 28 2018 console.lo ...

  6. mysql 报错 Operand should contain 1 column(s)

    报错 Operand should contain 1 column(s) 原因 select 后面加了 () select (x,x,x)

  7. Python 正则表达式 利用括号分组

    如果想把区号从匹配的电话号码中分离,可以添加括号在正则表达式中创建分组,再使用group()方法,从一个分组中获取匹配的文本 正则表达式字符串中,第一个括号是第一组,第二个括号是第二组.向group( ...

  8. vue.js 发布后路径引用问题

    在发布到iis目录下时候,如果放在网站的根目录下的时候,是不会有什么问题的 但是一旦放在了非根目录的其他文件夹里面,这时候index.html里引用的js和css文件路径都会找不到 错误如下 打开in ...

  9. 利用DOM的方式点击切换图片及修改文字

    本案例主要学习理解,用到的几个DOM方法 01.getAttribute()方法,获取元素的属性值 02.setAttribute('src',source) 方法,用后边的值修改前边这个元素的属性值 ...

  10. C语言实现判断分数等级

    从屏幕上输入一个学生的成绩(0-100),对学生成绩进行评定: <=60为"E" 60~69为"D" 70~79为"C" 80~89为 ...