我正在为即将举行的考试做准备。提供给我的图表具有以下算法复杂性,对具有N个节点和E边的图的邻接列表进行了总结。
我理解邻接列表是什么-我们使用一个列表数组来存储与每个顶点相邻的顶点。但为什么这些行动是O(E/N)?在我看来,如果我们用一个图来绘制每个可能的边(例如,如果图是无向的,我们有n(n - 1)/2边),那么数组中的每个列表都会有N-1项来存储每一个其他节点。
在我看来,这将是“最坏的情况”,不是吗?我不明白边缘和节点的比率是如何得到的。
谁能解释一下吗?
发布于 2019-05-01 23:23:16
我相信这个问题与另一个问题在堆栈溢出上的问题非常相似,请参考它,因为它可能已经回答了您的问题。为了完整起见,我也会尝试总结我对这个话题的理解,但我在这个问题上并不权威,所以如果我说错了什么,请随时纠正:
我能理解的是,当我们都知道最坏的情况是O(N)的时候,为什么图表上说操作是O(E/N)。嗯,这里有两个问题:
这里的一个快速回答是,大O可以用来“谈论”这两种情况。当我们谈论平均输入时,它将是O(E/N),当我们谈论最坏的输入时,它将是O(N)。
现在,让我们看到一个更长的解决每个枚举问题的答案:相应地,对于“算法导论”一书,我们可以将大O定义为:
O(g(n)) ={ f(n):存在正常数c和n0,使得所有n >= n0}都存在0 <= f(n) <= cg(n)
注意,这个定义没有提到最坏的情况,它只是说,如果我们有一个函数f(n),并且我们可以提供一个常数c和一个n0,使0 <= f(n) <= cg(n)对于每n个>= n0,那么f(n)在O(g(n))中。因此,这里忽略了最坏的情况,如果我们可以提供一个函数f(n),一个常数c和一个不违反上述定义的n0,那么f(n)在O(n)中。
这里我们只讨论输入情况的上界,这可能是最坏的输入,平均输入或任何其他输入情况。
如果算法存在“最坏输入”= w(n)和“平均输入”= a(n),则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) (最坏的情况或平均情况),那么我们不能肯定任何事情,图表必须更具体。
这里的常见行为是假设文本是指最坏的情况输入,这可能就是为什么我们把大O和最坏的情况联系起来的原因,而大多数情况下,这个假设有时是正确的(就像你提到的图表)--它是错误的。
https://stackoverflow.com/questions/55932457
复制