您的位置:首页 > 编程语言

《编程珠玑》笔记10 节省空间

2012-09-07 13:37 246 查看
本章主要讨论如何节省程序所占用的空间(包括数据空间和代码空间),用现在的观点来看,后面的一些做法有时为了节省空间确实有点“无所不用其极”.

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成另一个关键字,使用短的这个关键字就可以描述名字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: