数据结构:位图法

Similar documents
迅速在两个含有大量数据的文件中寻找相同的数据

02

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C/C++语言 - C/C++数据

新版 明解C++入門編

C/C++程序设计 - 字符串与格式化输入/输出

c_cpp

Guava学习之Resources

通过Hive将数据写入到ElasticSearch

Guava学习之CharSequenceReader

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

第3章.doc

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

IO

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

C/C++ - 文件IO

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

CC213

untitled

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

C/C++ - 字符串与字符串函数

使用Cassandra和Spark 2.0实现Rest API服务

韶关:神奇丹霞

Microsoft PowerPoint - string_kruse [兼容模式]

FY.DOC

3.1 num = 3 ch = 'C' 2

哼, 你 們 不 回 答 又 怎 麼 樣? 不 管 是 多 大 來 頭, 現 在 都 被 血 魔 吞 噬 無 蹤 了 你 們 幾 個 真 是 太 過 分, 我 不 犯 你 們, 你 們 卻 一 天 到 晚 來 挑 釁 我 教 尊 冷 笑 著 說 道 嗚, 大 人 土 地 大 姐 跪 下 來, 流 下

C/C++语言 - 运算符、表达式和语句

C C

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Hadoop&Spark解决二次排序问题(Hadoop篇)

C 1

伊春:醉人林都

Microsoft PowerPoint - 10 模板 Template.pptx

使用MapReduce读取XML文件

Apache CarbonData集群模式使用指南

Flume-ng与Mysql整合开发

untitled

关林:武圣陵寝

泰山:五岳独尊

概述

Spark读取Hbase中的数据

ebook39-5

国内26省市新能源汽车推广规划已出台

概述

北戴河:海阔天空

三种方法实现Hadoop(MapReduce)全局排序(1)

新・解きながら学ぶC言語

新・解きながら学ぶJava

Microsoft Word - 01.DOC

2/80 2

新版 明解C言語入門編

Microsoft Word - CPE考生使用手冊 docx

LEETCODE leetcode.com 一 个 在 线 编 程 网 站, 收 集 了 IT 公 司 的 面 试 题, 包 括 算 法, 数 据 库 和 shell 算 法 题 支 持 多 种 语 言, 包 括 C, C++, Java, Python 等 2015 年 3 月 份 加 入 了 R


西岭雪山滑雪场

Hive:用Java代码通过JDBC连接Hiveserver

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1








1

C/C++ - 结构体、共用体、枚举体

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

C/C++ - 函数

全国计算机技术与软件专业技术资格(水平)考试

(Microsoft Word - 3\271\375\246\321\257R.doc)

大 台 北 與 桃 竹 苗 地 區 北 得 拉 曼 巨 木 步 道 新 竹 縣 尖 石 鄉 鎮 西 堡 巨 木 群 步 道 新 竹 縣 尖 石 鄉 鳥 嘴 山 登 山 步 道 苗 栗 縣 泰 安 鄉 加 里 山 登 山 步 道 苗 栗 縣 南 庄 鄉

C/C++ - 数组与指针

使用Hive读取ElasticSearch中的数据

2 12

untitled

提问袁小兵:

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

如何在 Apache Hive 中解析 Json 数组

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

C/C++ - 字符输入输出和字符确认

ebook50-15

Microsoft Word - 第3章.doc

ENGG1410-F Tutorial 6

新・明解C言語入門編『索引』

在Spring中使用Kafka:Producer篇

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

untitled

C++ 程式設計

Microsoft Word - ch04三校.doc

untitled

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

COCO18-DensePose-BUPT-PRIV

上海交通大学

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

INTRODUCTION TO COM.DOC

Transcription:

一 定义 位图法就是 bitmap 的缩写 所谓 bitmap, 就是用每一位来存放某种状态, 适用于大规模数据, 但数据状态又不是很多的情况 通常是用来判断某个数据存不存在的 在 STL 中有一个 bitset 容器, 其实就是位图法, 引用 bitset 介绍 : A bitset is a special container class that is designed to store bits (elements with only two possible values: 0 or 1,true or false,...).the class is very similar to a regular array, but optimizing for space allocation: each element occupies only one bit (which is eight times less than the smallest elemental type in C++: char).each element (each bit) can be accessed individually: for example, for a given bitset named mybitset, the expression mybitset[3] accesses its fourth bit, just like a regular array accesses its elements. 二 数据结构 unsigned int bit[n]; 在这个数组里面, 可以存储 N * sizeof(int) * 8 个数据, 但是最大的数只能是 N * sizeof(int) * 8-1 假如, 我们要存储的数据范围为 0-15, 则我们只需要使得 N=1, 这样就可以把数据存进去 如下图 : 数据为 5,1,7,15,0,4,6,10, 则存入这个结构中的情况为 三 相关操作 1, 写入数据 定义一个数组 : unsigned char bit[8 * 1024]; 这样做, 能存 8K*8=64K 个 unsigned short 数据 bit 存放的字节位置和位位置 ( 字节 0~8191, 位 0~7 ) 比如写 1234, 字节序 : 1234/8 = 154; 位序 : 1234 &0b111 = 2, 那么 1234 放在 bit 的下标 154 字节处, 把该字节的 2 号位 ( 0~7) 置为 1 1 / 6

