数据结构 | 第七章:数组和矩阵 | 行主映射和列主映射 | 稀疏矩阵

这篇具有很好参考价值的文章主要介绍了数据结构 | 第七章:数组和矩阵 | 行主映射和列主映射 | 稀疏矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

7.1 数组

7.1.1 抽象数据类型

抽象数据类型 Array 
{
实例
	形如(index,value)的数对集合,其中任意两个数对的index值都各不相同. 操作
	get(index):返回索引为index的数对中的值
	set(index,value):加入一个新数对(index,value)
    	(如果索引index值相同的数对已存在,则用新数对覆盖)
}

7.1.2 C++数组的索引

  • K维数组的索引(或下标)
    • [ i 1 ] [ i 2 ] [ i 3 ] . . . [ i k ] [i_1][i_2][i_3]...[i_k] [i1][i2][i3]...[ik]
  • k维数组创建:
    • int score [ u 1 ] [ u 2 ] [ u 3 ] . . . [ u k ] [u_1][u_2][u_3]...[u_k] [u1][u2][u3]...[uk] u i u_i ui—正的常量或有常量表示的表达式)
  • 数组元素的个数:
    • n = u 1 u 2 u 3 . . . u k n=u_1u_2u_3...u_k n=u1u2u3...uk
  • 内存空间:
    • n x sizeof(int)字节.
  • c++ 编译器为数组预留空间:
    • start -----start + sizeof(score)-1

7.1.3 行主映射和列主映射

行主映射(按行的顺序对元素一一映射)和列主映射(按列的顺序对元素一一映射)
行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

以二维数组举例

int s[ u 1 u_1 u1] [ u 2 u_2 u2] (令s[2] [3])

行主映射下: 列主映射下:
map( i 1 i_1 i1, i 2 i_2 i2) = u 2 u_2 u2 * i 1 i_1 i1 + i 2 i_2 i2 map( i 1 i_1 i1, i 2 i_2 i2) = u 1 u_1 u1 * i 2 i_2 i2 + i 1 i_1 i1
s[0] [0] s[0] [0]
s[0] [1] s[1] [0]
s[0] [2] s[0] [1]
s[1] [0] s[1] [1]
s[1] [1] s[0] [2]
s[1] [2] s[1] [2]

思考

  • 在C++使用的是行主映射

  • M 行 M_行 M= M 列 T M_列^T MT

  • k维数组行主映射:

    m a p ( i 1 , i 2 , . . . , i k ) = ( i 1 ∗ u 2 ∗ u 3 . . . u k ) + ( i 2 ∗ u 3 . . . u k ) + . . . + ( i k − 1 ∗ u k ) + ( i k ) map(i_1, i_2, ..., i_k) = (i_1*u_2*u_3 ... u_k)+(i_2*u_3 ... u_k)+...+(i_{k-1}*u_k)+(i_k) map(i1,i2,...,ik)=(i1u2u3...uk)+(i2u3...uk)+...+(ik1uk)+(ik)

  • k维数组列主映射:

    m a p ( j 1 , j 2 , . . . j k ) = ( j 1 ∗ u 2 ∗ u 3 . . . u k ) + ( j 2 ∗ u 3 . . . u k ) + . . . + ( j k − 1 ∗ u k ) + ( j k ) map(j_1,j_2,...j_k)= (j_1*u_2*u_3 ... u_k)+(j_2*u_3 ... u_k)+...+(j_{k-1}*u_k)+(j_k) map(j1,j2,...jk)=(j1u2u3...uk)+(j2u3...uk)+...+(jk1uk)+(jk)
    注意,超过两维就没有列的概念了,因此高维的行、列主映射公式通用。

7.1.4 用数组的数组来描述

多维数组可以用数组的数组描述行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

  • 占用空间:4×3×1 + 4×5×3

  • C++定位x[i] [j]的过程:

    • 利用一维数组的映射函数找到指针x[i]

    • 利用一维数组的映射函数找到指针x[i]所指的第i行中索引为j的元素

