您如何识别算法的“边缘”情况?


25

基本上,您如何找出最坏的情况或最好的情况,以及在遇到其他情况之前可能遇到的其他“边缘”情况,因此,如何为它们准备代码?


2
替代方案:如果可能,我非常喜欢模糊测试。令人惊讶的是,大量随机生成的输入可以发现功能中的漏洞,而这些漏洞没有经过大量的审查/边缘测试。两者确实可以很好地协同工作...并且显然可以通过在“真实”输入上运行时准确记录错误来补充它们:)
Matthieu M.11年

Answers:


28

根据算法的内容,您可以确定使用了哪些数据结构/类型/结构。然后,您尝试了解这些漏洞的(可能)弱点,并尝试提出将使它们在这些情况下运行的执行计划。

例如,该算法将字符串和整数作为输入,并对字符串的字符进行某种排序。

这里我们有:

具有一些已知特殊情况的字符串

  • 空字符串
  • 长串
  • Unicode字符串(特殊字符)
  • 如果限制为一组特定的字符,则当某些字符不在此范围内时会发生什么
  • 奇数/偶数长度字符串
  • 空(作为参数)
  • 非空终止

具有已知特殊情况的整数

  • 0
  • 最小/最大
  • 负/正

在以下边界情况下可能失败的排序算法

  • 空输入
  • 1个元素输入
  • 非常长的输入(可能是最大长度(用于索引的数据类型))
  • 集合内的垃圾将被排序
  • 空输入
  • 重复元素
  • 所有元素相等的集合
  • 奇数/偶数长度输入

然后,考虑所有这些情况并创建一个长长的列表,试图了解它们如何重叠。例如:

  • 空的字符串盒覆盖了空的收集盒
  • 空字符串==空集合
  • 等等

现在为他们创建测试用例:)

简短摘要:将算法分解为您知道边界情况的基本块,然后重新组合它们,创建全局边界情况


5
还有一件事要补充。。。分析代码并在代码中查找特殊情况。如果开发人员处理0到13的方法不同于14或更大的方法-出于性能原因,也许开发人员针对大小值使用不同的算法-您在13和14处有一些极端情况。+ 1是个很好的清单。
埃塞尔·埃文斯

2

我认为没有确定边缘条件的算法。

例如:对于一个字节参数,您将要测试数字(例如0、127、128、255、256,-1),这可能会引起麻烦。


2

“边缘”具有两种含义,当涉及边缘情况时,两者都是相关的。边缘要么是输入的小变化导致输出的大变化的区域,要么是范围的终点。

因此,为了确定算法的边缘情况,我首先看一下输入域。它的边缘值可能会导致算法出现边缘情况。

其次,我查看输出域,然后回顾可能创建它们的输入值。这在算法中通常不成问题,但是它有助于在旨在生成跨越给定输出域的输出的算法中发现问题。例如,随机数生成器应该能够生成所有预期的输出值。

最后,我检查算法以查看是否存在相似的输入情况,但导致不同的输出。找到这些极端情况是最困难的,因为它涉及域和一对输入。


0

这是一个非常笼统的问题,所以我所能做的就是抛出一些笼统,含糊的想法:)

-检查边界案例。例如 如果您要解析一个字符串,如果该字符串为空或null会发生什么?如果从x到y进行计数,则x和y会发生什么?
-可以简化或干燥的代码。任何不必要的复杂性都会增加可能出错的地方。


0

使用算法的部分技巧是了解它们的弱点和病态案例。Victor的答案提供了一些很好的技巧,但总的来说,我建议您需要更深入地研究该主题才能对此有所了解,我认为您不能遵循经验法则来完全回答该问题。例如,参见CormenSkiena(特别是Skiena,其中有一个非常好的章节介绍了在何处使用算法以及在某些情况下有效的方法,Cormen提出了更多的理论)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.