给定一个用C ++编写的程序P,我可以编写一个算法来查找程序P是否实现了特定的算法吗?有没有解决这个问题的算法。这个问题可以解决吗?
例如,我要求一个人实现快速排序算法,现在如果我想确保该人实际实现了快速排序算法。该人实际上可以实现一些其他排序算法,它将产生正确的输出并通过所有测试用例(黑盒测试)。我可以这样做的一种方法是查看源代码。我想避免这种手动操作,并希望编写一个可以完成这项工作的程序。问题是“这可能吗?”。
答案 0 :(得分:5)
从Rice's Theorem开始,您通常无法通过检查代码来判断一段代码是否是排序函数。当然,您可以通过使用这些输入运行并检查结果来确定它是否具有对某些有限输入进行排序的效果。
您可以通过检查在排序期间正在排序的数组,检查特定于目标算法的不变量,来针对给定目标排序算法的特定情况执行某些操作。例如,递归快速排序实现中的每个调用都将导致子数组被排序。
=============================================== ==================
继续发表评论后,我建议查看Ahmad Taherkhani's home page。他继续在这方面进行研究,包括2012年关于该主题的论文。
答案 1 :(得分:0)
我在思考,仍然在考虑堆栈/堆检查(考虑到您对优化解决方案进行测试) 您可以检查时间复杂度和总体内存复杂性,这将缩小结果范围。即使是时间:O(n lg n)用于合并和快速排序。你可以用内存分配来区分它们,因为它们按顺序是N,Lg(n) 你也可以检查原始阵列干扰等等。但这不是决定性的重量。