7.1.5 行主描述和列主描述

数组y 以下就是int s[3] [5]的行主描述 以下就是int s[3] [5]的列主描述
y[0] s[0] [0] s[0] [0]
y[1] s[0] [1] s[1] [0]
y[2] s[0] [2] s[2] [0]
y[3] s[0] [3] s[0] [1]
y[4] s[0] [4] s[1] [1]
y[5] s[1] [0] s[2] [1]
y[6] s[1] [1] s[0] [2]
y[7] s[1] [2] s[1] [2]
y[8] s[1] [3] s[2] [2]
y[9] s[1] [4] s[0] [3]
y[10] s[2] [0] s[1] [3]
y[11] s[2] [1] s[2] [3]
y[12] s[2] [2] s[0] [4]
y[13] s[2] [3] s[1] [4]
y[14] s[2] [4] s[2] [4]
  • 占用空间:3×5×4
  • 定位x[i] [j]的过程(以行主列为例):
    • 利用二维数组的映射函数(map( i 1 i_1 i1, i 2 i_2 i2) = u 2 u_2 u2 * i 1 i_1 i1 + i 2 i_2 i2)计算x[i] [j]在一维数组y中的位置u
    • 利用一维数组的映射函数(map( i 1 i_1 i1)= i 1 i_1 i1)访问元素y[u]

7.2 矩阵

7.2.1 定义和操作

m×n矩阵:m行和n列的表

M(i,j):矩阵M中第i行、第j列的元素

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

矩阵相乘直观表示(* ^ ▽ ^ *)

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

7.2.2 类matrix

数据描述:用于一个一维数组element,按行主次序存储

M:m×n matrix

  • 矩阵元素M(i,j)在数组element中的位置
  • map(i,j) = (i-1)*n+j-1
matrix类声明

我们要重载函数操作符(),使得在程序中对矩阵索引的用法和在数学中的一样。我们还要重载算术操作符,使它们能够用于矩阵对象。

template<class T>
class matrix 
{
	friend ostream& operator<<(ostream&,const matrix<T>&);
    public:
		matrix(int theRows=0,int theColumns=0);
    	matrix(const matrix<T>&);//复制构造函数
        ~matrix(){delete[]element;}
    	int rows()const {return theRows;}
    	int columns()const {return theColumns;}
    	T& operator()(int i, int j) const;
		matrix<T>& operator=(const matrix<T>&);
    	matrix<T> operator+()const//一元加法
        matrix<T> operator+(const matrix<T>&)const;
    	matrix<T> operator-()const//一元减法
		matrix<T> operator-(const matrix<T>&)const;
		matrix<T> operator*(constmatrix<T>&)const;
    	matrix<T>&operator+=(const T&x);
    private:
		int theRows,theColumns;//矩阵行数和列数
		T*element;//元素数组
};
matrix类的构造函数
template<class T>
matrix<T>::matrix(int theRows,int theColumns)
{
	//检验行数和列数的有效性
	if(theRows <0 || theColumns <0)
        throw illegalParameterValue("行列数必须大于等于0");
	if(theRows ==0 || theColumns == 0 && (theRows !=0|| theColumns !=0))
		throw illegalParameterValue("要么都大于0,要么都等于0");
	//创建矩阵
	this-> theRows = theRows;
    this-> theColumns = theColumns;
    element=new T [theRows* theColumns];
}
matrix类的复制构造函数
template<class T>
matrix<T>::matrix(const matrix<T>& m)
{
    //创建矩阵
    theRows = m.rows;
	theColumns = m.theColumns;
	element= new T [theRows* theColumns];
    //复制m的每一个元素
    copy (m.element,m.element + theRows* theColumns, element);
}
matrix类对()的重载

矩阵元素M(i,j)在数组element中的位置map(i,j) = (i-1)*n+j-1

