我有一个数组:
$data = array(
1 => array(
"time" => 1,
"parent" => array(4)
),
2 => array(
"time" => 3,
"parent" => array(4, 5)
),
3 => array(
"time" => 2,
"parent" => array(6)
),
4 => array(
"time" => 1,
"parent" => array(6)
),
5 => array(
"time" => 1,
"parent" => array(4)
),
6 => array(
"time" => 1,
"parent" => array()
)
);
Key是元素的ID,parent是元素数组,它引用元素id,time只是一个整数。
这是给定数组的示例:
左下角的整数是“id”,中间的整数是“time”。
我的目标是找到这个阵列最耗时的路径。在给出的示例中,路径将是2-> 5-> 4-> 6(id),导致总共6“时间”。它看起来很容易在纸上,但是我似乎无法编写一个algorythm来获取最耗时的路径的元素。我会感激任何帮助。
我认为algorythm应该是一种暴力行为,并检查所有可用的选项。因此,对于给定的数组,它将像:
1 -> 4 -> 6 = 3
2 -> 4 -> 6 = 5
2 -> 5 -> 4 -> 6 = 6
3 -> 6 = 3
4 -> 6 = 2
5 -> 4 -> 6 = 3
提前致谢。
答案 0 :(得分:1)
请注意,这仅在数组中没有循环时才有效。
// Note: built this in the SO editor, might have bugs
$cached = [];
$arrays = []; // Do this yourself
function get_path($num) {
global $arrays, $cached;
if (isset($cached[$num])) return $cached[$num];
$array = $arrays[$num];
$maxtime = $array['time'];
$bestpath = array($num);
foreach ($array['parent'] as $i) {
$path = get_path($i);
if ($path['time']+$array['time'] > $maxtime) {
$maxtime = $path['time'] + $array['time'];
$bestpath = array_merge(array($num),$path['path']);
}
}
$cached[$num] = array('path' => $bestpath, 'time' => $maxtime);
return $cached[$num];
}
var_dump(get_path(5));
不是真正的暴力方式,应该足够接近O(n)
。基本思想是你只需缓存它可以采取的路径。
注意:我在这里使用了一些C风格的语法,但理想情况下你实际上不会像这样编写代码