Graph 查找图形中访问次数最多的节点

Graph 查找图形中访问次数最多的节点,graph,tree,least-common-ancestor,Graph,Tree,Least Common Ancestor,图中有N个节点由N-1条边连接。从一个节点到任何其他节点,正好有一条最短路径。节点编号从1到N。给定的Q查询告诉源节点和目标节点。通过这些Q路径查找访问次数最多的节点。例如,假设Q=3 和3个查询是: 1 5 2 4 3 1 因此,从节点1移动到节点5,然后从节点2移动到节点4,然后从节点3移动到节点1。最后,在Q查询之后找到访问量最大的节点。 查找每个路径并增加每个访问的节点数是一种幼稚的方法。面试官让我优化它。优化通常涉及权衡;在某些情况下,一种算法明显优于另一种算法,但在其他情况下,

图中有N个节点由N-1条边连接。从一个节点到任何其他节点,正好有一条最短路径。节点编号从1到N。给定的Q查询告诉源节点和目标节点。通过这些Q路径查找访问次数最多的节点。例如,假设Q=3 和3个查询是:

1 5

2 4

3 1
因此,从节点1移动到节点5,然后从节点2移动到节点4,然后从节点3移动到节点1。最后,在Q查询之后找到访问量最大的节点。
查找每个路径并增加每个访问的节点数是一种幼稚的方法。面试官让我优化它。

优化通常涉及权衡;在某些情况下,一种算法明显优于另一种算法,但在其他情况下,一种算法在一个方面(例如时间)更好,而另一种算法在不同方面(例如内存使用)更好

在你的例子中,我猜你的面试官正在寻找一种方法来优化你开始接收查询后必须完成的处理量,即使这意味着你必须对图表进行更多的预处理。我这样说的理由是“查询”;为“在线”查询优化数据源是很常见的。(当然,(s)他可能不希望你自己决定这个权衡是可以的;相反,(s)他可能希望就不同种类的权衡进行对话。)

所以,考虑到这一点

  • 我看到你已经用[树]和[最不常见的祖先]标记了你的问题,所以你大概已经做出了最大的观察,即:
    • 这个图形是一棵树。我们可以任意选择一个“根”,这样每个其他节点都有一个“父节点”、一个非零“深度”、一个或多个“祖先节点”,等等
    • 一旦我们这样做了,从节点a到节点b的最短路径包括节点a、节点b、a的所有祖先(不是b的祖先)、b的所有祖先(不是a的祖先)以及它们的“最不常见祖先”。(如果a是b的祖先,这一点仍然正确,反之亦然:如果a是b的祖先,那么它是a和b最不常见的祖先,反之亦然。如果a和b相同,这一点甚至仍然正确。)
  • 因此,我们可以进行以下预处理:
    • 将图形表示为从每个节点到其邻居列表的映射。(由于节点编号从1到N,因此此映射是由N个列表组成的数组。)
    • 选择一个根节点
    • 计算并存储每个节点的“父节点”和“深度”。(我们可以使用深度优先搜索或广度优先搜索在O(N)时间内完成此操作。)
    • 对于每对节点,计算并存储它们的“最小公共祖先”。(我们可以使用上一步和记忆的结果在总时间O(N2)内完成此操作,因为记忆提供了摊销。)
    • 初始化从每个节点到路径端点的映射次数,以及从每个节点到路径端点的最不常见祖先的映射次数。(注意:如果给定的路径是从单个节点到自身的,那么我们将计算它是路径端点的两倍,以及它是端点的最后一个公共祖先的一倍。)
  • 对于每个查询,更新两个映射。我们可以在每个查询的O(1)个时间内完成,总共O(Q)个时间
  • 最后:
    • 对图进行后序遍历,计算访问该节点的路径数。其逻辑如下:访问节点a的路径总数等于访问其每个子节点的路径数之和,减去其每个子节点作为路径端点的最后一个公共祖先的次数之和,再加上节点a本身作为端点的次数,减去路径本身是路径端点的最后一个公共祖先的次数(以抵消重复计数)
    • 返回上一步返回的最大数目的节点。如果多个节点为最大值绑定,则。我不知道,问题陈述对此含糊不清,你需要提出要求
总的来说,这需要O(N2)预处理、O(Q)每个查询的实时处理和O(N)后处理


如果N相当大,并且我们预计可能只访问了一次节点的一小部分,那么我们可以通过忽略树中未访问的部分来加快后处理。这涉及到维护一组作为路径端点的节点,然后以“自下而上”的方式进行后处理,从最深的节点开始,并且仅当访问该节点的路径数小于其作为公共祖先的次数时,才从给定节点“向父”移动。如果我们用P表示不同端点的数量,用M表示不同访问节点的数量,那么这可以用O(PlogP+M)这样的方式来完成。

您已经给出了这些Q路径,还是打算查询尽可能少的路径来推断哪个节点访问最多?结果是一个节点或所有节点具有相同的访问次数?我假设终端节点也被计算为已访问?只给出源节点和目标节点,而不给出路径。在将所有这些源路径移动到目标路径之后,一些节点将具有最大访问次数。我们需要找到那个伯爵。谢谢你的回答。我想在节点和节点的生命周期评价之间可能有一个简单的逻辑。因为面试官要我找出生命周期评价和节点之间的关系。顺便说一句,N和Q值高达100000。@zuccy:面试官有没有提到图表是如何表示的?谢谢senpai。