迭代加深深度优先搜索数组PHP

时间:2011-08-20 22:13:29

标签: php

是否可以在PHP中使用级别中的数组实现IDDFS算法?

假设以下树:

    A
   / \
  B   C
 / \   \  
D   E   F

调用getNodes(A)会产生数组(B,C),同样在数组(D,E)中产生getNodes(B)。我已经编写了getNodes函数,将它与BFS算法一起使用,遗憾的是它太慢了。

代码格式化注释:

function bfs($start,$target){
    $dist = 0; 

    if(empty($queue)){
        $queue = array(); 
    }; 

    if(empty($checked)){
        $checked = array();
    }; 

    array_push($queue, $start); 
    while(!empty($queue)):
        $dist = $dist + 1;
        $newqueue = array();

        foreach($queue as $node){
            if(!in_array($node,$checked)){
                array_push($checked,$node);
                $nodes=getNodes($node);
                if(checkNode($nodes,$target)){
                    return $dist;
                }else{
                    $newqueue=$nodes;
                }
            } 
            $queue = $newqueue; 
        } 
    endwhile;

    return false;
}

1 个答案:

答案 0 :(得分:0)

从递归的角度来看,执行此操作的函数可能如下所示:

<?php

function getNode($needle, $target) {

    $res = null;
    foreach($target as $key=>$val) {

        if($key === $needle) {
            $res = $target[$key];
            break;
        }
        elseif(is_array($target[$key]))
            $res = getNode($needle, $target[$key]);
    }
    return $res;
}

测试:

$arr = array(
    'a' => array(
        'b' => array(
            'water'
        ),
        'c' => array(
            'earth'
        )
    )
);

var_dump(getNode('a', $arr));