如何测试算法实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试算法实现?相关的知识,希望对你有一定的参考价值。

我正在考虑测试一些算法的实现

如果您考虑TDD / BDD焦点...测试将是

 Scenario: doubling search
 Given an ordered array "[2,3,4,5,6,7]"
 When I look for "4" with "doubling search" in it
 Then the result must be "2"

我想确保我的算法运行良好......那么,您将如何测试算法实现?

答案

您以相同的方式测试算法的每个实现:获取输入,手动计算您的预期输出,并将其与算法为您提供的输出进行比较。

如果您使用带接口的语言执行此操作,则可以使用接口类型的参数进行通用测试,并让实际测试通过实验调用它。这可确保所有算法都基于其接口进行相同的测试。

// double search implemented by using the search and multiplying by 2
algorithm multDoubleSearch
   define input array
   define input search

   for each i in array
      if i = search * 2
           return index of i
   end
   return -1
end.

// double search implemented by dividing the values by 2
algorithm divDoubleSearch
    define input array
   define input search

   for each i in array
      if i / 2 = search
           return index of i
   end
   return -1
end.


test mytest
     define array {2 3 4 5 6 7}
     define search 2

     define resultMult = multDoubleSearch(array,search)
     assert resultMult == 2 // 4 is index 2, assuming 0 indexed

     define resultDiv = divDoubleSearch(array,search)
     assert resultDiv == 2 // 4 is index 2, assuming 0 indexed
end.
另一答案

那取决于你手头有什么。

除了通常的测试,你手动提供输入和输出来测试极端情况和一些其他输入(参见JUnit或任何流行语言中的类似框架),你也可以编写一个低效但简单的算法版本(或者确切地说,产生相同结果的任何东西,通常不是完全相同的算法)并针对所有可能的输入进行测试,或者使用Fuzztester和一些随机化是不可能的。

稍后的一个例子是针对SelectionSort测试复杂的排序算法(比如说heapsort)。如果你优化代码并且已经有一个经过试验和测试的版本(这本身就是一种递归问题),这也很有效。

在您的特定情况下,您可以将您的版本与简单的二进制搜索进行比较 - 标准库当然已经拥有 - 使用随机输入创建随机大小的数组也不应该是一个问题。

以上是关于如何测试算法实现?的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中获取rootview?

如何在片段着色器中进行自定义模板测试

如何实现具有不同片段/布局的 ViewPager

如何测试算法实现?

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]