如何在PHP关联数组中获取每个元素的前、后非空相邻值
你提到的逐个遍历全数组(即每个元素单独向前/向后搜索非空值)的方案时间复杂度为O(n²),确实在数据量大时效率很低。我们可以用两次线性遍历实现O(n)时间复杂度的最优方案,具体如下:
实现逻辑
- 生成前序非空数组:从左到右遍历原数组,维护一个变量记录最近遇到的非空值,每个位置直接存储该变量即可;如果当前元素为非空,就更新这个变量。初始值设为空字符串,匹配首元素无前序的规则。
- 生成后序非空数组:从右到左遍历原数组,同样维护一个变量记录最近遇到的非空值,每个位置直接存储该变量即可;如果当前元素为非空,就更新这个变量。初始值设为空字符串,匹配末元素无后续的规则。
代码实现
// 原数组 $a = array("1" => "a", "2" => "", "3" => "", "4" => "f", "5" => "d", "6" => "c"); // 若原数组索引不是升序排列,先按键排序保证遍历顺序正确 ksort($a); $keys = array_keys($a); $length = count($keys); // 生成前一个非空元素数组$p $p = []; $lastNonEmpty = ""; foreach ($keys as $key) { $p[$key] = $lastNonEmpty; if ($a[$key] !== "") { $lastNonEmpty = $a[$key]; } } // 生成后一个非空元素数组$n $n = []; $nextNonEmpty = ""; for ($i = $length - 1; $i >= 0; $i--) { $key = $keys[$i]; $n[$key] = $nextNonEmpty; if ($a[$key] !== "") { $nextNonEmpty = $a[$key]; } }
效率说明
该方案仅需要对数组做两次完整遍历,时间复杂度为O(n),空间复杂度为O(n),是该场景下的最优实现,数组元素量越大,相比O(n²)的暴力搜索方案效率优势越明显。
内容的提问来源于stack exchange,提问作者MirrorMirror
相关产品推荐
相关产品推荐

