《编程珠玑》笔记10 节省空间
本章主要讨论如何节省程序所占用的空间(包括数据空间和代码空间),用现在的观点来看,后面的一些做法有时为了节省空间确实有点“无所不用其极”.
1.考虑这样一个矩阵存储的问题
假设有一个200*200的稀疏矩阵(总共40000个元素),大约只有2000个点是有值的,其余元素认为是0,怎样以最小的空间代价来存储该数组呢?

以下假设整数采用16位。
(1)使用普通的200*200的数组,就需要 40000*2 = 80KB的内存空间。
(2)使用一个数组表示给定的列,然后使用链表来表示给定列中的非0元素。

从上图中看出,第一列3个点,第二列2个点,第三列没有,.......
对于点(i,j)——用坐标表示(i为列,j为行)。用如下代码搜索
for(p = colhead[i]; p != NULL; p = p->next) if(p->row == j) return p->pointnum return 0
上面的方法使用了200个指针和2000条记录,每个记录两个整数一个指针,共12字节, 200*4+2000*12 = 24800字节,即24.8KB.
(2)书上描述的另一种方法是称为CSC的方法。使用一个201元的数组表示列,使用两个2000元数组表示相应的点。

其中 firstincol[i] 存储 第i列的起始下标。第i列中的点有数组row和pointnum中位于firstincol[i]和firstincol[i+1]-1之间元素表示,确定(i,j)的点的代码:
for( k = firstincol[i]; k < firstincol[i+1]; k++) if(row[k] == j) return pointnum[k] return 0
共有4201个整数,2*4201= 8402B = 8.4KB.
经过以上步骤,空间由80KB缩小到8.4KB.
其实可以进一步缩小空间,由于row都小于200,只需一个字节即可存储,空间只需6.4KB。
(另外多说一句,与CSC相对应的还有CRC结构,是以行序为有限的存储方法,firstincol是以列序为优先的。这种存储方法对于0-1数组非常有效,就是数组元素通常非0即1,这是我们就不需要pointnum数组。这常见与图结构中,我们表示图的连通性是经常用这样的数组,在计算BFS和DFS可能会用到)
2.数据空间技术
减少程序所需数据存储空间的技术:
(1)不存储,重新计算。——主要用于生成器程序
(2)稀疏数据结构——使用关键字索引方法,如稀疏矩阵中的三元组法,CSC等.
(3)指针共享大型对象
(4)数据压缩:对两字节的整数c用两个单字节的整数a和b表示:c = 10*a+b. a = c/10; b = c%10.
(5)分配策略:采用动态分配,使用可变长数组
(6)垃圾回收
3.代码空间技术
(1)函数定义
(2)解释程序
(3)使用汇编
4.习题8:
日期可以根据相应的数字范围大小,如DD一定在1~31之间,使用1字节,MM一定在1~12之间,使用1字节。YYYY使用2字节,总共只需4字节。
社会保障号与日期同理。
对于名字,由于姓大部分人是相同的,可以使用一个hash表将姓hash成另一个关键字,使用短的这个关键字就可以描述名字。

浙公网安备 33010602011771号