查找复杂数组的最大路径

时间:2013-01-20 12:06:31

标签: php

我有一个数组:

$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只是一个整数。

这是给定数组的示例:

Schema

左下角的整数是“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

提前致谢。

1 个答案:

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