参考资料: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);