繁体   English   中英

测试排序函数正确性的最快方法是什么?

[英]What is the fastest way of testing correctness of a sorting function?

使用遗传算法,我找到了这个比较列表:

compareAndSwap(x[0],x[2]);
compareAndSwap(x[3],x[4]);
compareAndSwap(x[2],x[4]);
compareAndSwap(x[0],x[3]);
compareAndSwap(x[2],x[3]);
compareAndSwap(x[1],x[3]);
compareAndSwap(x[1],x[2]);
compareAndSwap(x[0],x[1]);
compareAndSwap(x[3],x[4]);

但我需要测试它是否适用于所有情况。 在某些情况下,数组元素的数量(当前为 5)可以增长到 100。 这意味着要检查的案例数量正在快速增长,超过pow(2,100)

如果我单独给出一个相反排序的数组作为最坏的情况,则不会检查关于中间元素x[2]比较的任何错误。 例如,5、4、3、2、1被某个函数排序为1、2、3、4、5,通过

compareAndSwap(x[0],x[4]);
compareAndSwap(x[1],x[3]);

单独,这当然不会对 5 元素数组的许多情况进行排序。

为样本数组尝试了随机数生成器,但不确定它是否可以接受:

      std::random_device rd;
      std::mt19937 rng(rd());
      std::uniform_real_distribution<double> dist(0,1);

      for(int k=0;k<500;k++)
      {
        std::vector<double> arraySorted;
        for(int i=0;i<5;i++)
            arraySorted.push_back(dist(rng));

      //sortNetwork(arraySorted.data());

      //if(!std::is_sorted(arraySorted.begin(),arraySorted.end())) 
            throw std::runtime_error("error");
      }

即使这样仍然会遗漏某些部分。 有没有一种快速的方法来测试排序算法?

如果是 1000 个元素的数组呢? 这些是使用数学、笔和纸在某些定理和已知算法中还是使用超级计算机进行测试的?

只是 4 个元素的一些示例案例:

1 2 3 4   
1 2 4 3   
2 1 3 4    
2 1 4 3   
1 2 0 1                        
1 2 1 0                         
2 1 0 1
2 1 1 0
3 4 2 1                           
3 4 1 2
4 3 2 1
4 3 1 2
1 1 1 1

似乎不止 pow(2,n) 案例。

在生成测试数据时,排序网络是否可以被视为图形问题?

虽然您可以检查每个可能列表的每次迭代,但正如您所指出的那样,这太慢了。 测试不是证明算法正确,因为你需要做一个证明。 测试是通过测试它可能隐藏的所有位置来降低出现错误的可能性。 测试很少尝试覆盖整个可能的空间,而是覆盖可能的错误类型

下面是一些使用排序功能的示例。

  • 一个空列表
  • 单个元素列表
  • 一个全零的列表
  • 有序列表
  • 反向列表
  • 所有相同元素的列表
  • 一个非常大的清单
  • 包含奇怪元素的列表(例如,Unicode、负数、重载数字)

然后是错误的输入,应该返回错误而不是垃圾。 垃圾进,错误出。

  • 空指针
  • 空值列表
  • 一个太大的列表(如果你的函数有大小限制)

是的,随机化。 生成随机有效大小的随机有效列表,然后验证排序结果是否有序。 这有助于涵盖您可能错过的任何情况,并避免您可能做出的任何错误假设。 这在测试功能“黑匣子”时尤为重要,这意味着测试人员不了解其内部结构。 每次针对该函数运行更多随机列表时,都会进一步降低出现错误的可能性。

确保输出使用的随机种子,以便在失败时重复测试。

最后,使用测试覆盖率来确保您的测试符合代码的所有行和分支。 代码可能是由 AI 生成的,但您仍然可以对其进行覆盖分析,以确定您的测试差距。 在可能不可读的 AI 生成的代码上运行代码美化程序将有助于您了解需要更多测试的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM