Ho un grafico particolarmente grande, che rende quasi impossibile attraversare l'utilizzo della ricorsione a causa dell'eccessiva quantità di memoria che utilizza.Implementazione di uno stack esplicito in una prima ricerca di profondità
Qui di seguito è la mia funzione in profondità, utilizzando la ricorsione:
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;
}
vorrei riscrivere questa funzione in modo che non è ricorsiva. Presumo che dovrò fare una coda di qualche tipo e inserire i valori usando array_shift()
ma in quale parte della funzione, e come posso assicurarmi che i vertici in coda siano preservati (per inserire il percorso finale su $this->stacks
)?
DFS non utilizza exp. quantità di memoria. Utilizza solo memoria lineare per lo stack. – nhahtdh
Nota che tutta la ricorsione può essere sostituita da iterazione che è una verità generale. La domanda è, se questo fa risparmiare memoria (come menzionato @nhahtdh). Se la dimensione massima dello stack o la profondità non sono limitati, non vedo alcun vantaggio – hek2mgl
@nhahtdh Non ha detto che richiede spazio esponenziale, ha detto che richiede * spazio eccessivo *. Che è vero - a seconda di come appare il tuo grafico, DFS prende lo spazio lineare nel numero di * vertici *, che può (su grafici interamente ragionevoli) essere troppo grande per lo stack di chiamate integrato, ma abbastanza piccolo da adattarsi una struttura dati allocata all'heap. – delnan