template<class T>
T& matrix<T>::operator()(int i,int j)const 
{
    //返回一个指向元素(i,j)的引用
    if(i<1||i>theRows||j<1|j>theColumns)
		throw matrixIndexOutOfBounds();
	return element[(i-1)*theColumns +j-1];
}
matrix类对=的重载
template<class T>
matrix<T>& matrix<T>::operator=(const matrix<T>& m)
{
    //赋值,*this=m 
    if(this != &m)
    {//不能自己赋值自己
        //释放原空间
		delete [] element;
        theRows = m.theRows;
		theColumns = m.theColumns;
		element = new T [theRows* theColumns];
        //复制m的每一个元素
        copy (m.element,m.element + theRows* theColumns, element);
    }
    return *this;
}
matrix类对+的重载
template<class T>
matrix<T>matrix<T>::operator + (const matrix<T>& m)const 
{
    //返回矩阵w=(*this)+m
    if(theRows != m.theRows || theColumns != m.theColumns)
        throw matrixSizeMismatch();
	//生成结果矩阵w
	matrix<T> w(theRows, theColumns);
    for(int i = 0;i < theRows * theColumns;i++)
		w.element[i] = element[i] + m.element[i];
    return w;
}
matrix类对*的重载
template<class T>
matrix<T>matrix<T>::operator * (const matrix<T>& m)const 
{
    //返回矩阵w=(*this)*m
    if(theColumns != m.theRows)
        throw matrixSizeMismatch();
	//生成结果矩阵w
	matrix<T> w(theRows, m.theColumns);
    //为*this,m和w定义游标,并设定初始位置为(1,1)
    int ct = 0,cm = 0,cw = 0;
    
    /*最外层的循环对应不同行和不同列的计算,一行的所有列都好了就换一行*/
    for (int i = 1;i <= theRows;i++)
    {
        /*第二层的循环对应一行和不同列的计算,一列完了换一列*/
		for (int j = 1;j <= m.theColumns; j++)
		{
			T sum = element[ct] * m.element[cm];
            /*最内层的循环实现一行对应一列的计算*/
			for(int k=2;k<=theColumns;k++)
			{
                //累加其余项
                ct++//指向*this第i行的下一项
                /*在行主次序中同一列的两个相同元素在位置上相差m.theColumns*/
				cm += m.theColumns;//指向m的第j列的下一项
                sum += element[ct] * m.element[cm];
            }
            w.element[cw++] = sum;//保存w(i,j)
            ct -= theColumns-1;//第i行行首
            cm = j;//第j+1列起始
        }
		ct += theColumns;//重新调整至下一行的行首
        cm = 0;//重新调整至第一列起始
    }
	return w;
}

7.3 特殊矩阵

7.3.1 定义和应用

方阵是指具有相同行数和列数的矩阵

特殊矩阵

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

7.3.2 对角矩阵

对角矩阵:D

矩阵描述:T element[n]行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

类diagonalmatrix声明
template<class T>
class diagonalMatrix 
{
    public:
		diagonalMatrix(int theN=10);//构造函数
        ~diagonalMatrix(){delete []element;} //析构函数
    	T get(int,int)const;
    	void set(int,int,const T&);
    private:
		int n;//矩阵维数
		T*element; //存储对角元素的一维数组
};
diagonalMatrix::get
template <class T>
T diagonalMatrix<T>::get(int i,int j)const 
{
    //返回矩阵中(i,j)位置上的元素. 
    //检验i和j是否有效
	if (i<1 || j<1 || i>n || j>n) throw matrixIndexOutOfBounds();
	if(i==j)
		return element[i-1];//对角线上的元素
	else return 0;//非对角线上的元素
}
diagonalMatrix:: set
template<class T>
void diagonalMatrix<T>:: set(int i, int j, const T& newValue)
{
    //存储矩阵中位置(i,j)上元素的新值. 
    //检验i和j是否有效
	if(i<1 || j<1 || i>n || j>n) throw matrixIndexOutOfBounds();
	if(i==j)
		element[i-1] = newValue;//存储对角元素的值
    else 
		if(newValue!= 0)
            throw illegalParameterValue("非对角线上的元素必须是0");
}

