나는 그래프가 너무 커서 재귀를 사용하여 지나치게 많은 양의 메모리가 사용되기 때문에 트래버스하는 것이 거의 불가능합니다. 나는 그것이 비 재귀 그래서이 기능을 다시하고 싶은깊이 우선 검색에서 명시 적 스택 구현
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
에 두는 방법)?
DFS는 exp를 사용하지 않습니다. 양의 메모리. 스택 용 선형 메모리 만 사용합니다. – nhahtdh
모든 재귀는 일반적인 thruth와 같은 반복으로 대체 될 수 있습니다. 문제는 이것이 메모리를 절약한다면 (@nhahtdh이 언급했듯이). 최대 스택 크기 나 깊이가 제한되지 않는다면 아무런 이점도 얻지 못한다. – hek2mgl
@nhahtdh 그는 기하 급수적 인 공간이 필요하다고 말하지 않았으며 과도한 공간을 필요로한다고 말했다. 사실입니다 - 그래프의 모양에 따라 DFS는 * 정점 수 *에서 공간을 선형으로 취합니다. 전체 정량 그래프에서는 내장 된 호출 스택에 비해 너무 큽니다. 힙 할당 데이터 구조. – delnan