(编程珠玑)
位图表示能解决的问题应具有以下三个方面不常见的属性:
- 输入数据限制在相对较小的范围内
- 数据没有重复
- 对于每条记录而言,除了单一整数外,没有其他任何关联数据
若给定表示文件中整数集合的位图数据结构,则可以分三个自然阶段来编写程序:
- 将所有位都置为零,从而将集合初始化为空
- 通过读入文件中的每个整数来建立集合,将每个对应的位都置为1
- 检查每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。
令n为位向量中的位数,程序表示如下:
for i = [0, n )
bit[i]=0;
for each i in the input file
bit[i]=1;for i = [0, n )
if bit[i]==1
write i on the output file
自己的思考:
数据结构具有数值和位置两种属性。排序是根据数值来进行位置的确定。
位图之所以能够以较快的速度来运行,是因为它在读取数值的时候,能够不依赖其他数值的大小来进行位置的确定,而且是以O(1)的速度进行位置的确定(因为这里数据的大小就是其位置所在)。相比较其他的排序来说,没有了位置的多次变动,没有了比较,就加快了速度。
但是,位图能解决的问题的属性也限定了其应用范围。如果数据稀疏的分布在很大的范围,数据有重复,或者不是单一的数据。位图显然就不能解决了。