稀疏数组 sparsearry

稀疏数组 sparsearry:

        当一个数组大部分元素为0,或者同一个值得数组时,可以用稀疏数组保存该数组

处理方式

  • 记录数组一共有几行几列,有多少不同的值
  • 把不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

原始数组转稀疏数组

  • 遍历原始二维数组,得到有效数据的个数sum
  • 根据sum,创建稀疏数组sapareArry int[sum+1][3]
  • 将有效数据存入稀疏数组中

稀疏数组转原始数组

  • 根据稀疏数组的第一行,创建原始数组
  • 读取稀疏数组的后几行,赋值给原始数组
 public int[,] arry = new int[11, 11];
    public void Init()
    {
        arry[1, 2] = 3;
        arry[3, 4] = 5;

    }

    public int[,] Save()
    {
        int[,] _arr;
        Dictionary<int,int> dic = new Dictionary<int, int>();
        for (int i = 0; i < arry.GetLength(0); i++)
        {
            for (int j = 0; j < arry.GetLength(1); j++)
            {
                if (arry[i,j] != 0)
                {
                   dic.Add(i,j);
                }
            }
        }
        _arr = new int[dic.Count+1,3];
        _arr[0,0] = arry.GetLength(0);
        _arr[0,1] = arry.GetLength(1);
        _arr[0,2] = dic.Count;

        int num = 1;
        foreach (var item in dic)
        {
            _arr[num,0] = item.Key;
            _arr[num,1] = item.Value;
            _arr[num,2] = arry[item.Key,item.Value];
            num++;
        }

        return _arr;
    }


    public int[,] Restory(int[,] sparsearry)
    {
         if (sparsearry.Length == 0) return new int[0,0];
         int[,] origin_arry = new int[sparsearry[0,0],sparsearry[0,1]];
         for (int i = 0; i < sparsearry[0,2]; i++)
         {
             origin_arry[sparsearry[i+1,0],sparsearry[i+1,1]] =sparsearry[i+1,2]; 
         } 
         return origin_arry;
    } 

    public void Show(int[,] arr)
    {
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int j = 0; j < arr.GetLength(1); j++)
            {
                if (j == arr.GetLength(1)-1)
                {
                    Console.WriteLine(arr[i, j] + "\t");
                }
                else
                {
                    Console.Write(arr[i, j] + "\t");
                }
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值