2013-03-09 19 views
7

Ö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?

+0

DFS exp kullanmadı. hafıza miktarı. Sadece yığın için doğrusal bellek kullanır. – nhahtdh

+1

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

+0

@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

cevap

1

Bir ağaçta yollarının sayısı yaprakların sayısına eşittir üstel alanı almaz, her yaprak kökünden sadece 1 yolu .. İşte

keyfi bir ikili için bir DFS basit bir arama olduğunu vardır ağaç: burada .. şube, her dal akım yolunun bir kopyasını alır zaman, yani sadece & Çatal dalıdır bir ağaçta tüm yolları bulmalıyız ne

// DFS: Parent-Left-Right 
public function dfs_search ($head, $key) 
{ 
    var $stack = array($head); 
    var $solution = array(); 

    while (count($stack) > 0) 
    { 
     $node = array_pop($stack); 

     if ($node.val == $key) 
     { 
      $solution[] = $node; 
     } 

     if ($node.left != null) 
     { 
      array_push($stack, $node.left); 
     } 

     if ($node.right != null) 
     { 
      array_push($stack, $node.right); 
     } 
    } 

    return $solution; 
} 

1-satır özyinelemeli şube & olduğunu çatal yazdım:

// Branch & Fork 
public function dfs_branchFork ($node, $path) 
{ 
    return array($path) 
     +($node.right!=null?dfs_branchFork($node.right, $path+array($node)):null) 
     +($node.left!=null?dfs_branchFork($node.left, $path+array($node)):null); 
} 
+0

@PseudoOne Sorunuza çözümümüzü kontrol edin –

İlgili konular