7.3.3 三对角矩阵

三对角矩阵:T

三条对角线:

  • 主对角线:i = j

  • 低对角线(主对角线之下的对角线):i = j + 1

  • 高对角线(主对角线之上的对角线):i = j - 1

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

补充:按对角线映射

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

tridiagonalMatrix::get
template <class T>
T tridiagonalMatrix<T>::get(int i,int j)const 
{
    //返回矩阵中(i,j)位置上的元素. 
    //检验i和j是否有效
	if(i <1 || j<1 || i>n || j>n) throw matrixIndexOutOfBounds();
    //确定要返回的元素
    switch (i-j)
    {
     	case 1://低对角线
			return elelment[i-2];
     	case 0://主对角线
            return elelment[n+i-2];
        case -1://高对角线
            return elelment[2*n+i-2];
        default: return 0;
    }
 }

7.3.4 三角矩阵

非0区域的元素总数:n(n+1)/2

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

7.3.5 对称矩阵

一个n×n对称矩阵,可以视为下三角或上三角矩阵,用三角矩阵的表示方法,用一个大小为n(n+1)/2的一维数组来表示。未存储的元素可以由存储的元素来计算。

7.4 稀疏矩阵

7.4.1 基本概念

  • 如果一个m×n矩阵中有“许多”元素为0,则称该矩阵为稀疏矩阵(sparse)。

  • 不是稀疏的矩阵被称为稠密矩阵(dense)。

  • 稀疏矩阵和稠密矩阵之间没有一个精确的界限:

    • 我们规定若一个矩阵是稀疏矩阵,则其非0元素的数目应小于 n 2 / 3 n^2/3 n2/3,在有些情况下应小于 n 2 / 5 n^2/5 n2/5
    • 对角矩阵,三对角矩阵(n×n):稀疏矩阵
    • 三角矩阵:稠密矩阵

7.4.2 用单个线性表描述

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

线性表terms采用数组描述(terms是arrayList的实例)行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

类sparseMatrix声明
template <class T>
struct matrixTerm
{
	int row;
	int col;
	T value;
	operator T() const { return value;}
};
template<class T>
class sparseMatrix 
{
    public:
		void transpose(SparseMatrix<T> &b);//矩阵转置
		void add(sparseMatrix<T> &b, sparseMatrix<T> &c);//两个稀疏矩阵相加
    private:
    	int rows;//矩阵行数
		int cols;//矩阵列数
		arrayList<matrixTerm<T>>terms;//矩阵非0元素表
};
类sparseMatrix中的矩阵转置

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

关键点

矩阵*this的转置矩阵→b

矩阵*this中的元素在b中的位置?

  • colSize[i]:*this第i列的非0元素数
  • rowNext[i]:*this第i列(b中第i行)下一个元素在b中的位置
    • 初始:b中第i行的起始位置
      • rowNext[1] = 0;
      • rowNext[i] = rowNext[i - 1]+colSize[i - 1];

算法思路

  1. 计算*this每列中的非0元素数

  2. 求出b中每一行的起始点

  3. 实施从*this到b的转置复制

    定义i为* this迭代器
    依次扫描* this各元素( *i)

