让我们使用一种算法来查找有向、无环、非加权图中两个节点之间的所有路径,该图中可能在相同的两个顶点之间包含多个边。 (这个 DAG 只是一个例子,请我不是专门讨论这个案例,所以尽管它是正确的,但我认为它是正确的,请忽略它的正确性)。

我们有两个影响因素:

  • mc :顶点的最大输出边数。
  • ml :通过边数测量的最大长度路径的长度。

  • 使用迭代方式来解决问题,下面的复杂性代表完成的处理操作的计数。

    对于第一次迭代,复杂度 = mc
    对于第二次迭代,复杂度 = mc*mc
    对于第三次迭代,复杂度 = mc*mc*mc
    对于(最大长度路径)第 次迭代,复杂度 = mc^ml
    最坏的总复杂度是 (mc + mc*mc + ... + mc^ml)

    1- 我们可以说它是 O(mc^ml) 吗?

    2- 这是指数复杂度吗?据我所知,在指数复杂度中,变量仅出现在指数处,而不出现在基数处。

    3- mcml 都是我算法复杂性中的变量吗?

    最佳答案

    有一种更快的方法可以在 O(V + E) 中获得答案,但似乎您的问题是关于计算复杂性,而不是关于优化算法。

    是的,好像是 O(mc^ml)是的,它们 bot 可以是算法复杂度中的 变量

    至于算法的复杂性:让我们使用 a^b = e^(b*ln(a)) 的事实进行一些转换:
    mc^ml = (e^ln(mc))^ml = e^(ml*ln(mc)) < e^(ml*mc) if ml,mc -> infinity
    所以,基本上,你的算法复杂度上限是 O(e^(ml*mc)) ,但我们仍然可以缩短它,看看它是否真的是指数复杂度。假设 ml, mc <= N ,其中 N 是,比方说, max(ml, mc) 。所以:
    e^(ml*mc) <= e^N^2 = e^(e^2*ln(N)) = (e^e)^(2*ln(N)) < (e^e)^(2*N) = [C = e^e] = O(C^N)

    因此,您的算法复杂度将是 O(C^N) ,其中 C 是一个常数,而 N 的增长速度不会快于线性。所以,基本上 - 是的,它是指数复杂性。

    关于algorithm - 指数复杂度特定情况下的大 O,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30001597/

    10-12 07:36