可压缩矩阵
① 高分求c++实现矩阵压缩,答对有加分!速度
给你写好了,运行成功了。
注意有两个文件。
//array2d.h
#ifndef _ARRAY2D_H
#define _ARRAY2D_H
#include <xutility>
template<typename T>
class array2d
{
// Data
protected:
T **m_ppData;
public:
long m_lRows, m_lCols;
// Constructor
public:
array2d()
{
Init(0, 0);
}
array2d(long lRows, long lCols)
{
Init(lRows, lCols);
}
array2d(const array2d& other)
{
Init(other.GetRows(), other.GetCols());
T **pTmp = other.GetData();
if (m_lRows && m_lCols)
{
(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
}
}
array2d<T> operator= (const array2d& other)
{
Destroy();
Init(other.GetRows(), other.GetCols());
T **pTmp = other.GetData();
(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
return *this;
}
virtual ~array2d()
{
Destroy();
}
// Attribute
// 重载()对数组元素进行存取
T& operator()(long lRows, long lCols)
{
return m_ppData[lRows][lCols];
}
long GetRows() const
{
return m_lRows;
}
void SetRows(long lRows)
{
m_lRows = lRows;
}
long GetCols() const
{
return m_lCols;
}
void SetCols(long lCols)
{
m_lCols = lCols;
}
void GetSize(long *plRows, long *plCols) const
{
*plRows = m_lRows;
*plCols = m_lCols;
}
void SetSize(long lRows, long lCols)
{
m_lRows = lRows;
m_lCols = lCols;
}
T** GetData() const
{
return m_ppData;
}
private:
void Init(long lRows, long lCols)
{
m_lRows = lRows;
m_lCols = lCols;
if (lRows <= 0 || lCols <= 0)
{
m_ppData = NULL;
return;
}
T *pTmp = new T[lRows*lCols];
m_ppData = new T*[lRows];
for (long i=0; i<lRows; ++i)
{
m_ppData[i] = &pTmp[i*lCols];
}
}
void Destroy()
{
if (m_ppData)
{
delete []m_ppData[0];
}
delete []m_ppData;
m_ppData = NULL;
}
};
#endif
//Matrix.cpp,你的主文件
#include "stdafx.h"
#include "array2d.h"
#include <vector>
using namespace std;
typedef array2d<int> CMatrix;
typedef vector<CMatrix> MatVec;
bool ReadFile(char * filename, MatVec &matvec)
{
if (!filename) return false;
FILE * fp = fopen(filename, "r");
if (!fp) return false;
int num;
fscanf(fp, "%d", &num);
matvec = MatVec(num);
for (int k=0; k<num; ++k)
{
int row, col;
fscanf(fp, "%d", &row);
fscanf(fp, "%d", &col);
matvec[k] = CMatrix(row, col);
int i, j;
int n;
for (i=0; i<row; ++i)
{
for (j=0; j<col; ++j)
{
fscanf(fp, "%d", &n);
matvec[k](i, j) = n;
}
}
}
fclose(fp);
return true;
}
bool WriteFile(char * filename, MatVec &matvec)
{
if (!filename) return false;
FILE * fp = fopen(filename, "w");
if (!fp) return false;
for (int k=0; k<matvec.size(); ++k)
{
fprintf(fp, "Matrix #%d\n", k+1);
int i, j;
for (i=0; i<matvec[k].GetRows(); ++i)
{
for (j=0; j<matvec[k].GetRows(); ++j)
{
if ( matvec[k](i, j) != 0 )
{
fprintf(fp, "%d, %d\n", i+1, j+1);
}
}
}
fprintf(fp, "\n");
}
fclose(fp);
return true;
}
int main(int argc, char* argv[])
{
MatVec matvec;
char * inputfilename = "f:\\SampleInput.txt";
if (!ReadFile(inputfilename, matvec)) return 1;
char * outputfilename = "f:\\Output.txt";
if (!WriteFile(outputfilename, matvec)) return 1;
printf("Hello World!\n");
return 0;
}
② 怎样压缩矩阵元素的存储空间
AC
稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数.
压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间.目的是节省大量存储空间.
当使用三元组顺序表(又称有序的双下标法)压缩存储稀疏矩阵时,对矩阵中的每个非零元素用三个域分别表示其所在的行号,列号和元素值.它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算.当矩阵中的非0元素少于1/3时即可节省存储空间.
③ 矩阵的压缩存储例子
稀疏矩阵压缩存储
一般来讲,零元素多到了一定程度并且没有规律分布的矩阵叫做稀疏矩阵。对稀疏矩阵的压缩存储必须充分考虑以下三个问题:
① 尽可能减少或者不存储零元素以节省空间,降低空间复杂度。
② 尽可能快地实现数据元素的存储位置与原有位置之间的转换。
③ 尽可能不与零元素进行运算,以降低时间复杂度。
稀疏矩阵的压缩存储有三种最常见的方法,分别是三元组顺序表、行逻辑链接顺序表和十字链表。
④ 矩阵的压缩存储是什么
二维数组在形式上是矩阵,因此一般用二维数组来存储矩阵。在不压缩存储的情况下,矩阵采用按行优先或按列优先方式存储,占用的存储单元数等于矩阵的元素个数。在实际应用中,经常出现一些阶数很高的矩阵,同时在矩阵中非零元素呈某种规律分布或者矩阵中有大量的零元素,若仍然用常规方法存储,可能存储重复的非零元素或零元素,这将造成存储空间的大量浪费。因此对这类矩阵进行压缩存储,从而合理地利用存储空间。
为了节省存储空间,可以利用特殊矩阵的规律,对它们进行压缩存储,也就是说为多个值相同的元素只分配一个存储单元,对零元素不分配空间。适合压缩存储的矩阵一般是值相同的元素或者零元素在矩阵中分布有一定规律的特殊矩阵和稀疏矩阵。常见的特殊矩阵有对称矩阵、三角矩阵和对角矩阵。
⑤ 特殊矩阵的压缩存储算法的实现
还不简单。就这样那样这样那样的。我以为你以为的、
⑥ 用C语言编写:特殊矩阵的压缩存储算法的实现(对称矩阵、三角矩阵、对角矩阵)
可以用十字链表 三元组表 或者其他 都可以对特殊矩阵进行压缩存储
⑦ n阶对称矩阵可压缩存储到多少个元的空间中
只要存对角线(含)以上的部分就行了,所以是1+2+...+n=n(n+1)/2
⑧ 对特殊矩阵的压缩可以降低运算的时间复杂度吗
1.k=n*(n+1)/2的原因是:对于三角矩阵,从1到N的总和是这么多,也就是说整个矩阵有这么多元素。另外正三角阵对应正方形。
对称矩阵满足A的转置也就是自身的特点,元素上,a[i,j] = a[j,i]。实际上的存储可以利用三角阵。所以老实说我对于他对称阵算法为什么少一个元素也有疑惑。
可能是三角阵可以对应不等长的矩阵,所以造成了k值不一样。
2.上三角阵,存在的元素是满足[1<= j <=n, i >= j]的关系[这里用i表横坐标j表纵坐标],如果是长3宽4的当然不能和长4宽3的相提并论,试着画画就明白了。
3.对称阵不会出现像三角阵那样有一小角还是其他数字的情况。这个其他数字就是(6+1)-1=6。
4.压缩存储,只是将部分符合条件的矩阵减少一部分的存储空间。老实说我也感觉不很有用,除非他处理的数据本身必然具备此类特点。
5.固定的,多试几次自己记下来然后找找就好。如果没记错的话,在矩阵上画画就可以看出来。
6.stdlib.h是标准的输入输出库,最为常用,至少里面包括了scanf等函数,只要你需要printf你就不能扔掉它。否则会出现函数未定义的问题。毕竟语言本身不提供函数类库,类库需要另行引用。
⑨ 什么是压缩矩阵
在这里分开来给你解释
矩阵是许多科学计算、工程数学尤其是数值分析中经常研究的对象,矩阵也就是二维数组,所以它可以采用顺
序存储是来存储其中的元素。但有时矩阵的阶数很高,同时在矩阵中游很多值相同的元素,或大多数元素的值为
零,这时再采用严格的顺序存储显然是很浪费空间的,因为存储零元素或许多值相同的元素是没有意义的,因此为
了节省存储空间,对这类矩阵通常采用压缩存储。
压缩存储:为多个值相同的元素值分配一个存储空间,对零元素不分配存储空间。
特殊矩阵:各个元素的分布有一定规律
系数矩阵:矩阵中多数元素值为零。