template<class T>
void sparseMatrix<T>::transpose(sparseMatrix<T>&b) 
{//把*this转置结果送入b
    
    //设置转置矩阵特征
    b.cols = rows;
    b.rows = cols;
    b.terms.reSet(terms.size());
    
    //初始化以实现转置
    int* colSize = new int[cols + 1];
    int* rowNext = new int[cols + 1]; 

    //计算*this每一列的非0元素数
    for (int i = 1; i <= cols; i++) 
        colSize[i] = 0;
    for (arrayList<matrixTerm<T>>::iterator i = terms.begin();
         i!=terms.end();i++)
        colSize[(*i).col]++;
    
    //求出b中每一行的起始点
    rowNext[1] = 0;
    for (int i = 2; i <= Cols; i++)
        rowNext[i] = rowNext[i - 1] + colSize[i - 1];
    
    //实施从*this到b的转置复制
    matrixTerm<T> mTerm;
    for(arrayList<matrixTerm<T>>::iterator i = terms.begin();
       i!= terms.end();i++)
    {
        int j = rowNext[(*i).col]++;//在b中的位置
        mTerm.row = (*i).col;
        mTerm.col = (*i).row;
        mTerm.value = (*i).value; 
        b.terms.set(j,mTerm);	
    }
}
类sparseMatrix中的两个稀疏矩阵相加

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构

两个稀疏矩阵(*this和b)相加,所得结果放入c中。

实现思想:

  • 定义矩阵*this的迭代器:it,和矩阵b的的迭代器ib
  • 使用it和ib,从左至右依次扫描两个矩阵中的元素。
  • 当it和ib都未扫描完成时,循环:
    • 计算it所指的元素和ib所指的元素按行主次序的索引。
      • tIndex=*this中的it所指的元素索引
      • 元素索引——(元素的行下标-1)* 列数+元素的列下标
      • bIndex =b中ib所指的元素索引
    • 判断tIndex>bIndex 还是tIndex=bIndex,确定it所指的元素是在ib所指的元素之前,之后还是进行相加运算,并只在和不为0时才加入c。
  • 复制剩余元素
template<class T>
void sparseMatrix<T>::Add(sparseMatrix<T>&b,sparseMatrix<T>&c)
{//计算c=(*this)+b. 
    //检验相容性
	if (rows != b.rows || cols != b.cols)
		throw matrixSizeMismatch();//不能相加
	//设置结果矩阵c的特征
    c.rows = rows;
    c.cols = cols;
	c.terms.clear() = 0;//初值
    int cSize = 0;
	//定义*this和b的迭代器
	arrayList<matrixTerm<T>>::iterator it = terms.begin();
    arrayList<matrixTerm<T>>::iterator ib = b.terms.begin();
    arrayList<matrixTerm<T>>::iterator itEnd = terms.end();
    arrayList<matrixTerm<T>>::iterator ibEnd = b.terms.end();
	//遍历*this和b,把相关的元素值相加
    while(it!=itEnd && ib!= ibEnd)
	{
        //每一个元素的行主索引+列数
        int tIndex = (*it).row * cols + (*it).col;
        int bIndex = (*ib).row * cols + (*ib).col;
        if(tIndex < bIndex)//b的元素在后
		{
            //*this的下一个元素
            c.terms.insert(cSize++,*it);
            it++;
        }
        else 
        {
            if (tIndex == bIndex)//位置相同
			{
                //仅当和不为0时才添加到c中
                if((*it).value + (*ib).value != 0)
                {
                    matrixTerm<T>mTerm;
                    mTerm.row = (*it).row;
                    mTerm.col = (*it).col;
					mTerm.value =(*it).value +(*ib).value;
                    c.terms.insert(cSize++,mTerm);
                }
                //*this和b的下一个元素
                it++;
                ib++;
            }
        	else
            {//b的下一个元素
                c.terms.insert(cSize++,*ib);
                ib++;
            }
        }
    }
	//复制剩余元素
    for(;it != itEnd; it++)
        c.terms.insert(cSize++,*it);
    for(;ib != ibEnd; ib++)
        c.terms.insert(cSize++,*ib);
}

7.4.3 用多个线性表描述

行主映射和列主映射,数据结构、算法与应用,# 数据结构笔记合集,矩阵,c++,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-793898.html

