1、稀疏数组的处理方法
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
举例:
第一行记录的是:原数组的总行数,原数组的总列数,原数组的非0的值的个数
从第二行开始记录的是:每一个非0的值所在的行,所在的列,对应的具体值
原数组6行,7列的结构,变成了9行,3列的稀疏数组。
2、二维数组转换稀疏数组的思路
- 遍历原始的二维数组,得到有效数据的个数 $sum
- 根据$sum就可以创建稀疏数组
- 将二维数组的有效数据存入到稀疏数组中
3、稀疏数组转换二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据,创建二维数组
- 再读取稀疏数组的第二行开始的数据,并赋值给二维数组
PHP代码实现稀疏数组
<?php
$arr = array();
$row = $col = 11; // 定义一个11 * 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)
{
// 获取二维数组非0的值的个数
$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)
{
// 定义一个全0的二维数组
$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";
}
}