今天去一家公司面试,面试官出了一道算法题:
一堆相连的房间,房间和房间之间有门,数量不定。然后就是小老鼠从角落出发,找到有唯一有奶酪的房间。
题目很简单,典型的小老鼠走迷宫,图搜索算法。
说道图搜索,比较常见的么 BFS,DFS,A* 这几种算法。
小老鼠走迷宫这类问题,和直接的图搜索有区别的就是,路径包含状态的回退。图搜索算法,要么队列,或者栈中,保存的都是待搜索节点,中间存在跳跃,需要进行回退,以保持小老鼠移动的连续性。
这三种方法中,DFS的移动到待搜索节点是最简单的,根据历史路径回退即可。而BFS和A*移动到待搜索节点,则需要计算中间路径(我用的是当前节点的历史路径和目标节点的历史路径,求公共点,添加到移动路径中,此方法同样适用于DFS),所以BFS和A*,会看起来更复杂。
但是,DFS回退是简单,但是DFS的搜索效率是比较低的,尤其在迷宫很大的时候。
所以还是推荐使用A*算法,估值函数的使用,会使得搜索更加高效。尤其在节点很多的场景下越发明显。
简单 ≠ 高效