【问题标题】:Why are operations in an adjacency list O(|E|/|V|)$?为什么邻接表中的操作是 O(|E|/|V|)$?
【发布时间】:2019-05-01 06:33:11
【问题描述】:

我正在准备即将参加的考试。提供给我的图表具有以下算法复杂性,针对具有 N 个节点和 E 条边的图的邻接列表进行了总结。

  • 寻找边缘 - O(E/N)

  • 插入边 - O(E/N)

  • 删除边 - O(E/N)

  • 枚举节点的边 - O(E/N)

我了解邻接列表是什么——我们通过使用列表数组来存储与每个顶点相邻的顶点。但是为什么这些操作是 O(E/N)?在我看来,如果我们绘制了一个图,其中绘制了所有可能的边(例如,如果图是无向的,我们有 n(n - 1)/2 条边),那么数组中的每个列表都会有 N - 1存储每个其他节点的条目

在我看来,这将是“最坏的情况”,不是吗?我不明白如何获得边与节点的比率。

谁能解释一下?

【问题讨论】:

  • 因为平均而言,一个节点将有 E/N 条与该节点相关的边。
  • 但我认为 big-o 正在考虑最坏的情况?
  • 相同的符号有时用于平均情况和最坏情况。文字应该清楚地表明它是什么。

标签: algorithm graph big-o


【解决方案1】:

我相信这个问题与 stackoverflow 上的this other question 非常相似,请参考它,因为它可能已经回答了您的问题。 为了完整起见,我也会尝试总结我对该主题的理解,但我不是该主题的权威,所以如果我说错了,请随时纠正:

据我所知,您在质疑为什么图表说操作是 O(E/N),而众所周知,最坏的情况是 O(N)。好吧,这里有两个问题:

  1. 您假设大 O 表示“最坏情况输入”,但根据定义,我们不能假设这一点。
  2. 该图表仅显示 O(E/N),正如 @domen 评论的那样,文本应该更清晰,并表明它正在考虑哪种输入情况。

这里的一个快速回答是,大 O 可以用来“谈论”这两种情况。当我们谈论 average input 时将是 O(E/N),当我们谈论最差输入时它将是 O(N)。

现在让我们看一个更长的答案来解决每个列举的问题: 根据"Introduction to algorithms"这本书,我们可以将大O定义为:

O(g(n)) = { f(n):存在正常数 c 和 n0 使得 0 = n0}

请注意,定义并没有说明最坏的情况,它只是说如果我们有一个函数 f(n) 并且我们可以提供一个常数 c 和一个 n0 使得 0 = n0 则 f(n) 在 O(g(n)) 中。所以忘记这里最坏的情况吧,如果我们可以提供一个函数 f(n)、一个常数 c 和一个不违反上述定义的 n0,那么 f(n) 在 O(n) 中。
在这里,我们仅讨论该输入情况的上限,这可能是最差输入、平均输入或任何其他输入情况。
如果算法具有“最差输入”= w(n) 和“平均输入”= a(n),其中存在 c',n'0 使得 0 = n'0 并且存在一个 c'',n''0 使得 0 = n''0 那么我们可以说算法在最坏情况下是 O(n),在平均情况下是 O(e/n)。

如果图表没有指定它正在考虑的 f(n)(以最坏情况或平均情况为例),那么我们无法确认任何事情,图表必须更具体。
这里的常见行为是假设文本指的是最坏情况输入,这可能就是我们将 Big O 与最坏情况联系起来的原因,而大多数时候这个假设有时是正确的(就像你提到的图表一样)它是错误的.

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2015-01-01
    • 2018-12-18
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多