У меня есть особенно большой график, из-за чрезмерного объема памяти, который он использует, почти невозможно переходить с использованием рекурсии.Выполнение явного стека в первом поиске глубины
Ниже моя глубина первой функции, используя рекурсию:
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
Обратите внимание, что вся рекурсия может быть заменена итерацией, которая имеет общий смысл. Вопрос в том, сохраняет ли это память (как упоминал @nhahtdh). Если максимальный размер или глубина стека не ограничен, я не вижу преимущества – hek2mgl
@nhahtdh Он не сказал, что он занимает экспоненциальное пространство, он сказал, что требуется * чрезмерное * пространство. Что истинно - в зависимости от того, как выглядит ваш график, DFS занимает пространство, линейное по числу * вершин *, которое может (на вполне разумных графиках) быть слишком большим для встроенного стека вызовов, но достаточно мала, чтобы вписаться в структура данных, распределенная кучей. – delnan