【问题标题】:Is it possible to write a verifier that checks if a given program implements a given algorithm?是否可以编写一个验证程序来检查给定程序是否实现给定算法?
【发布时间】:2013-02-24 14:40:23
【问题描述】:

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

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

【问题讨论】:

  • 让人们使用抽象接口进行一些低级操作怎么样,例如访问元素和交换。然后向它们传递一个具体的对象,以确保调用者以快速排序的方式调用这些操作。

标签: algorithm automation


【解决方案1】:

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

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

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

从 cmets 开始,我建议查看 Ahmad Taherkhani's home page。他继续在该领域进行研究,包括 2012 年有关该主题的论文。

【讨论】:

  • 感谢您的帮助。我想知道如果我们使用一些实现算法的示例程序然后我们尝试对程序进行分类,它会起作用。就像他们在机器学习问题中所做的那样。
  • @Aryaveer 这样做的关键是找到可以从文本中提取的特征,使得特征空间中靠近的点代表相似的算法。我做了一些网络搜索,发现了[用于识别排序算法的静态程序分析](www.cs.hut.fi/~ahmad/mastersthesis.pdf)。这是一篇 2008 年的论文,但可能是引文搜索以查找最新技术的有用起点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多