【问题标题】:How would you estimate the time complexity for this algorithm?你如何估计这个算法的时间复杂度?
【发布时间】:2013-06-21 06:16:29
【问题描述】:

令 N=顶点数 M=边数 有向图 G. 我们以邻接表的形式存储边。 为了清楚起见,我们假设 Oi 是顶点 i 的出度,Ii 是顶点 i 的入度。

算法如下:

for each vertex i
  for each vertex j in i's adj.list
    //do some work
    for each vertex k in j's adj.list
      //do some work

“做一些工作”基本上是在恒定时间内完成的 (O(1))。我无法用 N,M 推导出运行时间的一般表达式。有人能解释一下如何做到这一点吗?

顺便说一句: 只是为了防止“我不会做你的作业”cmets,我正在练习 CLRS 的文本问题(这个是 22.1-5)。我这样做是为了学习如何估计图算法的时间复杂度。

【问题讨论】:

    标签: algorithm time-complexity asymptotic-complexity


    【解决方案1】:

    我假设算法中提到的每个邻接列表都是一个传出边列表。如果同时引用传入和传出边,则总工作将乘以常数 4,而不影响 O() 级别。

    for 语句称为 F1、F2、F3,我们有 F1 循环 N 次。 F2 总共循环了O1+O2+... = M 次,其中Oi 是问题中提到的出边度数。 F3 每次 F2 循环最多循环 N 次,最坏的情况没有比这更小的下限。这导致算法的时间为 O(M·N)(即,F1 和 F2 的 O(M),F3 的 O(N))。

    【讨论】:

    • 谢谢,有道理:)
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多