Python在社交图上使用广度优先搜索

Python在社交图上使用广度优先搜索,python,algorithm,social-networking,traversal,breadth-first-search,Python,Algorithm,Social Networking,Traversal,Breadth First Search,我已经阅读了很多关于如何使用广度优先搜索、dfs、a*等的stackoverflow问题,问题是什么是最佳使用以及如何在模拟图中实现它。例如 假设你有一个Twitter/Facebook/某个社交网站的社交图,在我看来,搜索算法的工作原理如下: 如果用户A有10个朋友,那么其中一个有2个朋友,另一个有3个。搜索将首先找出用户A的朋友是谁,然后必须查找十个用户中每个人的朋友。对我来说这好像是bfs 然而,我不确定这是否是实现算法的方法 谢谢,谢谢我的两分钱,如果你只是想遍历整个图形,那么使用什么算

我已经阅读了很多关于如何使用广度优先搜索、dfs、a*等的stackoverflow问题,问题是什么是最佳使用以及如何在模拟图中实现它。例如

假设你有一个Twitter/Facebook/某个社交网站的社交图,在我看来,搜索算法的工作原理如下:

如果用户A有10个朋友,那么其中一个有2个朋友,另一个有3个。搜索将首先找出用户A的朋友是谁,然后必须查找十个用户中每个人的朋友。对我来说这好像是bfs

然而,我不确定这是否是实现算法的方法


谢谢,

谢谢我的两分钱,如果你只是想遍历整个图形,那么使用什么算法并不重要,只要它只命中每个节点一次。这似乎是你注意到的:

我只是想遍历整个图表

这意味着你的术语在技术上是有缺陷的——你说的是行走一个图形,而不是搜索一个图形。除非你真的想寻找一些特别的东西,而你在问题中根本没有提到

综上所述,Facebook和Twitter是非常不同的图形结构,它们确实会影响你如何使用它们:

  • Facebook基本上是一个无向图。如果X是Y的朋友,Y必须是X的朋友(或与X有关系,或与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)
    
    也许我没有抓住问题的重点,但现在你提出了一个关于没有搜索问题的搜索算法的问题。由于优化和搜索的本质,任何搜索算法的价值都将完全取决于您试图检查的搜索问题


    即使在相同的数据集中也是如此。毕竟,如果你要搜索每个名字以字母D开头的人,一个很好的方法就是按字母顺序对每个人排序,然后进行二进制搜索。相反,如果你想找出每个人与凯文·培根的分离程度,你会想要一个从培根先生开始,递归迭代每个认识他的人和他们认识的人的算法。这些都是你可以在Facebook或Twitter上做的事情,但如果没有任何细节,你真的无法推荐算法。因此,如果您什么都不知道,只需将每个人作为列表进行迭代即可。它和其他东西一样好。如果要优化,请缓存所有计算。

    对于我的两分钱,如果您只是尝试遍历整个图形,那么使用什么算法并不重要,只要它只命中每个节点一次。这似乎是你注意到的:

    我只是想遍历整个图表

    这意味着你的术语在技术上是有缺陷的——你说的是行走一个图形,而不是搜索一个图形。除非你真的想寻找一些特别的东西,而你在问题中根本没有提到

    综上所述,Facebook和Twitter是非常不同的图形结构,它们确实会影响你如何使用它们:

  • Facebook基本上是一个无向图。如果X是Y的朋友,Y必须是X的朋友(或与X有关系,或与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)
    
    也许我没有抓住问题的重点,但现在你提出了一个关于没有搜索问题的搜索算法的问题。由于优化和搜索的本质,任何搜索算法的价值都将完全取决于您试图检查的搜索问题


    即使在相同的数据集中也是如此。毕竟,如果你要搜索每个名字以字母D开头的人,一个很好的方法就是按字母顺序对每个人排序,然后进行二进制搜索。相反,如果你想找出每个人与凯文·培根的分离程度,你会想要一个从培根先生开始,递归迭代每个认识他的人和他们认识的人的算法。这些都是你可以在Facebook或Twitter上做的事情,但如果没有任何细节,你真的无法推荐算法。因此,如果您什么都不知道,只需将每个人作为列表进行迭代即可。它和其他东西一样好。如果你想进行优化,请缓存任何计算。

    我在facebook上有大约300个朋友,还有一些o