* @date 2017/6/17 * @license MIT * ------------------------------------------------------------- * æè·¯åæï¼ BFSå¹¶ä¸ä½¿ç¨ç»éªæ³åç®æ³ãä»ç®æ³çè§ç¹ï¼ææå 为å±å¼èç¹èå¾å°çåèç¹é½ä¼è¢«å è¿ä¸ä¸ªå è¿å åºçéåä¸ * æ¶é´å¤æåº¦ï¼O(n) * ------------------------------------------------------------- * 宽度ä¼å æç´¢ç®æ³ï¼å称广度ä¼å æç´¢ï¼æ¯æç®ä¾¿çå¾çæç´¢ç®æ³ä¹ä¸ï¼è¿ä¸ç®æ³ä¹æ¯å¾å¤éè¦çå¾çç®æ³çååã * Dijkstraåæºæçè·¯å¾ç®æ³åPrimæå°çææ ç®æ³é½éç¨äºå宽度ä¼å æç´¢ç±»ä¼¼çææ³ã * å ¶å«ååå«BFSï¼å±äºä¸ç§ç²ç®æå¯»æ³ï¼ç®çæ¯ç³»ç»å°å±å¼å¹¶æ£æ¥å¾ä¸çææèç¹ï¼ä»¥æ¾å¯»ç»æã * æ¢å¥è¯è¯´ï¼å®å¹¶ä¸èèç»æçå¯è½ä½ç½®ï¼å½»åºå°æç´¢æ´å¼ å¾ï¼ç´å°æ¾å°ç»æä¸ºæ¢ã */ class BFSQuery { /** * @var array å ³ç³»ç½ç» */ protected $relationship; /** * @var \SplQueue å¤çéå */ protected $queue; /** * @var string æç´¢ç»æ */ protected $target; /** * BFSQuery constructor. * * @param array $relationship * @param string $target */ public function __construct(array $relationship, $target) { $this->relationship = $relationship; $this->queue = new SplQueue(); $this->target = $target; $this->generator($this->relationship); } /** * å¼å§å ¥å * * @param array $relation * @return \Generator */ public function generator($relation) { foreach ($relation as $value) { $this->schedule($value); } } /** * éåå ¥é * * @param $item * @return int */ public function schedule($item) { $this->queue->enqueue($item); } /** * éå䏿¥æ¾ç¬¦åæ¡ä»¶ * * @return string */ public function run() { $result = $this->target . '没æäººæ~!'; while (!$this->queue->isEmpty()) { // åºéå $item = $this->queue->dequeue(); if (!isset($item['friend'])) { continue; } if (!isset($item['fruit'])) { continue; } $totalFruit = count($item['fruit']); $mark = 0; while ($totalFruit > $mark) { if ($item['fruit'][$mark] === $this->target) { $result = 'æ¾å°äºï½ï¼'; break 2; } $mark++; } $this->generator($item['friend']); } return $result; } } // +-------------------------------------------------------------------------- // | æ¹æ¡æµè¯ // +-------------------------------------------------------------------------- // ä½ ç°å¨éè¦ä¸ä¸ª `mango` ,æä»¥ä½ éè¦å¨ä½ çæååéæå®ï¼ä½ å¯ä»¥å ä»Jack ä¸ tom èº«ä¸æ¾ï¼ // ç¶ååä»ä»ä»¬çæåèº«ä¸æ¾ï¼ç¶ååä»ä»ä»¬æåçæååªéæ¾ $me = array ( 'jack' => array ( 'fruit' => array ('apple', 'banana', 'dragon'), 'friend' => array ( 'lucy' => array ( 'fruit' => array ('bear', 'watermelon'), 'friend' => array ( 'marco' => array ( 'fruit' => array ('mango', 'cherry'), // Mango å¨è¿å¿ 'friend' => array ( '...', ) ), ), ), 'bob' => array ( 'fruit' => array ('orange', 'mangosteen', 'peach'), 'friend' => array ( '', ), ), ), ), 'tom' => array ( 'fruit' => array ( 'apple', 'banana', ), 'friend' => array ( 'lucy' => array ( 'fruit' => array (), 'friend' => array ( 'lucy' => array ( 'fruit' => array ('bear', 'watermelon'), 'friend' => array ( 'marco' => array ( 'fruit' => array ('mango', 'cherry'), // Mango å¨è¿å¿ä¹æ 'friend' => array ( '...', ) ), ), ), ), ), 'bob' => array ( 'fruit' => array ('apple', 'peach'), 'friend' => array ( 'marco' => array ( 'fruit' => array ('mango', 'cherry'), // Mango å¨è¿å¿ä¹æ 'friend' => array ( 'Marco ææ æ°å¤ççå...', ) ), ) ), ), ) ); echo (new BFSQuery($me, 'mango'))->run();