1、稀疏数组的处理方法
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
举例: 第一行记录的是:原数组的总行数,原数组的总列数,原数组的非0的值的个数 从第二行开始记录的是:每一个非0的值所在的行,所在的列,对应的具体值 原数组6行,7列的结构,变成了9行,3列的稀疏数组。
2、二维数组转换稀疏数组的思路
- 遍历原始的二维数组,得到有效数据的个数 $sum
- 根据$sum就可以创建稀疏数组
- 将二维数组的有效数据存入到稀疏数组中
3、稀疏数组转换二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据,创建二维数组
- 再读取稀疏数组的第二行开始的数据,并赋值给二维数组
PHP代码实现稀疏数组
<?php
$arr = array();
$row = $col = 11;
for ($i = 0; $i < $row; $i++) {
for ($j = 0; $j < $col; $j++) {
$arr[$i][$j] = 0;
}
}
$arr[1][2] = 1;
$arr[2][4] = 2;
echo "转换之前的二维数组:\n";
printArr($arr);
echo "转换之后的稀疏数组:\n";
$par = arr2parse($arr);
printArr($par);
echo "还原之后的二维数组:\n";
printArr(parse2arr($par));
function arr2parse($arr)
{
$sum = 0;
foreach ($arr as $item) {
foreach ($item as $v) {
if ($v != 0) {
$sum++;
}
}
}
$parRow = count($arr);
$parCol = count($arr[0]);
$parseArr = [];
$parseArr[0][0] = $parRow;
$parseArr[0][1] = $parCol;
$parseArr[0][2] = $sum;
$count = 1;
for ($i = 0; $i < $parRow; $i++) {
for ($j = 0; $j < $parCol; $j++) {
if ($arr[$i][$j] != 0) {
$parseArr[$count][0] = $i;
$parseArr[$count][1] = $j;
$parseArr[$count][2] = $arr[$i][$j];
$count++;
}
}
}
return $parseArr;
}
function parse2arr($parseArr)
{
$row = $parseArr[0][0];
$col = $parseArr[0][1];
$sum = $parseArr[0][2];
$old = [];
for ($i = 0; $i < $row; $i++) {
for ($j = 0; $j < $col; $j++) {
$old[$i][$j] = 0;
}
}
for ($i = 1; $i <= $sum; $i++) {
$old[$parseArr[$i][0]][$parseArr[$i][1]] = $parseArr[$i][2];
}
return $old;
}
function printArr($arrs)
{
foreach ($arrs as $arr) {
foreach ($arr as $item) {
echo $item . "\t";
}
echo "\n";
}
}
|