数据结构和算法-稀疏数组
稀疏数组:
当一个元素中大部分元素为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;
}