《编程珠玑》笔记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为行)。用如下代码搜索
上面的方法使用了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)的点的代码:
共有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成另一个关键字,使用短的这个关键字就可以描述名字。
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成另一个关键字,使用短的这个关键字就可以描述名字。
相关文章推荐
- Django学习笔记10-URL的名称空间
- 编程珠玑--节省空间
- (9~10)代码调优、空间节省
- 《编程珠玑》阅读小记(7) — 代码调优与节省空间
- oracle 11g 学习笔记 10_31_管理表空间和数据文件
- 《编程珠玑》阅读小记(7) — 代码调优与节省空间
- oracle 11g 学习笔记 10_31_管理表空间和数据文件
- C++ Primer 学习笔记_105_特殊工具与技术 --联合:节省空间的类
- C++笔记10--命名空间(namespace scope)
- 编程珠玑:第10章 节省空间 10.1 稀疏矩阵表示 ---- 解题总结
- iOS开发 - 兼容iOS 10 资料整理笔记
- 深入Python3 (Dive Into Python3)笔记10--重构
- Adobe&nbsp;Flex学习笔记(10)-&nbsp;Flex保…
- 命名空间、闭包、上下文管理器、鸭子类型与多态(10)
- oracle 11g 学习笔记 2012_10_24(1)
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- 笔记10--遇到的错误
- ExtJs4 笔记(10) Ext.tab.Panel 选项卡
- js笔记(10)之无缝滚动
- (10)Java笔记10之类和对象