广度优先搜索

参考资料:https://www.jianshu.com/p/881fab02c5ec

概念:

广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法

二、例子
假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在Facebook,你与芒果销售商有联系吗?为此,你可在朋友中查找

这种查找很简单。首先,创建一个朋友名单。

 

 然后,依次检查名单中的每个人,看看他是否是芒果销售商。

 

 假设你没有朋友是芒果销售商,那么你就必须在朋友的朋友中查找。

 

 检查名单中的每个人时,你都将其朋友加入名单。

 这样一来,你不仅在朋友中查找,还在朋友的朋友中查找。别忘了,你的目标是在你的人际关系网中找到一位芒果销售商。因此,如果Alice不是芒果销售商,就将其朋友也加入到名单中。这意味着你将在她的朋友、朋友的朋友等中查找。使用这种算法将搜遍你的整个人际关系网,直到找到芒果销售商。这就是广度优先搜索算法。

 代码:

<?php

class Search {
    public function test($arrs) {
        foreach ($arrs as $arr) {
            $queue = $arr;
            $tag = false;
            while (!empty($queue)) {
                $person = array_shift($queue);  //取一个节点
                $searched = []; //标记已经访问过的节点
                if (in_array($person, $searched)) continue; //避免重复查找
                $searched[] = $searched;
                if ($this->person_is_seller($person)) {     //是否为芒果经销商
                    echo 'person ' . $person;
                    $tag = true;
                } else {
                    $queue = array_merge($queue, $arrs["$person"]); //将朋友的朋友放入到队列中
                }
            }
            if ($tag) {
                return;
            }
        }
    }

    public function person_is_seller($name) {
        return strpos($name, 'm');
    }
}

$arr = [
    'you' => ["alice", "bob", "claire"],
    'bob' => ["anuj", "peggy"],
    'alice' => ["peggy"],
    'claire' => ["tho", "jonny"],
    'peggy' => [],
    'anuj' => ['nm'],
    'thom' => [],
    'jonny' => []
];

$target = new Search();
$target->test($arr);
原文地址:https://www.cnblogs.com/8013-cmf/p/12517851.html