为什么在邻接表O(| E | / | V |)$中进行运算?

时间:2019-05-01 06:33:12

标签: algorithm graph big-o

我正在为即将参加的考试而学习。提供给我的图表在具有N个节点和E个边的图的邻接表中总结出以下算法复杂性。

  • 发现边缘-O(E / N)

  • 插入边-O(E / N)

  • 删除边缘-O(E / N)

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

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

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

有人可以解释吗?

1 个答案:

答案 0 :(得分:1)

我认为此问题与stackoverflow上的this other question非常相似,请参阅此问题,因为它可能已经回答了您的问题。 为了完整起见,我也会尝试总结一下我对该主题的理解,但是我没有这个主题的权威,因此,如果我说错了任何内容,请随时进行纠正:

据我所知,您正在质疑为什么图表在已知最坏的情况是O(N)时说运算是O(E / N)。好吧,这里有两个问题:

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

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

现在让我们看一个更长的答案来解决每个列举的问题: 根据{{​​3}}这本书,我们可以将big O定义为:

  

O(g(n))= {f(n):存在正常数c和n0,使得对于所有n> = n0而言,0 <= f(n)<= cg(n)}

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

如果图表未指定要考虑的f(n)(以最坏情况或平均情况为例),则我们无法确认任何内容,图表必须更具体。
此处的常见行为是假设文本引用的是最坏情况的输入,这可能就是为什么我们将Big O与最坏情况相关联的原因,而在大多数情况下,这种假设有时是正确的(例如您提到的图表),这是错误的。