【问题标题】:most efficient algorithm to set the twin pointer设置双指针的最有效算法
【发布时间】:2016-06-16 14:29:34
【问题描述】:

在无向简单图 G = (V, E) 的邻接表表示中,每条边 (u, v) 有两个邻接表条目:[v] 在 u 的邻接表中,[u] 在v 的邻接表。这些被称为彼此的双胞胎。孪生指针是从邻接表条目到其孪生的指针。如果 |E| = m 和 |V| = n,并且内存大小不是约束,在每个邻接表的每个条目中设置孪生指针的最有效算法的时间复杂度是多少?

  1. Θ(n^2)
  2. Θ(m+n)
  3. Θ(m^2)
  4. Θ(n^4)

我的尝试:

官方给出的答案是Θ(m+n)。可以通过跟踪图的 BFS 或 DFS 中的父节点来设置双指针。

你能给出最有效的算法来在每个邻接列表的每个条目中设置孪生指针吗?

【问题讨论】:

  • 您的意思是:最初,邻接表是在未初始化双指针的情况下给出的——初始化双指针的时间复杂度是多少?
  • @Codor,你能按照他的问题给出算法吗? IMO:它是根据 BFS 还是 DFS,rt?
  • 是的,我想是的,它应该是 Θ(m+n) 然后(即线性时间)。

标签: c algorithm pointers time-complexity adjacency-list


【解决方案1】:

由于这里内存不是一个约束,首先我们将创建一个数据结构来存储每个邻接表的邻接条目的地址。为了更快地检索,我们将创建一个大小为 (n2) 的指针的二维数组,该数组将指向图中的邻接条目。 如果 u 和 v 之间有一条边,那么我们的数据结构 A[u][v] 包含 u 的邻接表中 v 的邻接条目的地址。否则它可以为 NULL。如需更清晰的图片,请参考下图。

【讨论】:

  • "参考下图"哪张图片?
【解决方案2】:

为了表示一个图,如果我们使用矩阵,那么设置孪生指针的最有效算法的时间复杂度将是O(n2). 现在,如果我们使用邻接表,它将是:

2(Edges + Vertices) = 2(m+n) = O(m+n).

因此选项 (B) 是正确答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多