一、择路问题
假设你要从A城市前往B城市,途中可以选择几条路径,该怎样选择才能做到最快到达B城(假设从一个城市到临近城市用时相同)。如图:
二、图模型
无论数组还是链表,储存的数据都是相互独立、互不相干的。但像上面所提出的择路问题一样,城市与城市之间是有连接的。像解决这种数据与数据相关联的问题时,我们所用到的模型叫图模型。
图模型我们用散列表来实现。
三、广度优先搜索
类似于数组的二分查找,图模型也有自己的数据查找算法,就是广度优先搜索。
广度优先搜索解决两类问题:①图模型中,两节点之间有无路径;②两节点之间的最短路径。
四、芒果经销商问题
问题:如果你有一个芒果农场,你要寻找芒果经销商卖出你的芒果,请问你应该怎样在你朋友圈中查找?
解决思路:建立一个名单,把你的朋友全部写进去。逐一排查每一个朋友,如果他不是芒果经销商,则把他的朋友加入到排查名单上......
这就是广度优先搜索,先从源节点查询它的邻节点,然后从各邻节点查询它们的邻节点,直到找到目标位置。
五、队列
上面提到一个名单,能让我们从名单前面取出元素,然后从名单后面追加元素。这就是一个队列,队列是一种先进先出的数据结构。它就像我们平时的排队队伍一样,先进入队伍的人先走出队伍得到服务。
六、查找经销商的算法实现。
1、步骤:
(1)建立图模型;
(2)创建队列,把源节点的邻节点加入到队列;
(3)创建已检查名单;
(4)循环检查过程。
2、代码示例: