什么是位图?来自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. yii:高级应用程序搭建数据库的详细流程

    上一章已经把高级应用程序的环境搭配成功,那么下一步就是搭建数据库了. 首先,我们先去创建一个数据库,比如:demo 创建完之后,我们重要的就是将文件中的数据进行一个更新,在www/advancend/ ...

  2. 利用photoshop制作gif图片

    首先准备你需要的几张素材图片 1.将素材图片根据发生的顺序放置在不同的图层 2.打开窗口下的时间轴 选择帧动画 3.创建第一张帧动画 选项卡右边这个按钮,点击这个选择新建帧 第一张图片显示其他的隐藏 ...

  3. linux 命令——31 /etc/group文件(转)

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件. linux /etc/group文件是有关于系统管理员对用 ...

  4. jquery实现简单的验证码倒计时的效果

    HTML: <div class="container"> <form> <div class="form-group"> ...

  5. IOS UIButton常用属性

    //1.添加按钮 UIButton *nameView=[UIButton buttonWithType:UIButtonTypeCustom]; //nameView.backgroundColor ...

  6. python时间转换 ticks-FYI

    #设a为字符串 import time a = "2011-09-28 10:00:00" #中间过程,一般都需要将字符串转化为时间数组 time.strptime(a,'%Y-% ...

  7. python基础一 day17 初识递归

    #递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— ...

  8. js display, visible 区别

    注意: display:none和visible:hidden都能把网页上某个元素隐藏起来,在视觉效果上没有区别,但是在一些DOM操作中两者有区别: display:none ---不为被隐藏的对象保 ...

  9. v4l2解析

    v4l2的学习建议和流程解析: http://www.cnblogs.com/silence-hust/p/4464291.html 补充: 枚举设备所支持的image format: VIDIOC_ ...

  10. CentOS7下Mysql5.7安装

    下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.no ...