当所有输入的集合都是无限的时,如何检查两种算法(例如,合并排序和朴素排序)对于任何输入是否返回相同的结果?
更新:感谢Ben解释了在一般情况下如何通过算法无法做到这一点。Dave的答案很好地总结了算法方法和手动方法(受人类智慧和隐喻的影响),这些方法并不总是有效的,但却非常有效。
当所有输入的集合都是无限的时,如何检查两种算法(例如,合并排序和朴素排序)对于任何输入是否返回相同的结果?
更新:感谢Ben解释了在一般情况下如何通过算法无法做到这一点。Dave的答案很好地总结了算法方法和手动方法(受人类智慧和隐喻的影响),这些方法并不总是有效的,但却非常有效。
Answers:
与反对者所说的相反,有许多有效的方法可以做到这一点。
当然,由于不确定性,这些方法都不是完整的,但是为解决该问题已经进行了大量的工作。
为了略微说明“这是不可能的”陈述,这是一个简单的证明草图。
我们可以用图灵机的输出对算法建模,而图灵机的输出将停止在磁带上。如果您希望通过在磁带上接受输出或拒绝(在这种情况下没有输出)可以停止的机器,则可以轻松地提出一种编码,使您可以使用“不停止或不停止,没有拒绝”的机器。
现在,假设我有一个算法P用于确定两个TM的每个输入是否具有相同的输出。然后,给定一个TM A和一个输入X,我可以构造一个新的TM B,其操作如下:
现在我可以在A和B上运行P了。B不会在X上停止,但是对于所有其他输入都具有与A相同的输出,因此,并且仅当A不在X上停止时,这两种算法的每个输入才具有相同的输出。但是假设P能够判断两种算法的每个输入是否具有相同的输出,因此,如果我们拥有P,我们就可以判断任意输入的任意机器是否停止,这就是停止问题。由于已知停止问题无法确定,因此P不存在。
这意味着没有通用(可计算的)方法来确定两种算法是否始终具有相同的输出,因此您必须对要分析的一对算法应用特定的推理。但是,在实践中,可能存在适用于大量算法的可计算方法,并且当然可以使用某些技术来尝试为任何特定情况制定证明。戴夫·克拉克(Dave Clarke)的答案为您提供了一些相关的知识。“不可能”结果仅适用于设计一种通用方法,该方法将针对所有算法对一劳永逸地解决问题。