用于查找任何给定程序的时间复杂度的程序/算法

时间:2009-09-22 16:32:26

标签: algorithm time-complexity

我想知道是否有可能“编写程序算法来查找任何给定程序的时间复杂度作为输入。

输入任何程序(P)[任何语言或特定语言]

输出该程序的时间复杂度(P)。

以前有没有尝试过编写这样的程序? 有没有可用于此目的的算法?

如果是,请提供必要的链接,参考资料或任何可能的指导。

4 个答案:

答案 0 :(得分:29)

没有。这是不可能的。这是halting problem.

的一种形式

答案 1 :(得分:4)

证明任意算法的复杂性是不可能的,但原则上你可以估计它:

  1. 选择n,输入的大小
  2. 运行算法
  3. 观察t(n),运行算法输入大小为n
  4. 所需的时间
  5. 选择另一个n,重复步骤2和3,直到您拥有大量数据
  6. 对n,n ^ k,log(n),n log(n),n!或任何其他的回归t(n) 可能适当的术语
  7. 选择具有统计显着性的术语并声明 是你估计的算法的复杂性
  8. 这种方法存在许多陷阱

    1. 这不会证明什么,只估计
    2. 如果对于大n,t(n)变得非常大,则需要很长时间 为您的分析收集足够的数据
    3. 除非您使用巨大的值,否则有很多方法可以愚弄这种方法 n。例如,除非使用天文,否则此算法看起来像O(1) n的值

      sleep for 10 days
      run an O(n log(n)) sorting algorithm
      
    4. 其他SO用户可以拿出更多。但在某些情况下,例如当您对算法进行复杂性分析并希望根据经验进行验证时,这仍然是一种有用的方法。

答案 2 :(得分:0)

我们不能在算法本身中引入更多变量,并且以与我们手动操作相同的方式找到复杂性。 例如,我们可以在插入排序中有一个变量,例如n = 0,它保留算法的整个循环部分的轨迹,然后给出答案为O(n ^ 2)

答案 3 :(得分:-3)

嗯,我认为你通过假设所有案例来做到这一点。 1:首先制作一个可以提取每条指令的模块 2:建立一个与程序指令匹配的指令数据库。 3:通过获取您在数据库中设置的适当时间复杂度来计算复杂性,这就是全部。