无法回答问题“ 'while(System.in.readline()){}' 程序将要停止吗? ”的原因是没有指定输入,所以在这种特殊情况下,问题是缺少信息而不是不确定性。
停止问题是关于不可能构建一个通用算法,当同时提供一个程序和一个输入时,它总是可以判断带有该输入的程序是完成运行还是永远继续运行。
在停机问题中,程序和输入都可以任意大,但它们的目的是有限的。
此外,没有“程序+输入”的特定实例本身是不可确定的:给定一个特定实例,(原则上)总是可以构造一个算法来分析该实例和/或实例类,并计算正确答案。
然而,如果一个问题是不可判定的,那么无论算法被扩展多少次以正确分析额外的实例或实例类,这个过程永远不会结束:总是有可能提出算法不会的新实例除非进一步扩展,否则能够回答。
我会说“ while(System.in.readline()){} ”的大 O 是 O(n),其中 n 是输入的大小(该程序可以看作是例如行计数程序的骨架)。
在这种情况下定义了大 O,因为对于每个有限大小的输入,程序都会停止。
所以要问的问题可能是:“程序是否会在它可能提供的每个可能的有限输入上停止? ”
如果该问题可以简化为停止问题或任何其他不可判定的问题,那么它是不可判定的。
事实证明,它可以减少,正如这里澄清的那样:
https ://cs.stackexchange.com/questions/41243/halting-problem-reduction-to-halting-for-all-inputs
不可判定性是问题的一个属性,它独立于用于构建在同一台机器上运行的程序的编程语言。例如,您可能认为任何用函数式编程语言编写的程序都可以编译成机器代码,但是同样的机器代码可以由用汇编编写的等效程序生成,所以从图灵机的角度来看,函数式编程语言不再是比汇编语言强大。
此外,不确定性不会阻止算法能够为无数(理论上无限)数量的程序计算大 O,因此为此目的构建算法的任何努力都不一定是毫无意义的。