C++稀疏数组

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++稀疏数组相关的知识,希望对你有一定的参考价值。

一.基本介绍

稀疏就是“少”的意思嘛,数组我们也知道就是一种基础的顺序存储结构。对于数组来说,一般无用的位置都标0,有实际意义的地方给出具体的值,所以当空闲的位置(标0)很多时我们就认为它很稀疏。

如下图所示,我们后面的例子也以此二维数组为例:


这样就对数组的空间造成了极大的浪费,所以我们引出了稀疏数组来节约空间,我们只记录数组中有效的数据,稀疏数组的结构如下:

数组下标行(row)列(col)值(value)
0577
1051
2102
3132
4223
5308
6367
7444

说明:数组第一行(下标为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++稀疏数组的主要内容,如果未能解决你的问题,请参考以下文章

C++中的稀疏数组

如何使用 C++ 将 Eigen 稀疏矩阵转换为数组?

为啥此代码片段返回意外结果?

使用 Armadillo C++ 加载稀疏矩阵

Java数据结构—稀疏数组

稀疏数组