什么是位图?来自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. 5-15 笔记 jtopo使用

    Jtopo的核心对象有6个,分别是Stage(舞台对象),Scene(场景对象),Node(节点对象),Link(连线对象),Container(容器对象),Effect.Animate(动画效果) ...

  2. CVE-2018-4878

    0x00前言 该漏洞影响 Flash Player 版本28.0.0.137以及之前的所有版本 0x01 poc Poc 这里只列出关键代码 public function triggeruaf() ...

  3. 安装软件出现缺少vcruntime140dll的解决方法

    转自:http://jingyan.baidu.com/article/49711c617e4000fa441b7c92.html 首先下载vc++2015,注意自己系统是32位还是64位的,下载对应 ...

  4. Oracle 数据处理

    1. 对维度按照度量值的排名进行统计得分,第一名100分,第二名99分,第三名98……可以先进行排名,然后用 得分值+1,减去排名既是所得分数. -- 建表 create table province ...

  5. 虚拟机Linux_Mint中安装vmtools增强工具

    一开始用VmwarePro安装Linux系统时,系统的整体界面会缩在屏幕中间的一小块区域内.如图: ​ 看的会非常吃力.为了更好的解决这个问题,就需要安装Vmtools增强工具.安装步骤如下: 1. ...

  6. 洛谷P3374树状数组1

    下有彩蛋(from https://www.cnblogs.com/wuwangchuxin0924/p/5921130.html)树状数组的blog写的最好的是这位//https://www.cnb ...

  7. 一步一步讲解安装NodeJs开发环境

    node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node. ...

  8. java 获取request中的请求参数

    1.get 和 post请求方式 (1)request.getParameterNames(); 获取所有参数key后.遍历request.getParameter(key)获取value (2)re ...

  9. 第二篇:ssh.invoke_shell() 切换root出现的新问题

    接上一篇:按照上一篇的方式,在没有对ssh.invoke_shell()执行后的登录提示符进行判断的话,那边有部分机器就回因为返回为空导致程序卡死. 正常机器  ssh.recv(9999)  命令返 ...

  10. 四、Shell 数组

    Shell 数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. She ...