C++稀疏数组
Posted 桃陉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++稀疏数组相关的知识,希望对你有一定的参考价值。
一.基本介绍
稀疏就是“少”的意思嘛,数组我们也知道就是一种基础的顺序存储结构。对于数组来说,一般无用的位置都标0,有实际意义的地方给出具体的值,所以当空闲的位置(标0)很多时我们就认为它很稀疏。
如下图所示,我们后面的例子也以此二维数组为例:
这样就对数组的空间造成了极大的浪费,所以我们引出了稀疏数组来节约空间,我们只记录数组中有效的数据,稀疏数组的结构如下:
数组下标 | 行(row) | 列(col) | 值(value) |
---|---|---|---|
0 | 5 | 7 | 7 |
1 | 0 | 5 | 1 |
2 | 1 | 0 | 2 |
3 | 1 | 3 | 2 |
4 | 2 | 2 | 3 |
5 | 3 | 0 | 8 |
6 | 3 | 6 | 7 |
7 | 4 | 4 | 4 |
说明:数组第一行(下标为0)存放原数组的行数、列数以及有效的数据个数。其余行依次存放有效数据的行数、列数以及值。
我们应用的时候最需要学会的就是原数组与稀疏数组的相互转换。
∙ \\bullet ∙ 原数组–>稀疏数组
(1)遍历一遍原数组获得有效数据个数sum,行数row、列数col。
(2)建立稀疏数组规模为:row+1行,3列。
(3)从第二行开始存入有效数据的信息
(4)第一行存入原数组规模与有效数字个数。
∙ \\bullet ∙ 稀疏数组–>原数组
(1)读取稀疏数组第一行信息,得到原数组行数row、列数col。
(2)建立原数组规模为:row行,col列。
(3)从第一行开始遍历稀疏数组,分别将有效数据放入原数组中对应位置。
二.代码实现
#include<cstdlib>
#include<iostream>
#include<vector>
using namespace std;
/*
实现原数组与稀疏数组的相互转换
使用vector作为存储容器
*/
//原数组转稀疏数组
vector<vector<int>> arrayToSparse(vector<vector<int>>array,int row,int col)
{
vector<vector<int>>sparseArr;
int Srow=0,Scol=0,value=0,count=0;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(array[i][j]!=0)
{
count++;
//从第二行开始记录数据
sparseArr.push_back({i,j,array[i][j]});
}
}
}
sparseArr.insert(sparseArr.begin(),{row,col,count});
return sparseArr;
}
//稀疏数组转原数组
vector<vector<int>> sparseToArray(vector<vector<int>> sparseArr)
{
int n=sparseArr[0][0],m=sparseArr[0][1];
vector<vector<int>>array1(n,vector<int>(m,0));
for(int i=1;i<sparseArr.size();i++)
{
int row = sparseArr[i][0];
int col = sparseArr[i][1];
int value = sparseArr[i][2];
array1[row][col] = value;
}
return array1;
}
//打印数组
void printArr(vector<vector<int>>arr)
{
int row=arr.size();
int col=arr[0].size();
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
//row、col为原数组行数、列数
int row=0,col=0,num=0;
cin>>row>>col;
//建立原数组
vector<vector<int>>array(row,vector<int>(col,0));
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cin>>num;
array[i][j]=num;
}
}
//输出原数组
cout<<"The original array:"<<endl;
printArr(array);
//构建稀疏数组
vector<vector<int>>sparseArr;
//array1为稀疏数组还原而成的原数组
vector<vector<int>>array1;
//原数组转稀疏数组
sparseArr = arrayToSparse(array,row,col);
cout<<"sparseArray:"<<endl;
printArr(sparseArr);
//稀疏数组转原数组
array1 = sparseToArray(sparseArr);
cout<<"array1:"<<endl;
printArr(array1);
system("pause");
return 0;
}
/*
5 7
0 0 0 0 0 1 0
2 0 0 2 0 0 0
0 0 3 0 0 0 0
8 0 0 0 0 0 7
0 0 0 0 4 0 0
*/
三.结果展示
以上是关于C++稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章