压缩空间技术 稀疏数据结构
来源:互联网 发布:淘宝商品推广文案 编辑:程序博客网 时间:2024/05/17 23:03
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()的成本:分配实际内存比所需大。
- 内存对齐。
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])作为查询元素的列下标。一个表示元素列下标含义的数组。一个表示存储有用元素的数组。这点可以查看《编程珠玑》压缩空间章节。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)。这就使得此种稀疏数据结构优于稀疏数组。
此次笔记记录完毕。
0 0
- 压缩空间技术 稀疏数据结构
- 【算法】三项式数据结构压缩稀疏矩阵
- 压缩稀疏
- 数据结构学习笔记--稀疏矩阵的压缩存储
- 数据结构——稀疏矩阵的压缩存储
- 数据结构进阶(二)矩阵(稀疏矩阵)的压缩存储
- 【数据结构】对称矩阵和稀疏矩阵的压缩存储
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 稀疏矩阵压缩存储
- 稀疏矩阵的压缩
- 数据结构 对称矩阵的压缩存储与稀疏矩阵的转置
- 【数据结构】稀疏矩阵的压缩存储和转置算法(C++代码)
- 数据结构编程笔记十三:第五章 数组和广义表 稀疏矩阵的压缩存储实现
- 【数据结构】特殊矩阵的压缩存储2——稀疏矩阵
- 数据结构 稀疏矩阵运算器
- 数据结构--稀疏矩阵
- 数据结构之稀疏矩阵
- [数据结构复习]稀疏矩阵
- 用数组代替if-else和switch-case语句
- CSS学习笔记
- 块设备读写流程
- 2014hulu笔试题
- HTTP中GET与POST的区别
- 压缩空间技术 稀疏数据结构
- OpenCV4Android开发之旅(三)----Windows平台Eclipse、MinGW配置OpenCV2.4.4(C++接口调用) 全过程(附:MinGW编译OpenCV2.4.4)
- 项目开发随心记
- #pragma
- 成功搭建Django本地环境
- Installation SUSE Linux Enterprise Server 11
- IO端口和IO内存映射【waitting】
- 解决SecureCRT报错的问题
- 触控发布Cocos 3D引擎 Unity打响引擎战争