我一直在阅读很多关于如何使用广度优先搜索,dfs,A *等的stackoverflow问题,问题是什么是最佳用法以及如何在现实中模拟图形中实现它。 E.g。
考虑一下你有Twitter / Facebook /某社交网站的社交图,对我来说,似乎搜索算法的工作原理如下:
如果用户A有10个朋友,那么其中一个有2个朋友而另外3个朋友。搜索将首先确定用户A的朋友是谁,然后它将不得不查找朋友在哪里为10个用户中的每个用户。对我来说,这似乎是bfs?
但是,我不确定这是否是实现算法的方法。
谢谢,
答案 0 :(得分:0)
对于我的两分钱,如果你只是试图遍历整个图表,那么你使用的算法并不重要,只要它只触及每个节点一次。当你注意到时,这似乎就是你所说的:
我只是试图遍历整个图表
这意味着您的术语在技术上存在缺陷 - 您正在谈论行走图表,而不是搜索图表。除非你真的试图特别寻找某些东西,否则你在问题中似乎没有提及。
有了这个说法,Facebook和Twitter是非常不同的图形结构,它们对你如何走路产生影响:
Facebook基本上是一个无向图。如果X是Y的朋友,Y必须是X的朋友。(或者与...有关系,或与之有关系等)。
Twitter基本上是一个有向图。如果X跟随Y,则Y不必跟随X.
这些问题会对图形行走算法产生重大影响。说实话,如果你只是想访问所有节点,你甚至需要一个图表吗?为什么不迭代所有这些呢?如果某些数据结构MY_DATA中的所有节点都是可迭代的,那么你可以使用这样的生成器表达式:
def nodeGenerator(MY_DATA)
for node in MY_DATA:
yield node
显然,您需要调整nodeGenerator内部以处理实际访问节点的方式。话虽如此,大多数图形结构都实现了一个节点迭代器。然后,您可以随时通过以下方式创建迭代器:
for node in nodeGenerator(MY_DATA):
(Do something here)
也许我只是错过了这里的问题,但目前你提出了一个关于没有搜索问题的搜索算法的问题。由于优化和搜索的No Free Lunch性质,任何搜索算法的价值都将完全取决于您尝试检查的搜索问题。
即使在同一数据集中也是如此。毕竟,如果你正在搜索名字以字母D开头的所有人,那么一个很好的方法就是按字母顺序排序每个人并进行二分搜索。如果你试图找到每个人与凯文·培根的分离程度,你就会想要和算法一起从培根先生那里开始,并递归地遍历知道他的每个人和他们认识的每个人。这些都是你可以在Facebook或Twitter上做的事情,但没有任何细节,实际上没有办法推荐算法。因此,如果你什么都不知道,只需将每个人作为一个列表进行迭代。它和其他任何东西一样好。如果您想要优化,请缓存任何计算。
答案 1 :(得分:0)
我在facebook上有大约300个朋友,我的一些朋友平均也有300个朋友。如果你要用它来构建一个图形,那将是巨大的。纠正我,如果我错了? 。在这种情况下,BFS将要求退出吗?
由于 Ĵ