压缩空间技术 稀疏数据结构
2013-12-29 23:31
225 查看
1 压缩空间技术
压缩是一种手段,压缩空间目的是为了使程序或程序运行时尽可能的使用更小的内存空间,以满足实际需求。压缩空间技术的使用往往需要结合时间复杂度来考虑。Jon Bentley大师在《Programming Pearls,编程珠玑》中写了两种压缩空间技术:数据空间压缩技术和编码空间技术。
数据空间压缩技术:
不保存对象,重新计算。
采用稀疏数据结构。
数据压缩(32bit-->16bit -->8bit)。
动态分配。
垃圾回收。
编码空间技术:
定义函数。
解释器。
转换成机器语言(对编译器的编译参数进行适当修改)。
这每一项压缩空间技术都可称作是经典,都需要在实际编程中不断的修炼。
2 稀疏数据结构
稀疏数据结构往往在元素排列比较离散的情况下被程序员设计而出现。如在程序中涉及稀疏矩阵数据结构的时候,程序员就会设计稀疏数据结构来代替稀疏矩阵。(1) 稀疏矩阵
“大多数项”都具同一值(通常为0)的矩阵。如以下4阶矩阵:若用数组来存储这些元素则可能为这样的形式:type a[][4] = {
{1, 0, 0, 0},
{0, 2, 0, 0},
{0, 0, 0, 0},
{0,0, 0, 3} };
(2) 代替稀疏矩阵的稀疏数据结构
由于稀疏矩阵中大多数都具0元素,往往在程序的实际用途中就不需要访问这些大多为0的项。在稀疏矩阵维数很大的情况下,还采用矩阵(数组)作为存储数据结构很显得很浪费空间。所以,程序员就想设计一种新的数据结构,只保存需要访问的数据元素及其相关属性,这种新的数据结构由于比较流行就被称作稀疏数据结构。它的设计方式有多种。设计出来的稀疏矩阵需要满足以下两个条件:稀疏矩阵存储数据后要比稀疏矩阵存储数据所占用的内存少。已达压缩数据空间的目的。
稀疏数据结构易被操作。
[1] 稀疏数组
这是最容易想到的一个稀疏数据结构。根据只存储稀疏矩阵中有用元素的宗旨及其相关属性的宗旨而出现:b[]= {0, 0, 1, 1, 1, 2, 3, 3, 3};
将稀疏(矩阵)数组里面的有用元素的坐标和值保存下来。这就将原本的16 个元素空间压缩到9个元素空间。且用以下伪码可访问到(i , j)元素:
for k = [0, 6] if(k = i && m == j) return b[i +2] return -1; |
[2]稀疏链表
由于链表中的每一个结点都多了一个指针元素,所以稀疏链表比稀疏数组占用更多的内存。而且对于稀疏链表来说还有两点必须考虑:
如果采用malloc()为每个结点分配内存,则还要考虑malloc()的成本:分配实际内存比所需大。
内存对齐。
访问(i,j)元素时跟稀疏数组的伪码相差不大:
for (;p; p = p->next) if p->row ==I && p->col == j return p->element; return -1; |
[3]指针数组联合链表
行是具有元素行(下标表示),链表结点包含元素的列和元素本身,如果一行具有多个元素,则结点中的指针就指向下一个元素。访问(i,j)元素的伪码:
for (p = row[i]; p; p = p->next) if p->col == j return p->element; return -1; |
[4] 数组联合
用一个col数组结构中的col[i]和col[i + 1]元素表示此列具有多少个元素,而且用[col[i], col[i+1])作为查询元素的列下标。一个表示元素列下标含义的数组。一个表示存储有用元素的数组。这点可以查看《编程珠玑》压缩空间章节。col与row数组之间稍有逻辑:col[i]与col[i + 1]之间的含义为col[i]列之上的元素个数,且col的维数为稀疏矩阵的维数加1。
用以下伪码可访问(i,j)元素:
for k = [col[i], col[i + 1]) if row[k] == j return element [k]; return -1; |
不含链表结点。不存在稀疏链表数据结构中需要注意的问题。
col数组的维数等于稀疏矩阵的维数加1,不必跟元素个数一样。
可能可以对row和col数组进行数据压缩(32bit -->16bit--->8bit)。这就使得此种稀疏数据结构优于稀疏数组。
程序设计时还需要考虑设计的稀疏数据结构是否符合最起码的要求,然后才是结合运行时间选择最优的一种稀疏数据结构。
此次笔记记录完毕。
相关文章推荐
- 第9周SHH数据结构-【项目3-稀疏矩阵的三元组表示的实现及应用(1)】
- 稀疏矩阵——数据结构
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
- matlab,可视化稀疏矩阵的数据结构(即非零元位于哪些位置)
- 数据结构 稀疏矩阵的基本操作
- 第9周SHH数据结构-【项目3-稀疏矩阵的三元组表示的实现及应用(2)】
- 数据结构--稀疏矩阵(转置)
- 数据结构-数组-稀疏矩阵三元组
- 第九周 数据结构实践项目——数组和广义表【项目3.2-- 稀疏矩阵相加】
- 数据结构--稀疏矩阵(相乘)
- 数据结构学习笔记--稀疏矩阵的压缩存储
- 数据结构2-数组和稀疏矩阵
- 数据结构稀疏矩阵的实现及转置
- 【数据结构】稀疏矩阵
- 2015年大二上-数据结构-数组与广义表(3)-1.稀疏矩阵的三元组表示
- 5-2-三元组顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- javascript实现数据结构: 稀疏矩阵之三元组线性表表示
- 数据结构-稀疏矩阵(三元组表示)
- 数据结构 稀疏矩阵 重写函数fast_transpose,使其不用两个数组而仅用一个数组存放row_terms和starting_pos