私は特に大きなグラフを持っており、メモリを大量に使用するため、再帰を使用してトラバースすることはほとんど不可能です。
以下は、再帰を使用した深さ優先関数です。
public function find_all_paths($start, $path)
{
$path[] = $start;
if (count($path)==25) /* Only want a path of maximum 25 vertices*/ {
$this->stacks[] = $path;
return $path;
}
$paths = array();
for($i = 0; $i < count($this->graph[$start])-1; $i++) {
if (!in_array($this->graph[$start][$i], $path)) {
$paths[] = $this->find_all_paths($this->graph[$start][$i], $path);
}
}
return $paths;
}
非再帰的であるように、この関数を書き直したいと思います。ある種のキューを作成しarray_shift()
、関数のどの部分で値をポップオフする必要があると思いますか?また、キューに入れられた頂点が確実に保持されるようにするにはどうすればよい$this->stacks
でしょうか?