我的算法只对大值失败 - 我该如何调试?

时间:2013-11-27 15:39:18

标签: algorithm debugging

我正在努力将as3delaunay转录为Objective-C。在大多数情况下,整个算法可以完全按照应有的方式工作和创建图形。但是,对于较大的值(数千个点),算法主要是,但会产生一些不正确的图形。

我一直在回过头来检查最明显的错误位置,但我实际上找不到任何东西。对于较小的值,我运行原始算法的输出并将其放入JSON文件中。然后我将输出读入我自己的测试(仅测试3或4点),并调试直到输出匹配;我检查了两行算法的输出行,并发现了差异。但是我不可能做到1000分。

答案不需要特定于我的情况(虽然建议我可以使用的工具会非常好)。

如何调试仅对大值失败的算法?

2 个答案:

答案 0 :(得分:4)

如果您要将现有算法转录为Objective-C,您是否拥有其他语言的原创作品?在这种情况下,我倾向于在两个版本中加入打印语句并调试第一个差异(第一个,因为后来的差异可能是连锁错误)。

我认为该程序很可能也会对较小的图表出错,但更少见。我的第一步实际上是使用工作原始(或其他一些方法)在小图上运行大量自动检查的测试运行,希望找到一些更易于管理的输入大小的bug。

答案 1 :(得分:2)

找到阈值

如果它适用于3个或4个项目,但不适用于1000个项目,那么它们之间可能存在一些阈值。使用二进制搜索来找到该阈值。

阈值本身可能是一个线索。例如,它可能对应于算法中的魔术值或您不希望相关的其他值。例如,当项目数量超过您尝试绘制的图表的x方向上的像素数时,可能会出现问题。线索可能足以帮助您解决问题。如果没有,它可能会给你一个关于如何用较小的值强制解决问题的线索(例如,使用非常窄的图表区域调试它)。

阈值可能比您想象的要小,可以直接调试。

如果阈值是一个很大的值,比如1000.也许你可以设置一个条件断点,直接跳到迭代999,然后从那里单步执行。

可能没有明确的阈值,这表明它不是输入大小的大小,而是你应该关注的其他一些属性(例如,10的幂不起作用,但其他一切都有效)。 / p>

分解问题并编写单元测试

这可能很乏味但通常非常有价值 - 不仅针对当前问题,而且针对未来。说服自己,每件作品都是孤立的。

重新访问最近的更改

如果它曾经工作过,现在却没有,请先查看最新的更改。源代码控制工具非常有助于您记住最近发生的变化。

删除代码并逐个添加

尽可能多地注释掉代码并仍然获得某种合理的输出(即使输出不符合所有要求)。例如,不要使用复杂的舍入函数,只需截断值。注释掉添加装饰性触感的代码。将assert(false)放在您认为不应为测试数据激活的任何特殊情况处理程序中。

现在验证输出,并慢慢添加您删除的功能,一次一个婴儿步骤。每一步都要彻底测试。

描述代码

分析通常用于优化,但有时可以让您深入了解代码,尤其是当数据大小太大而无法单步执行调试器时。我喜欢使用行或语句计数。循环体是否执行了您期望的次数?或者经常两倍?还是一点都不?那些if语句的then和else子句怎么样?通过这种类型的分析,逻辑错误经常变得非常明显。