到了这里,关于数据结构 | 第七章:数组和矩阵 | 行主映射和列主映射 | 稀疏矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】第七章-图【期末复习】

    图:有向图、网,无向图、网。 顶点 边:有向图图称作弧,分弧头弧尾。 依附:边依附点,边和点关联 邻接:点邻接点 度:点关联的边的数目 完全图: 无向: C n 2 C_n^2 C n 2 ​ 条边; 有向: 2 C n 2 2C_n^2 2 C n 2 ​ 条边 连通:若干结点互相可以通信,用手提起一个结点可以顺

    2024年02月01日
    浏览(60)
  • 第七章 函数矩阵

    和矩阵函数不同的是,函数矩阵本质上是一个矩阵,是以函数作为元素的矩阵。 矩阵函数本质上是一个矩阵,是以矩阵作为自变量的函数。 函数矩阵和数字矩阵的运算法则完全相同。 不过矩阵的元素 a i j ( x ) a_{ij}(x) a ij ​ ( x ) 需要是闭区间 [ a , b ] [a,b] [ a , b ] 上的实函数

    2024年02月04日
    浏览(63)
  • 第七章,相似矩阵及其应用,1-线性变换与相似矩阵

    玩转线性代数(34)线性变换与相似矩阵的笔记,相关证明以及例子见原文 以n维向量空间 R n R^n R n 为例,设L为 R n R^n R n 上的一个线性变换,向量组 I : α 1 , α 2 , . . . , α n rm{I}:alpha_1,alpha_2,...,alpha_n I : α 1 ​ , α 2 ​ , ... , α n ​ 和 I I : b 1 , b 2 , . . . , b n rm{II}:b_1,b_2,...,b_n

    2024年02月11日
    浏览(44)
  • 第七章,相似矩阵及其应用,3-二次型、合同矩阵与合同变换

    玩转线性代数(38)二次型概念、合同矩阵与合同变换的笔记,相关证明以及例子见原文 含有n个变量 x 1 , x 2 , . . . x n x_1,x_2,...x_n x 1 ​ , x 2 ​ , ... x n ​ 的二次齐次函数: f ( x 1 , x 2 , . . . x n ) = a 11 x 1 2 + a 22 x 2 2 + . . . + a n n x n 2 + 2 a 12 x 1 x 2 + 2 a 13 x 1 x 3 + . . . + 2 a n − 1 , n x

    2024年02月11日
    浏览(55)
  • 第七章 文件和数据格式化

    7.1 文件的使用 文件时存储在辅助存储器上的一组数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象。文件包括文本文件和二进制文件两种类型。 7.1.1 文件的类型 文本文件一般由单一特定编码的字符组成,如UTF-8编码,内容容易统一展示和阅读。 二进制文

    2024年02月07日
    浏览(80)
  • 【数据库复习】第七章 数据库设计

    数据库设计的过程(六个阶段) ⒈需求分析阶段 准确了解与分析用户需求(包括数据与处理) 最困难、最耗费时间的一步 ⒉概念结构设计阶段 整个数据库设计的关键 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型 ⒊逻辑结构设计阶段 将概念结构

    2024年02月08日
    浏览(53)
  • 大数据技术原理与应用(第七章Zookeeper测试)

    一、选择题 1.Zookeeper服务端默认的对外服务端口是? A.8088 B.3888 C.2181 D.2888 2.Zookeeper生产环境一般采用多少台机器组成集群? A.1 B.3 C.5 D.奇数台(且大于1) 3.下面就Zookeeper的配置文件zoo.cfg的一部分,请问initLimit表示的含义是? A.Leader-Follower初始通信时限 B.Leader-Follower同步通信时

    2024年02月12日
    浏览(45)
  • 数据结构第七周 :(稀疏矩阵快速转置 + 简单文本编辑器 + 三元组的矩阵加法 + 九宫格数独游戏 + 数组主元素 + 螺旋数字矩阵 + 蛇形矩阵)

    【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就

    2023年04月21日
    浏览(43)
  • 《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月12日
    浏览(40)
  • 【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月02日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包