算法可以在多大程度上预测任意输入程序的时间复杂度?


23

停机问题指出,这是不可能写一个程序,可确定是否存在另一个程序暂停,对于所有可能的输入程序

但是,我当然可以编写一个可以计算如下程序的运行时间的程序:

for(i=0; i<N; i++)
    { x = 1; }

并返回的时间复杂度,而无需运行它。ñ

对于所有其他输入程序,它将返回一个标志,表明它无法确定时间复杂度。

我的问题是这样的:

必须满足什么条件,以便我们可以算法确定给定程序的时间复杂度?

*如果对此有规范的参考或评论文章,请在评论中提供链接。


1
(1)“ O表示法”并不表示“时间复杂度”。(2)不清楚“ O(无穷大)”是什么意思。请尽可能避免发明新的表示法。(3)决定一个给定的程序是否暂停,并给出一个明确的程序时间复杂度上限是不同的。
伊藤刚(Tsuyoshi Ito)

1
我对在受限类中推断程序的时间复杂度并不熟悉,但是一类值得检查的程序称为“有界循环程序”,可以很容易地限制其时间复杂度。我记得UweSchöning和Randall J.Pruim在《理论计算机科学宝石》第3章中讨论了两个程序的等效性时讨论了有界循环程序,但是我不确定该章与您的问题有多大的关联。
伊藤刚(Tsuyoshi Ito)2012年

4
我有点困惑。这以什么方式超出范围?OP的问题的一个合理答案是语言片段(甚至片段类别),可以通过算法确定运行时间。
Suresh Venkat 2012年


7
我对这个评论话题太迟了。当帖子闻到新手味时,我们似乎会扑鼻。我没有指责。我自己感觉到这种本能。也许我们应该更温柔些。OP承认不熟悉该领域或术语。如果我们只容忍确切知道他们想要什么的人,并以我们的语言提出要求,那么问题解答站点的意义何在?
Vijay D

Answers:


23

ŤpŤ

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pŤ

但是,关于程序复杂度的有效计算已经进行了很多工作。我特别喜欢隐式复杂性理论,该理论旨在创建使用特殊构造或类型规范的语言,该语言允许人们仅编写驻留在某个定义明确的复杂性类中的程序。我认为这是一个奇迹,这些语言对于该课程通常是完整的!

J.-Y 在本文中描述了一个特别好的示例。Marion描述了一种微小的命令式语言,其类型规则受到了信息流和安全分析技术的启发,该技术可以表征P中的算法。


另外,请参见Epigram,这是一种可以保证终止的语言。
Realz Slaw 2012年

这是一个不错的开始,但是还有更多要说的吗?(例如,在我看来,给定的基本递归函数的运行时必须易于计算,但是此类函数可以解决指数层次结构中的任何问题。...)
usul 2012年

只要可以确定输入程序是用受限语言编写的,就可以假设时间复杂度受该语言施加的上限的限制。但是,许多原始递归函数具有更高效的通用递归等效项
Chris Pressey,2012年

1
(偶然地,该评论保存得很早,然后超过了5分钟的限制。第二句话应如下所示:)但是,这些受限语言中的程序可能与受限程度较低的语言中的等效项更加有效(具体而言,许多原始递归函数具有通用的递归等效项(效率更高)),在实践中鼓励使用不受限制且难以分析的语言。
克里斯·普雷西

克里斯,这很有趣!你有参考吗?实际上,这似乎是不合逻辑的:我怀疑原始递归函数可以在给定数量的步骤中模拟通用递归函数,从而将加速限制在某个恒定因子上。
科迪2012年

11

您提出的问题和您描述的具体计数技巧是程序分析中的经典问题。复杂性分析存在理论上的问题,它在自动估计一段代码的性能方面具有实际表现。此类自动化分析具有多种应用程序,从检测性能错误到估算云中某些计算的成本。

科迪指出,总的来说这个问题是无法确定的。这个问题比证明终止更难,因为获得复杂性限制意味着程序也将终止。有两种方法可以解决此问题。一种是来自程序分析。自70年代以来,一直存在添加计数器并估算其值的想法。这种编码将确定运行时间的问题减少到计算不变量的时间。

第二种方法是设计一种编程语言,该语言仅允许具有一定有限复杂性的程序。这是隐式计算复杂性的领域。

以下是这两个领域的一些参考。

  1. SPEED项目,是程序分析工作的一条特定线,着重于一旦引入程序后如何找到计数器的界限。计数器可以测量时间或空间消耗。
  2. 多元摊销资源分析,Jan Hoffman,Klaus Aehlig,Martin Hoffman,ACM TOPLAS 2012
  3. 关于命令式程序的可确定的增长率,Amir Ben Amram,《隐式计算能力的发展》,2010年。这是一条通过句法限制来限制命令式程序复杂性的漂亮方法。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.