十度好友

问题:

在社交网络里(比如 LinkedIn),如果A和B是好友,B和C是好友,但是A和C不是好友,那么C是A的二度好友,给定一个社交网络的关系图,如何找到某一个人的所有十度好友。

分析:

如果想找到一个人的十度好友,马上想到的方法应该会是使用深度搜索(DFS)。我们可以从一个点(A),使用深度搜索的方式,当到达第十个点的时候,记录该点并返回到上一层节点,然后继续进行深度搜索,直到A节点的所有邻居节点都已经遍历过了。但是,这种方法有一个潜在的问题,因为从一个点到另一个点,它的路径会有很多条,所以,刚刚通过使用深度搜索的方法会存在一个潜在的问题,就是十度好友可能最后只是三度好友或者五度好友。

其实,我们可以利用BFS的思路,对这个图进行按“层”的搜索。大致思路如下:

1: 把A点放在Queue1 里,设 degree = 0;

2: While (degree != 10 && Queue1.size() != 0)

2.1: 依次遍历Queue 1 里所有的元素,把每一个元素的没有被访问的邻居节点放在Queue 2。 同时把该元素从Queue1里删除。

2.2: 把Queue 2 中所有的元素放在Queue1 里,同时清空 Queue 2。(在 2.1 步里,Queue1 已经为空了。)

2.3:   degree++;

3: 输出Queue1里的所有元素。(Queue1 里包含的一定是十度好友)

这种方法的复杂度是O(|E| + |V|) 。

这个问题的本质也是最短路径问题。对于最短路径问题,最常见的方法莫过于Dijkstra's Algorithm,所以,假设好友和好友的边的长度为 1, 那么我们可以利用Dijkstra's algorithm找出一个点到所有点的最短路径,然后遍历一遍就可以找到十度好友了。此方法的复杂度为O(|E| + |V| log |V|) 。


转载请注明出处:http://blog.csdn.net/beiyeqingteng

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值