C#数据结构-稀疏矩阵

了解稀疏矩阵之前,我们先聊聊数组,数组都清楚string[10] str;这里的str就是一个数组,它的存储方式是str[0],str[1],str[2]...这样,放在一个连续存储空间里面。。那么同样的,二维数组我们这里stirng[2][2] str;,它的存储结构也是一个顺序存储,所以我们这里把这个str的2*2写全,str[0][0],str[0][1],str[1][0],str[1][1]这样。。。
二维数组通常称为矩阵,so,矩阵跟稀疏矩阵文字上面是非常相近了偷笑,稀疏:我们可以认为是少,什么少,数组里面只有元素...so,元素非常少的矩阵就是稀疏矩阵。比如说100*100的矩阵,里面不为0的元素只有100个,那么我们可以称为他是稀疏矩阵,也就是有效元素远小于总元素的时候,我们可以称为稀疏矩阵。
稀疏矩阵的特点:
1.非0(有效)元素非常少

2.排列没有规律

根据这些特点,我们存储稀疏矩阵元素的时候会以:行号,列号,元素(i,j,a)这样的三元组存储,接下来我们对稀疏矩阵的一些操作。

首先创建数据:

/// <summary>
    /// 一个三元组类型
    /// </summary>
    public struct TupNode
    {
        //行号
        public int r;
        //列号
        public int c;
        //元素值
        public int d;
    }
    /// <summary>
    /// 稀疏矩阵顺序表
    /// </summary>
    public struct TupSparseMatrix
    {
        //行数
        public int rows;
        //列数
        public int cols;
        //非0元素个数
        public int nums;
        public TupNode[] data;
    }

然后就是操作了

/// <summary>
    /// 稀疏矩阵的操作
    /// </summary>
    class SparseMatrixClass
    {
        readonly int MaxSize = 100;
        public TupSparseMatrix trip;
        public SparseMatrixClass()
        {
            trip = new TupSparseMatrix();
            trip.data = new TupNode[MaxSize];
        }
        #region 把二维数组(矩阵)转换成三元组
        public void CreateTupSparseMatrix(int[,] matrix)
        {
            //GetLength是求维度的个数,从0开始
            trip.rows = matrix.GetLength(0);
            trip.cols = matrix.GetLength(1);
            trip.nums = 0;

            //遍历这个二维数组
            for (int i = 0; i < trip.rows; i++)
            {
                for (int j = 0; j < trip.cols; j++)
                {
                    //不等于0并且存储数量不超过存储数量的存储
                    if (matrix[i, j] != 0 && MaxSize > trip.nums)
                    {
                        trip.data[trip.nums].r = i;
                        trip.data[trip.nums].c = j;
                        trip.data[trip.nums].d = matrix[i, j];
                        trip.nums++;
                    }
                }
            }
        }
        #endregion

        #region 输出三元组(i,j,d)
        public string DispTupSparseMatrix()
        {
            string tupStr = "";
            for (int i = 0; i < trip.nums; i++)
            {
                tupStr += string.Format("({0},{1},{2})", trip.data[i].r, trip.data[i].c, trip.data[i].d);
            }
            return tupStr;
        }
        #endregion

        #region 矩阵转置,这里稍微优化了下
        public void Transpose(ref SparseMatrixClass tb)
        {
            SparseMatrixClass sm = new SparseMatrixClass();
            sm.trip.rows = tb.trip.cols;
            sm.trip.cols = tb.trip.rows;
            sm.trip.nums = tb.trip.nums;
            //置换
            for (int i = tb.trip.nums; i >0; i--)
            {
                sm.trip.data[i].r = tb.trip.data[i].c;
                sm.trip.data[i].c = tb.trip.data[i].r;
                sm.trip.data[i].d = tb.trip.data[i].d;
            }
            tb = sm;
        }
        #endregion
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值