标签:
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++;
通过更多的空间来减少初始化的时间,所以只能在空间便宜时间昂贵,而且向量比较稀疏的情况下使用。
标签:
原文地址:http://www.cnblogs.com/bukekangli/p/4278856.html