码迷,mamicode.com
首页 > 编程语言 > 详细

[编程珠玑]位向量与排序

时间:2018-04-22 16:01:45      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:span   数通   实现   整数   bit   标识   保存   32位   void   

[编程珠玑]位向量与排序

源于《编程珠玑》第2版(修订版) 第1章中第8页习题2

什么是位向量?

位向量是一种高效的整数结构,每一个32位的整数通过设置或清除它的某一位,可以保存32个数。如果是一个数组,则可以存更多的数。

此题目的是用于对一组小于N的无重复的非负整数排序:

1 #define BITSPERWORD 32
2 #define SHIFT 5
3 #define MASK 0x1F
4 #define N 10000000
5 int a[1 + N/BITSPERWORD];
6 void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK));}
7 void clr(int i) { a[i>>SHIFT] & ~(1<<(i & MASK));}
8 int test(i) { return a[i>>SHIFT] & (1<<(1 & MASK));}

分析:

对输入数据作如下假定:(1)都是非负整数,(2)每个整数最多出现一次,(3)最大整数小于 n。

这种方法采用哈希函数的思想,用一个整型数组 array[n] 来实现对输入数据的排序工作。具体点就是:

(1)初始化,将数组的每个元素清 0;

(2)插入数据并实现排序,对于输入数据 i,置 array[i] 为 1; 

(3)输出排序结果,如果 array[i] 为 1,就输出整数 i。

 

如果我们用整型数组来实现排序,那么标识一个数据需要 32 位;如果用 bool 类型数组来实现,需要 8 位;最后,如果用下面要说的位向量来实现的话,标识一个数据只需 1 位。

[编程珠玑]位向量与排序

标签:span   数通   实现   整数   bit   标识   保存   32位   void   

原文地址:https://www.cnblogs.com/devin_zhou/p/8859157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!