第一章:位向量/位图

1.位图排序

//1.关闭所有位,初始化集合为空
for i=[0,n)
    bit[i]=0;

//2.读取文件,打开相应的位,建立集合
for each i in the input file
    bit[i]=1;

//3.检查每个位,如果某个位为1,就写出相应的数,从而创建已排序的文件
for i=[0,n)
    if(bit[i])
        write i to the output file

2.位图的实现

2.1

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

int a[1+N/BITSPERWORD];

void clr(int i){
    a[i>>SHIFT] &= ~(1<<(i&MASK));
}

void set(int i){
    a[i>>SHIFT] |= (1<<(i&MASK));
}

int test(int i){
    return a[i>>SHIFT] & (1<<(i&MASK));
}

2.2 C++中bitset

3.生成[0,n)之间不重复的随机整数

//先把所有可能数顺序放到数组,然后打乱顺序,则保证不重复
for i=[0,n)
    a[i]=i;

for i=[0,n)
    swap(a[i], a[randint(i,n)]);

//随机返回一个[m,n)之间的值
int randint(int m,int n){
    return rand()%(n-m)+m;
}

4.首次访问元素时将其初始化

用空间换时间带来的一个问题是,初始化空间本身可能会占用大量时间。解决方案如下:

使用另外两个n元素向量form,to以及整数top中包含的符号能够初始化向量data[i]。如果data[i]已经初始化,那么from[i]<top并且to[form[i]]==i。

top=0;

//访问data[i]
form[i] = top;
to[top] = i;
data[i] = 0;
top++;

通过更多的空间来减少初始化的时间,所以只能在空间便宜时间昂贵,而且向量比较稀疏的情况下使用。

原文地址:https://www.cnblogs.com/bukekangli/p/4278856.html