Özellikle büyük bir grafiğim var; bu, kullandığı aşırı bellek miktarı nedeniyle özyineleme kullanarak hareket etmeyi neredeyse imkansız kılıyor. Bunun özyinesiz yani bu işlevi yeniden yazmak istiyorumAçık bir yığının derinlemesine ilk araştırmanın gerçekleştirilmesi
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;
}
:
Aşağıda özyineleme kullanılarak benim derinlik ilk fonksiyonudur. Bir sıraya kuyruğum yapmam gerektiğini ve array_shift()
'u kullanarak ancak işlevin hangi bölümünde olduğunu ve sıraya alınmış köşe noktalarının korunmasını nasıl sağlarım gerektiğini ($this->stacks
üzerinde son yolu koymak için) kullanmam gerektiğini varsayar mıyım?
DFS exp kullanmadı. hafıza miktarı. Sadece yığın için doğrusal bellek kullanır. – nhahtdh
Tüm özyineleme, genel bir gerginlik olan yinelemeyle değiştirilebilir. Soru, eğer bu hafızadan tasarruf ederse (@nhahtdh'dan bahsedildiği gibi). Maksimum yığın boyutu veya derinliği sınırlı değilse, avantaj görüyorum – hek2mgl
@nhahtdh Uzayın yerini aldığını söylemedi, aşırı * boşluk olduğunu söyledi. Hangisi doğrudur - grafiğinizin neye benzediğine bağlı olarak, DFS, * bütünlüklü (*) sayıya kadar yer çekimi yapar, bu da (tamamen makul grafiklerde) yerleşik çağrı yığını için çok büyük olabilir, ancak içine sığacak kadar küçüktür bir yığın-ayrılmış veri yapısı. – delnan