c语言对称矩阵的压缩存储_C++实现对称矩阵的压缩存储 | 术与道的分享
压缩存储数据是一个比较高效、节省空间的方法,当我们存储的数据足够大时,我们要尽量避免数据的冗余重复,减少空间的浪费。对阵矩阵的压缩存储就是一个简单的实例。
算法分析与设计
如下图所示,我们要存储的是一个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++实现对称矩阵的压缩存储 | 术与道的分享相关推荐
- c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享
#include #include #include #include #include #pragma warning (disable:4996) enum Contact //枚举变量 { Qu ...
- c语言局部变量存在什么区_C语言程序设计变量运用指南 C语言局部变量的存储方式和生存期...
动态存储方式与静态存储方式 从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量.从变量值存在的时间(即生存期)来观察,有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其 ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- ElasticSearch探索之路(四)索引原理:倒排索引、列式存储、Fielddata、索引压缩、联合索引
文章目录 倒排索引 Term dictionary与Term index 列式存储--Doc Values Fielddata 索引压缩 FOR编码 Roaring Bitmaps 联合索引 倒排索引 ...
- 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...
2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...
- C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果。
/*C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果.*/#include <stdio.h> #include <conio.h& ...
- 【C语言进阶】从入门到入土(数据的存储)
前言: 这一篇我们来深度剖析数据在内存中的存储,让我们走进数据在内存中到底是任何进行存储的,不同的数据类型有何差异. 进阶之数据的存储: 一.数据类型详细介绍及归类 1.数据类型介绍 2.类型的基本归 ...
- Java语言TAR文件(文件夹)批量打包压缩
最近项目中需要将文件和文件夹一起打包压缩为tar.gz文件,特此记录便于日后查阅. package com.openailab.oascloud.file.util;import org.apache ...
- zip 压缩方式:按标准方式和存储方式压缩
上来先是标准方式的压缩 /*** 标准方式压缩* @param zipFileName* @param inputFile* @throws Exception*/public static void ...
最新文章
- Dell遇载软件出问题!可能被安装软件含有病毒
- linux 中文乱码问题的解决方法
- spring cloud使用hystrix实现断路保护机制
- ONE- Open Navigator Engine 开放式浏览器引擎
- Spring常见面试题
- 40元老年机摇身一变成“华为”手机:半年卖了7000多台?
- 论文阅读:Non-local Neural Networks
- Latex 图像总是出现在目标页的下一页置顶
- 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】
- 【进阶版】 机器学习之聚类算法原理详解+案例解说(14)
- uniapp开发微信小程序canvas动画入门
- STC4054锂电池充电IC
- 上古卷轴ol服务器正在维护,上古卷轴ol服务器在哪 | 手游网游页游攻略大全
- MATLAB批量修改图片名称
- 计算机默认应用程序怎么取消,如何取消默认打开的QQ浏览器
- javaee实训报告总结_JavaEE实训报告.doc
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)2017版
- 医疗图像分割(二)snake模型综述
- java 程序理解 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- 睡眠即醒 蓝牙_众人皆睡你独醒?Bose遮噪睡眠耳塞用黑科技助你酣睡!
热门文章
- C语言试题151之求 0到7 所能组成的奇数个数。
- Foxmail 邮件的备份与恢复
- 住房公积金专办员题库(含答案)
- linux3.10.46源码下载,Ubuntu11.10下编译android源码4.0.3
- 智源社区AI周刊No.100:李飞飞等最新文章:社会化人工智能;DreamFusion:Google发布“文本-3D”生成新成果...
- BP神经网络隐藏层单元数的选择--(1)
- ppt如何转换pdf
- 1. 工业大数据的内涵
- 博客园屏蔽博文页面广告的方法
- Citrix 服务器虚拟化之二十五 桌面虚拟化之XenDesktop高可用性