我在理解Djisktra算法的复杂性时遇到了一些问题,并希望有人能够纠正我。
在我的例子中,我拍摄了一个包含n个顶点的完整图形。
你选择一个起始顶点,让我们说a1,标记它,然后计算边缘上的所有n-1个权重。为O(n)
你挑选最小的一个。让我们说顶点a2并标记它。为O(n)
之后,您在边缘上计算n-2个新权重,并查找下一个未标记的顶点以添加您标记的顶点集。
等等......
算法运行直到您可以标记所有顶点。复杂性:n-1 + n-2 + ... + n - (n - 1)= Binom(n,2),它在O(n ^ 2)中,而不是O(n * ln(n))我是什么想。
我读了很多次人们使用堆进行优化,但是我仍然没有看到如何避免Binom(n,2)计算。
我必须在某些方面犯错,但不要看到哪里。
答案 0 :(得分:5)
如果你有完整的图表,那么你当然不能做到比O(n ^ 2)更好 - 因为,这就是你输入的大小。
如果您没有完整的图表,并且将边缘存储在邻接列表中,那么您可以做得更好。您仍然需要查看所有边缘,但是使用优先级队列可以管理O(e + n log n),其中e是邻接列表中的边数。