数据结构之稀疏数组

稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,可使用稀疏数组来保存该数组.
处理方法:
  1. 记录数组一共有几行几列;
  2. 把具备不一样值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模.

案列:五子棋盘存档与恢复

二维数组转稀疏数组思路:
  • 遍历原始的二维数组,获得有效数据的个数sum;
  • 根据sum就能够建立稀疏数组sparseArraysum+1;
稀疏数组转恢复二维数组:
  • 先读取稀疏数组的第一行,根据第一行初始化二维数组;
  • 在读取稀疏数组后几行的数据,并赋给原始二维数组便可.
<?php
$arr = [];
//先初始化一个6行7列的二维数组,每一个元素的初始值为0
for ($i = 0; $i < 11; $i++) {
    for ($j = 0; $j < 11; $j++) {
        $arr[$i][$j] = 0;
    }
}
//分别在第二行第三列,第三行第四列设置一个黑子和蓝子
//1表示黑子,2表示蓝子
$arr[1][2] = 1;
$arr[2][3] = 2;

//将二维数组转化为稀疏数组
//1.获取二维数组几行几列,有多少个非0元素
$sparseArr = [];
$sum = 0;

for ($i = 0; $i < 11; $i++) {
    for ($j = 0; $j < 11; $j++) {
        if ($arr[$i][$j] != 0) {
            $sum++;
            $sparseArr[$sum][0] = $i;
            $sparseArr[$sum][1] = $j;
            $sparseArr[$sum][2] = $arr[$i][$j];
        }
    }
}
$sparseArr[0][0] = 11;
$sparseArr[0][1] = 11;
$sparseArr[0][2] = $sum;

//将稀疏数组恢复为二维数组
//1.将第一行第一列和第二列取出,初始化二维数组
//2.遍历后面的数据,赋值给二维数组
$rearr = [];
$row = $sparseArr[0][0];
$col = $sparseArr[0][1];
for($i = 0;$i<$row;$i++){
    for($j = 0;$j<$col;$j++){
        $rearr[$i][$j] = 0;
    }
}

for($i = 1;$i<$sparseArr[0][2] + 1;$i++){
    $rearr[$sparseArr[$i][0]][$sparseArr[$i][1]] = $sparseArr[$i][2];
}

//打印恢复后的二维数组
for($i = 0 ; $i<11;$i++){
    for($j=0;$j<11;$j++){
        echo $rearr[$i][$j].' ';
    }
    echo "\n";
}
相关文章
相关标签/搜索