压缩空间技术 稀疏数据结构

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;

时间复杂度为O(n)。不过稀疏数组可达压缩数据空间目的条件为:稀疏矩阵中相同元素的数目得至少得超过三分之二


[2]稀疏链表

由于链表中的每一个结点都多了一个指针元素,所以稀疏链表比稀疏数组占用更多的内存。而且对于稀疏链表来说还有两点必须考虑:

  • 如果采用malloc()为每个结点分配内存,则还要考虑malloc()的成本:分配实际内存比所需大。
  • 内存对齐。
访问(i,j)元素时跟稀疏数组的伪码相差不大:
for (;p; p = p->next)
    if p->row ==I && p->col == j
       return p->element;
return -1;

稀疏链表适用于稀疏矩阵的维数特大且特稀的情况,且要考虑以上两个要素。时间复杂度O(n)。

[3]指针数组联合链表


行是具有元素行(下标表示),链表结点包含元素的列和元素本身,如果一行具有多个元素,则结点中的指针就指向下一个元素。访问(i,j)元素的伪码:
for (p = row[i]; p; p = p->next)
    if p->col == j
         return p->element;
return -1;

时间复杂度O(n)。因为此稀疏数据结构具有链表的结构,所以需要考虑到稀疏链表里面提到的两点。也需要注意满足稀疏数据结构的两个基本点。

[4] 数组联合

用一个col数组结构中的col[i]和col[i + 1]元素表示此列具有多少个元素,而且用[col[i], col[i+1])作为查询元素的列下标。一个表示元素列下标含义的数组。一个表示存储有用元素的数组。这点可以查看《编程珠玑》压缩空间章节。
压缩空间技术 稀疏数据结构_第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;

查找元素的时间复杂度为O(n)。采用这个结构的好处在于:

  • 不含链表结点。不存在稀疏链表数据结构中需要注意的问题。
  • col数组的维数等于稀疏矩阵的维数加1,不必跟元素个数一样。
  • 可能可以对row和col数组进行数据压缩(32bit -->16bit--->8bit)。这就使得此种稀疏数据结构优于稀疏数组。
程序设计时还需要考虑设计的稀疏数据结构是否符合最起码的要求,然后才是结合运行时间选择最优的一种稀疏数据结构。
此次笔记记录完毕。

你可能感兴趣的:(压缩空间技术 稀疏数据结构)