博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2-bitmap
阅读量:5340 次
发布时间:2019-06-15

本文共 1183 字,大约阅读时间需要 3 分钟。

位图在随机数的排序中用途广泛,并且耗时较少,最常用的是一位位图,即用一个bit的0/1来表示一个数,如果这个数存在就把响应的bit位置为1,否则就是0。在真正使用的时候,首先遍历数列,把表示每个数的相应bit位置1,第二次遍历位图,判断相应bit位对应数字是否存在,存在就打印输出,这样的序列自动有序。

但是单bit位有一个缺点就是,可以检测元素是否存在,但是对于含有重复元素的序列排序就无能为力了。

题目:在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数

这道题用2-bitmap可以很容易解决,每一个数用2-bit来表示,共可以表示4种状态,00表示不存在,01表示出现一次,10表示出现2次或者多次,11没有定义

 

2-bitmap的构造也是借助于1-bitmap,首先看一下1-bitmap的构造

#define mas 31int a[1000000];// 第0位表示数字0,第1位表示1int test(int i){    return a[i>>5] & (1<<(mas - i & mas));}void set(int i){    a[i>>5] |= 1<<(mas - i & mas);}void clear(int i){    a[i>>5] &= ~(1<<(mas - i & mas));}

2-bitmap的构造

int getT(int i){    if(!test(i) && !test(i+1))  /* 检查表示数字的两位数字 */        return 0;    else if(!test(i) && test(i+1))        return 1;    else if(test(i) && !test(i+1))        return 2;    else        return 3;}void setT(int i){    /* 检测对应位的当前值,然后进行变换 */    int t = getT(i);    switch(t)    {    case 0: set(i+1);break;    case 1: set(i);clear(i+1);break;    case 2: break;    }}/* 清除当前值 */void clearT(int i){    clear(i);    clear(i+1);}

从一系列数中找出不重复元素

int main(){    int n;    int b[100000];    scanf("%d",&n);    for(int i=0;i

转载于:https://www.cnblogs.com/qianye/archive/2012/11/29/2794032.html

你可能感兴趣的文章
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
Solr4.8.0源码分析(5)之查询流程分析总述
查看>>
[Windows Server]安装系统显示“缺少计算机所需的介质驱动程序”解决方案
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>