当使用图形作为输入分析算法的复杂性时,我很难区分多项式运行时和伪多项式运行时。
图表有| A |弧和| V |顶点。算法的复杂度为O(| A | * K ^ 2),其中K是一些常数。
是复杂多项式还是伪多项式?它是否取决于图形是否被指定为邻接列表或邻接矩阵?
答案 0 :(得分:0)
简答:对于邻接列表,算法肯定是多项式(因而是伪多项式),对于邻接矩阵,它取决于图的“密集”程度。
为了制定算法,我们需要一些方法以机器可读的形式对输入进行编码。在最理论的版本中,这意味着图灵机的输入。如果我们有一个包含n
个顶点和m
边的图,我们可以编写以下表示(类似于边列表):
n#u1,v1#u2,v2#...#um,vm
其中ui
是起始顶点的编号,vi
是i
- 边的结束顶点的编号。
如果我们使用数字的二进制表示(即数字k
占用O(log k)空间),那么我们的整个图形可以表示为长度为L = O的输入字(log n * m)
如果我们使用一元表示,我们的输入字的长度为L = O(n * m)。
多项式(或伪多项式)意味着如果我们的输入数字表示为二进制(或一元)数字,则算法在某些固定k时最多需要O(L ^ k)时间。
你的算法有运行时O(m)(常量可以用Big-O表示法省略),对于邻接列表(使用O(log n * m)空间)肯定是多项式(k = 1)
对于邻接矩阵(使用O(n²)空间),这仅适用于我们在边数上有一些渐近下界,但是如果我们至少有Ω(n)个边(例如,如果图连接)。