2

我有一个数组:

$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 wise),导致总共 6 个“时间”。在纸上看起来很容易,但是我似乎无法编写算法来获取最耗时路径的元素。我将不胜感激任何帮助。

我认为算法应该是一种蛮力式的,并检查所有可用的选项。因此,对于给定的数组,它会像:

1 -> 4 -> 6 = 3
2 -> 4 -> 6 = 5
2 -> 5 -> 4 -> 6 = 6 
3 -> 6 = 3
4 -> 6 = 2
5 -> 4 -> 6 = 3

提前致谢。

4

1 回答 1

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 风格的语法,但理想情况下,您实际上不会像这样编写代码

于 2013-01-20T15:30:44.603 回答