字节位置 : int nbytepos =1234/8 = 154; 位位置 : int nbitpos = 1234 & 7 = 2; // 把数组的 154 字节的 2 位置为 1 unsigned short val = 1<<nBitPos; bit[nbytepos] = bit[nbytepos] val; // 写入 1234 得到 arrbit[154]=0b00000100 再比如写入 1236, 字节位置 : int nbytepos =1236/8 = 154; 位位置 : int nbitpos = 1236 & 7 = 4 // / 把数组的 154 字节的 4 位置为 1 val = 1<<nBitPos; arrbit[nbytepos] = arrbit[nbytepos] val; // 再写入 1236 得到 arrbit[154]=0b00010100 函数实现 : #define SHIFT 5 #define MAXLINE 32 #define MASK 0x1F void setbit(int *bitmap, int i){ bitmap[i >> SHIFT] = (1 << (i & MASK)); 2, 读指定位 bool getbit(int *bitmap1, int i){ return bitmap1[i >> SHIFT] & (1 << (i & MASK)); 四 位图法的缺点 1. 可读性差 2. 位图存储的元素个数虽然比一般做法多, 但是存储的元素大小受限于存储空间的大小 位 2 / 6

图存储性质 : 存储的元素个数等于元素的最大值 比如, 1K 字节内存, 能存储 8K 个值大小上限为 8K 的元素 ( 元素值上限为 8K, 这个局限性很大!) 比如, 要存储值为 65535 的数, 就必须要 65535/8=8K 字节的内存 要就导致了位图法根本不适合存 unsigned int 类型的数 ( 大约需要 2^32/8=5 亿字节的内存 ) 3. 位图对有符号类型数据的存储, 需要 2 位来表示一个有符号元素 这会让位图能存储的元素个数, 元素值大小上限减半 比如 8K 字节内存空间存储 short 类型数据只能存 8K*4=32K 个, 元素值大小范围为 -32K~32K 五 位图法的应用 1 给 40 亿个不重复的 unsigned int 的整数, 没排过序的, 然后再给一个数, 如何快速判断这个数是否在那 40 亿个数当中首先, 将这 40 亿个数字存储到 bitmap 中, 然后对于给出的数, 判断是否在 bitmap 中即可 2 使用位图法判断整形数组是否存在重复遍历数组, 一个一个放入 bitmap, 并且检查其是否在 bitmap 中出现过, 如果没出现放入, 否则即为重复的元素 3 使用位图法进行整形数组排序首先遍历数组, 得到数组的最大最小值, 然后根据这个最大最小值来缩小 bitmap 的范围 这里需要注意对于 int 的负数, 都要转化为 unsigned int 来处理, 而且取位的时候, 数字要减去最小值 4 在 2.5 亿个整数中找出不重复的整数, 注, 内存不足以容纳这 2.5 亿个整数参考的一个方法是 : 采用 2-Bitmap( 每个数分配 2bit,00 表示不存在,01 表示出现一次,10 表示多次,11 无意义 ) 其实, 这里可以使用两个普通的 Bitmap, 即第一个 Bitmap 存储的是整数是否出现, 如果再次出现, 则在第二个 Bitmap 中设置即可 这样的话, 就可以使用简单的 1- Bitmap 了 六 实现 要求在 https://www.iteblog.com/archives/158 里面 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> #define SHIFT 5 #define MAXLINE 32 #define MASK 0x1F 3 / 6

using namespace std; // w397090770 // wyphao.2007@163.com // 2012.11.29 void setbit(int *bitmap, int i){ bitmap[i >> SHIFT] = (1 << (i & MASK)); bool getbit(int *bitmap1, int i){ return bitmap1[i >> SHIFT] & (1 << (i & MASK)); size_t getfilesize(ifstream &in, size_t &size){ in.seekg(0, ios::end); size = in.tellg(); in.seekg(0, ios::beg); return size; char * fillbuf(const char *filename){ size_t size = 0; ifstream in(filename); if(in.fail()){ cerr<< "open " << filename << " failed!" << endl; exit(1); getfilesize(in, size); char *buf = (char *)malloc(sizeof(char) * size + 1); if(buf == NULL){ cerr << "malloc buf error!" << endl; exit(1); in.read(buf, size); in.close(); buf[size] = ' '; return buf; void setbitmask(const char *filename, int *bit){ char *buf, *temp; temp = buf = fillbuf(filename); char *p = new char[11]; int len = 0; 4 / 6

while(*temp){ if(*temp == '\n'){ p[len] = ' '; len = 0; //cout<<p<<endl; setbit(bit, atoi(p)); else{ p[len++] = *temp; temp++; delete buf; void comparebit(const char *filename, int *bit, vector &result){ char *buf, *temp; temp = buf = fillbuf(filename); char *p = new char[11]; int len = 0; while(*temp){ if(*temp == '\n'){ p[len] = ' '; len = 0; if(getbit(bit, atoi(p))){ result.push_back(atoi(p)); else{ p[len++] = *temp; temp++; delete buf; int main(){ vector result; unsigned int MAX = (unsigned int)(1 << 31); unsigned int size = MAX >> 5; int *bit1; bit1 = (int *)malloc(sizeof(int) * (size + 1)); if(bit1 == NULL){ cerr<<"malloc bit1 error!"<<endl; exit(1); 5 / 6

Powered by TCPDF (www.tcpdf.org) memset(bit1, 0, size + 1); setbitmask("file1", bit1); comparebit("file2", bit1, result); delete bit1; cout<<result.size(); sort(result.begin(), result.end()); vector< int >::iterator it = unique(result.begin(), result.end()); ofstream of("result"); ostream_iterator output(of, "\n"); copy(result.begin(), it, output); return 0; ( 转载请注明 :https://www.iteblog.com/archives/148, 请不要用于商业目的 ) 本博客文章除特别声明, 全部都是原创! 原创文章版权归过往记忆大数据 ( 过往记忆 ) 所有, 未经许可不得转载 本文链接 : () 6 / 6