5

给定一个用 C++ 编写的程序 P,我是否可以编写一个算法来确定程序 P 是否实现了特定算法?有没有解决这个问题的算法。这个问题可以解决吗?

例如,我要求一个人实现快速排序算法,现在如果我想确保这个人实际实现了快速排序算法。该人实际上可以实现一些其他排序算法,它将产生正确的输出并通过所有测试用例(黑盒测试)。我可以做到这一点的一种方法是查看源代码。我想避免这种手动工作,并想编写一个可以完成这项工作的程序。问题是“这可能吗?”。

4

2 回答 2

5

根据赖斯定理,您甚至无法通过检查代码来确定一段代码是否是排序函数。当然,您可以通过使用这些输入运行它并检查结果来确定它是否具有对某些有限输入集进行排序的效果。

您可以针对给定目标排序算法的特定情况做一些事情,方法是检查排序期间正在排序的数组,检查目标算法特征的不变量。例如,递归快速排序实现中的每次调用都会导致子数组被排序。

==================================================== ================

根据评论,我建议查看Ahmad Taherkhani 的主页。他继续在该领域进行研究,包括 2012 年有关该主题的论文。

于 2013-02-24T15:08:49.733 回答
0

我在想,并且仍在考虑堆栈/堆检查(假设您也针对优化的解决方案进行了测试)。
您可以检查将缩小结果的时间复杂度和整体内存复杂度。即使对于时间:O(n lg n) 用于合并和快速排序。您可以通过内存分配来区分它们,因为它们按顺序是 N ,Lg(n) 。
您还可以检查原始阵列干扰..等,但这不是决定性的。

于 2013-02-24T15:14:21.770 回答