【问题标题】:find most visited node in a graph在图中找到访问次数最多的节点
【发布时间】:2018-11-23 16:44:26
【问题描述】:

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

1 5

2 4

3 1

所以从节点 1 到节点 5,然后从节点 2 到节点 4,然后从节点 3 到节点 1。最后,找出 Q 次查询后访问次数最多的节点是什么。 找到每条路径并增加每个访问的节点计数是一种幼稚的方法。面试官让我优化一下。

【问题讨论】:

  • 您是否已经给出了这些 Q 路径,或者打算查询尽可能少的路径来推断哪个节点被访问最多?结果是访问次数相同的一个节点还是所有节点?我想终端节点也算作访问过的?
  • 只给出源节点和目标节点,不给出路径。在将所有这些源路径传输到目标路径之后,一些节点将具有最大访问次数。我们需要找到那个计数。

标签: graph tree least-common-ancestor


【解决方案1】:

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

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

所以,考虑到这一点。 . .

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

总的来说,这需要O(N2)个预处理,O(Q em>) 每个查询的实时处理,以及 O(N) 后处理。

如果 N 非常大,并且我们预计可能只有一小部分节点被访问过一次,那么我们可以通过忽略树中未访问的部分来加速后处理。这涉及维护一组作为路径端点的节点,然后以“自下而上”的方式进行后处理,从最深的此类节点开始,并且仅当访问的路径数量为该节点小于它是最不共同祖先的次数。如果我们用 P 表示不同端点的数量,用 M 表示不同访问节点的数量,那么这可以用类似 O 的方式完成(P log P + M)。

【讨论】:

  • 感谢您的回答。我在想节点和节点的 LCA 之间可能存在一个简单的逻辑。因为面试官让我找LCA和节点的关系。 BTW N 和 Q 值高达 100000。
  • @zuccy:面试官有没有说图表是如何表示的?
  • 谢谢前辈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多