【问题标题】:Big O for exponential complexity specific case指数复杂度特定情况的大 O
【发布时间】:2015-05-02 11:13:28
【问题描述】:

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

我们有两个影响因素:

  1. mc:一个顶点的最大输出边数。
  2. ml:最大长度路径的长度,由边数测量。

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

对于第一次迭代,复杂度 = mc

对于第二次迭代,复杂度 = mc*mc

对于第三次迭代,复杂度 = mc*mc*mc

对于第(最大长度路径)迭代,复杂度 = mc^ml

总的最差复杂度是(mc + mc*mc + ... + mc^ml)

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

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

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

【问题讨论】:

  • 你为什么要使用那个算法呢?另外,为什么要查找节点之间的 all 路径(相对于最好的、最便宜的等)?
  • 如果你的图是非循环的,那么 2 个节点之间只有 01 路径。
  • 另外,请注意,无论如何你都可以说它是O(2^2^2^2^mc^ml^2^2^mc*ml^mc^ml) - O 表示法只是一个上限,你不必把它弄得很紧(尽管你的界限无论如何,对于 DAG 来说绝对不是很紧,你可以在 O(number of nodes) 中做到这一点,甚至可能在 NLOGSPACE 中使用 Tarjan 的算法。
  • @FalconUA - DIRECTED 无环图并非如此。
  • 哦,抱歉,没有正确阅读问题

标签: algorithm time-complexity complexity-theory


【解决方案1】:

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

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

关于你的算法的复杂性:让我们做一些转换,使用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 的增长速度不会快于线性。所以,基本上 - 是的,它是指数复杂度。

【讨论】:

  • 谢谢。但是,1-如果复杂性最初是 O(mc^ml) 和 O(mc^ml) stackoverflow.com/questions/29995965/…
  • 并请记住,我的 DAG 可能在相同的两个顶点之间包含多个边,以进行说明:考虑一个简单(甚至极端)的示例,例如三个顶点 v1、v2、v3 和六个边 e1 ,...,e6 其中前三个边连接 v1 和 v2,后三个边连接 v2 和 v3。因此,我们有 3*3 = 9 条路径, e1e4, e1e5, e1e6, e2e4,...,e3e6 。嗯,这有一个指数增长,不能与我们有 3 个顶点和 6 个边的图大小成线性关系。
猜你喜欢
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多