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

时间:2018-09-22 17:29:13

标签: arrays performance sorting testing correctness

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

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)个案例。

以某种方式在生成测试数据时可以将分类网络视为图形问题吗?

1 个答案:

答案 0 :(得分:1)

尽管您可以检查每个可能列表的每个迭代,但是您已经指出,这太慢了。测试与proving the algorithm correct无关,因此您需要做一个证明。测试是通过测试可能隐藏的所有位置来减少错误的可能性。测试很少尝试覆盖整个可能的空间,而是尝试可能的类型错误。

以下是行使排序功能的示例。

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

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

  • 空指针
  • 空列表
  • 列表太大(如果您的函数有大小限制)

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

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

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