数据结构和算法-稀疏数组

稀疏数组:

当一个元素中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数据。

稀疏数组的处理方法:

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

使用场景

序列化大部分元素值相同的数组,可以节省存储空间

客户端

public static void Main(string[] args)
        {
            //原始数组
            int[] qipanArr = new int[] {
            1, 0, 1, 1, 1, 2, 0, 0,
            0, 3, 3, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0};


            //一维数组转换为稀疏数组
            var sparseArray = ArrayToSparseArray(qipanArr);
            //稀疏数组转为一维数组
            var newArr = SparseArrayToArray(sparseArray);
        }

实现

        /// <summary>
        /// 一维数组转换为稀疏数组
        /// </summary>
        /// <param name="oriArray"></param>
        /// <returns></returns>
        public static int[][] ArrayToSparseArray(int[] oriArray)
        {
            //数组转稀疏数组
            //获取有值元素个数
            int arrayCount = oriArray.Length;
            int valueCount = 0;
            for (int i = 0; i < oriArray.Length; i++)
            {
                if (oriArray[i] != 0)
                {
                    valueCount++;
                }
            }
            int[][] sparseArray = new int[valueCount + 1][];
            //第一行:第一列代表原始数组总数、第二列代表原始数组有值元素的数量
            sparseArray[0] = new int[1];
            sparseArray[0][0] = arrayCount;
            int index = 1;
            for (int i = 0; i < oriArray.Length; i++)
            {
                int value = oriArray[i];
                if (value != 0)
                {//将数组中非0数据放入稀疏数组
                    sparseArray[index] = new int[2];
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = value;
                    index++;
                }
            }
            return sparseArray;
        }
        /// <summary>
        /// 稀疏数组转为一维数组
        /// </summary>
        /// <param name="sparseArray"></param>
        /// <returns></returns>
        public static int[] SparseArrayToArray(int[][] sparseArray)
        {
            int[] newArr = new int[sparseArray[0][0]];
            for (int i = 1; i < sparseArray.Length; i++)
            {
                newArr[sparseArray[i][0]] = sparseArray[i][1];
            }
            return newArr;
        }
原文地址:https://www.cnblogs.com/fanfan-90/p/13284311.html