在今年 Google 的 Code Jam 资格赛中做“Djikstra”问题时,我遇到了试图验证我的程序的问题。我用来完成这类任务的标准方法是编写两个程序,它们以完全不同的方式做同样的事情。然后你在输入上运行这两个。如果两个程序的输出不同,您就知道其中一个或两个程序中存在错误。这种方法的缺点是程序员必须创建两个程序,实际上使花费的时间加倍。
与编写多个版本的程序并相互运行相比,是否有更好/更有效的方法来验证程序是否正确?
请注意,只有当正确的输出未知并且您无法生成验证输入-输出集时,您才会遇到此问题。如果您先验知道任何给定输入集的输出应该是什么,那么验证程序就很容易了。所以,这个问题只适用于你不知道正确的输出应该是什么的情况,你只知道程序应该做的过程的规范。
在 Dijkstra 问题的情况下,我可以编写一个“测试数据生成器”,它从输出向后生成一个已知的输入状态。通过这样做,我可以通过编写第二个程序来创建测试数据集,但是这个程序会比求解器简单得多,因此比编写两个求解器要少得多,但是,为了争论,让我们假设这个选项不可用。
最佳答案
找不到更好的测试方法。通常,其中一个程序应该是一种蛮力算法,您可以确保在任何输入集上都能正确输出。然后你验证具有最佳内存和时间复杂度的程序是否提供相同的输出(你没有提到它们有什么不同,但我认为这就是你的意思)。
关于algorithm - 未知正确输出时有效验证程序逻辑的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29594199/