压缩存储数据是一个比较高效、节省空间的方法,当我们存储的数据足够大时,我们要尽量避免数据的冗余重复,减少空间的浪费。对阵矩阵的压缩存储就是一个简单的实例。

算法分析与设计

如下图所示,我们要存储的是一个5×5的矩阵,方阵的特点是红色对称轴的对称位置的数据相同,比如(1,0)与(0,1)处的数据相同,(2,3)与(3,2)处的数据相同,即Aij==Aji(0 <= i <= N-1 && 0 <= j <= N-1)。因此,我们只需要存储红色三角形内的数据,即下三角区,当查找上三角区的数据时,我们通过一个坐标的转换来得到数据。

这样一来,原N×N的矩阵含有数据元素为N×N个,现在就转换成N×(N+1)/2个数据元素的存储,当N足够大时,节省的空间是非常可观的。

仔细观察列与行的关系可知:下三角区行大于等于列(i>=j),上三角区行小于列(i

源代码及注释

#pragma once

#include

using namespace std;

template

class SymmetricMatrix

{

public:

SymmetricMatrix(int *a, size_t N) //构造函数

:_pData(new T[N*(N + 1) / 2])

,_N(N)

{

size_t idx = 0;

for (size_t i = 0; i < N; ++i)

{

for (size_t j = 0; j < N; ++j)

{

//存入下三角数据

if (i >= j)

{

_pData[idx] = a[i*N + j];

++idx;

}

else

break;

}

}

}

~SymmetricMatrix()//析构函数

{

delete[] _pData;

_pData = NULL;

_N = 0;

}

//重载输出运算符

template

friend ostream& operator<& s)

{

for (size_t i = 0; i < _N; ++i)

{

for (size_t j = 0; j < _N; ++j)

{

_cout << s.Access(i, j) << " ";

}

_cout << endl;

}

return _cout;

}

void Display()//打印矩阵

{

for (size_t i = 0; i < _N; ++i)

{

for (size_t j = 0; j < _N; ++j)

{

cout << Access(i, j) << " ";

}

cout << endl;

}

}

T& Access(size_t i, size_t j)

{

//上三角转为转下三角

if (i < j)

swap(i, j);

return _pData[i*(i + 1) / 2 + j];

}

const T& Access(size_t i, size_t j) const

{

//上三角元素转下三角

if (i < j)

swap(i, j);

return _pData[i*(i + 1) / 2 + j];

}

protected:

T* _pData;//压缩存储的一维数组

size_t _N;//N*N的矩阵

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

#pragma once

#include

usingnamespacestd;

template

classSymmetricMatrix

{

public:

SymmetricMatrix(int*a,size_tN)//构造函数

:_pData(newT[N*(N+1)/2])

,_N(N)

{

size_tidx=0;

for(size_ti=0;i

{

for(size_tj=0;j

{

//存入下三角数据

if(i>=j)

{

_pData[idx]=a[i*N+j];

++idx;

}

else

break;

}

}

}

~SymmetricMatrix()//析构函数

{

delete[]_pData;

_pData=NULL;

_N=0;

}

//重载输出运算符

template

friendostream&operator<&s)

{

for(size_ti=0;i<_n>

{

for(size_tj=0;j<_n>

{

_cout<

}

_cout<

}

return_cout;

}

voidDisplay()//打印矩阵

{

for(size_ti=0;i<_n>

{

for(size_tj=0;j<_n>

{

cout<

}

cout<

}

}

T&Access(size_ti,size_tj)

{

//上三角转为转下三角

if(i

swap(i,j);

return_pData[i*(i+1)/2+j];

}

constT&Access(size_ti,size_tj)const

{

//上三角元素转下三角

if(i

swap(i,j);

return_pData[i*(i+1)/2+j];

}

protected:

T*_pData;//压缩存储的一维数组

size_t_N;//N*N的矩阵

};

//test.c

#include "SymmetricMatrix.h"

void Func()

{

int a[5][5] = { 0,1,2,3,4,

1,0,1,2,3,

2,1,0,1,2,

3,2,1,0,1,

4,3,2,1,0 };

SymmetricMatrix s((int*)a, 5);

s.Display();

cout << s.Access(0,1) << endl;

cout << s.Access(1,0) << endl;

}

int main()

{

Func();

system("pause");

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//test.c

#include "SymmetricMatrix.h"

voidFunc()

{

inta[5][5]={0,1,2,3,4,

1,0,1,2,3,

2,1,0,1,2,

3,2,1,0,1,

4,3,2,1,0};

SymmetricMatrixs((int*)a,5);

s.Display();

cout<

cout<

}

intmain()

{

Func();

system("pause");

return0;

}

c语言对称矩阵的压缩存储_C++实现对称矩阵的压缩存储 | 术与道的分享相关推荐

  1. c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享

    #include #include #include #include #include #pragma warning (disable:4996) enum Contact //枚举变量 { Qu ...

  2. c语言局部变量存在什么区_C语言程序设计变量运用指南 C语言局部变量的存储方式和生存期...

    动态存储方式与静态存储方式 从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量.从变量值存在的时间(即生存期)来观察,有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其 ...

  3. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. ElasticSearch探索之路(四)索引原理:倒排索引、列式存储、Fielddata、索引压缩、联合索引

    文章目录 倒排索引 Term dictionary与Term index 列式存储--Doc Values Fielddata 索引压缩 FOR编码 Roaring Bitmaps 联合索引 倒排索引 ...

  5. 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...

    2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...

  6. C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果。

    /*C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果.*/#include <stdio.h> #include <conio.h& ...

  7. 【C语言进阶】从入门到入土(数据的存储)

    前言: 这一篇我们来深度剖析数据在内存中的存储,让我们走进数据在内存中到底是任何进行存储的,不同的数据类型有何差异. 进阶之数据的存储: 一.数据类型详细介绍及归类 1.数据类型介绍 2.类型的基本归 ...

  8. Java语言TAR文件(文件夹)批量打包压缩

    最近项目中需要将文件和文件夹一起打包压缩为tar.gz文件,特此记录便于日后查阅. package com.openailab.oascloud.file.util;import org.apache ...

  9. zip 压缩方式:按标准方式和存储方式压缩

    上来先是标准方式的压缩 /*** 标准方式压缩* @param zipFileName* @param inputFile* @throws Exception*/public static void ...

最新文章

  1. Dell遇载软件出问题!可能被安装软件含有病毒
  2. linux 中文乱码问题的解决方法
  3. spring cloud使用hystrix实现断路保护机制
  4. ONE- Open Navigator Engine 开放式浏览器引擎
  5. Spring常见面试题
  6. 40元老年机摇身一变成“华为”手机:半年卖了7000多台?
  7. 论文阅读:Non-local Neural Networks
  8. Latex 图像总是出现在目标页的下一页置顶
  9. 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】
  10. 【进阶版】 机器学习之聚类算法原理详解+案例解说(14)
  11. uniapp开发微信小程序canvas动画入门
  12. STC4054锂电池充电IC
  13. 上古卷轴ol服务器正在维护,上古卷轴ol服务器在哪 | 手游网游页游攻略大全
  14. MATLAB批量修改图片名称
  15. 计算机默认应用程序怎么取消,如何取消默认打开的QQ浏览器
  16. javaee实训报告总结_JavaEE实训报告.doc
  17. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)2017版
  18. 医疗图像分割(二)snake模型综述
  19. java 程序理解 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  20. 睡眠即醒 蓝牙_众人皆睡你独醒?Bose遮噪睡眠耳塞用黑科技助你酣睡!

热门文章

  1. C语言试题151之求 0到7 所能组成的奇数个数。
  2. Foxmail 邮件的备份与恢复
  3. 住房公积金专办员题库(含答案)
  4. linux3.10.46源码下载,Ubuntu11.10下编译android源码4.0.3
  5. 智源社区AI周刊No.100:李飞飞等最新文章:社会化人工智能;DreamFusion:Google发布“文本-3D”生成新成果...
  6. BP神经网络隐藏层单元数的选择--(1)
  7. ppt如何转换pdf
  8. 1. 工业大数据的内涵
  9. 博客园屏蔽博文页面广告的方法
  10. Citrix 服务器虚拟化之二十五 桌面虚拟化之XenDesktop高可用性