程序员如何在TopCoder或其他比赛中测试他们的算法?

时间:2013-07-11 09:12:57

标签: algorithm testing

在TopCoder或ACM ICPC的竞赛中编写中等到较高难度的程序的优秀程序员必须在提交之前确保其算法的正确性。

虽然它们提供了一些示例测试用例以确保输出正确,但它如何保证程序正常运行?他们可以编写自己的一些测试用例,但在所有情况下都不可能通过手动计算知道正确的答案。他们是怎么做到的?

更新:看起来,在竞争环境严格限制的情况下,分析和保证算法的结果是不太可能的。但是,如果在解决这些问题时有任何手册,更常见的特征 - 应该足以回答这个问题。最好的做法......

3 个答案:

答案 0 :(得分:8)

在竞赛中,顶级程序员有足够的经验来阅读问题,并考虑一些应该能够捕获大部分输入可能性的测试用例。 它通常会捕获大部分错误 - 但它并非100%安全。

然而,在现实生活中的关键应用(例如飞机或核反应堆上的关键系统)中,有一些方法可以证明某些代码可以完成它应该做的事情。

这是formal verification的领域 - 在比赛期间完成这项工作过于复杂和耗时,但对于某些系统而言,因为错误是无法容忍的。


其他一些信息:
形式验证基本上由两部分组成:

  1. 手动验证 - 在这里我们使用诸如Hoare logic之类的证明系统,并手动证明程序完成了我们想要它做的事情。
  2. 自动model checking - 将问题建模为状态机,并使用模型检查工具验证模块是否执行了应该执行的操作(或者不执行“坏”操作)。
    通常使用temporal logic来指定“它应该做什么”。
    这通常用于验证硬件模型的正确性。例如,英特尔使用它来确保它们不会再次获得floating point bug

答案 1 :(得分:3)

想象一下,想象一下你是一名顶级程序员。意识到你知道一堆算法,并且在实现它们时不会想三思而行。你知道如何修改已知的算法来满足问题的需要。你很坚强估计时间和复杂性,并且您希望在最坏的情况下,您的定制算法将在时间和内存限制内运行 在这个级别,你只需要考虑并使用一个暂存器大约五到十分钟,并在开始编码之前有一个超级清晰的算法。一旦完成编码,你就可以编译并且通常没有编译错误。因为代码非常直观给你。 然后根据使用的算法和使用的数据结构,您可能会有 以下问题之一。

  1. 一个角落案件
  2. 溢出问题
  3. 角落情况基本上就像你为一般情况编码一样,但是当说N = 1时,答案与其他情况不同。所以你通常把它写成一个特例。 溢出是指中间值或结果溢出数据类型的限制。

    您记下此时出现的任何问题,并在挑战阶段使用此数据(如在TopCoder中)。
    一旦你检查了这两个,你点击提交。

答案 2 :(得分:2)

Top Coder有一个时间元素,因此不可能在该约束内测试每个组合。他们可能会尽其所能并依靠经验来完成其余工作,就像在现实生活中一样。我不知道有可能保证一段重要的代码永远没有错误。