位图排序概要 编程珠玑(第一章)-----学习笔记
2013-06-23 16:58
316 查看
位图或者位向量可以表示一系列序列集合,比如:可用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合。例如可用如下字符串表示集合
{1,2,3,5,8,13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 集合中为1的代表整数集合中的该数。
这种表示有一些限制:输入数据限制在相对较小的范围内,数据没有重复,而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。
分三个自然阶段来编写程序,第一阶段讲所有为都置为0,从而讲集合初始化为空,第二阶段通过读入文件中的每个整数来建立集合,将每个对应位都置为1,第三阶段
检验每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。
这里是c的实现代码,每个字节32位,所以需要/32来找到字节位,然后n要和32取余,n%32,转化为为操作就是n&0x1F。
c++中有现成的数据结构bitset<>可以用,简单使用:
{1,2,3,5,8,13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 集合中为1的代表整数集合中的该数。
这种表示有一些限制:输入数据限制在相对较小的范围内,数据没有重复,而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。
分三个自然阶段来编写程序,第一阶段讲所有为都置为0,从而讲集合初始化为空,第二阶段通过读入文件中的每个整数来建立集合,将每个对应位都置为1,第三阶段
检验每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。
#include <stdio.h> #define MAX 1000000 #define SHIFT 5 #define MASK 0x1F #define DIGITS 32 int a[1+MAX/DIGITS]; void set(int n) //将逻辑位置为n的二进制位置为1 { a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK)); //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置, } //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1. void clear(int n) { a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK))); //将逻辑位置为n的二进制位置0,原理同set操作 } int test(int n) { return a[n>>SHIFT] & (1<<(n&MASK)); //测试逻辑位置为n的二进制位是否为1 } int main() { int i,n; for(i=1;i<=MAX;i++) { clear(i); } while(scanf("%d",&n)!=EOF) { set(n); } for(i=1;i<=MAX;i++) { if(test(i)) printf("%d ",i); } return 0; }
这里是c的实现代码,每个字节32位,所以需要/32来找到字节位,然后n要和32取余,n%32,转化为为操作就是n&0x1F。
c++中有现成的数据结构bitset<>可以用,简单使用:
#include <iostream> #include<bitset> #define MAX 1000000 using namespace std; bitset<MAX+1> bit; //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0 int main() { int n,i; while(cin>>n) { bit.set(n,1); //将第n位置1 } for(i=0;i<=MAX+1;i++) { if(bit[i]==1) cout<<i<<endl; } return 0; }
相关文章推荐
- 位图排序概要 编程珠玑(第一章)-----学习笔记
- 编程珠玑(2)第一章学习之位图排序
- java实现位图排序算法《编程珠玑》第一章笔记
- 《编程珠玑》第一章-位图排序
- 《编程珠玑》第一章-位图排序
- 位图排序——《编程珠玑》笔记
- 【编程珠玑】学习笔记4——排序
- Jackson 概要学习笔记
- 《Java Concurrency in Practice》 学习笔记--第一章:引言
- 数据结构&算法学习笔记: 快速排序
- 【Java学习笔记】使用Collator进行本地化语言的排序
- 学习笔记:第一章 计算机系统基础知识
- 学习Linux笔记(二)-常用+查找排序
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- C程序设计学习笔记之第一章习题
- 学习笔记----快速排序的java实现及其改良
- 【Spark学习笔记】第一章 Windows10(64位)主机上搭建基于IntelliJ IDEA的spark+scala开发环境
- 【疯狂Java学习笔记】【第一章:Java语言概述】
- python-MySQL学习笔记-第一章链接到并创建数据库
- 百度IFE学习笔记(一)js二维数组排序