代码之家  ›  专栏  ›  技术社区  ›  huseyin tugrul buyukisik

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

  •  1
  • huseyin tugrul buyukisik  · 技术社区  · 6 年前

    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]);
    

    pow(2,100) .

    x[2]

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

    已尝试为样本数组使用随机数生成器,但不确定其是否可接受:

          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 回复  |  直到 6 年前
        1
  •  1
  •   Schwern    6 年前

    而你呢 能够 proving the algorithm correct ,为此你需要做一个证明。测试是通过测试所有可能隐藏的地方来降低bug的可能性。测试很少试图覆盖整个可能的空间,而是可能的 类型

    下面是一些示例来练习排序函数。

    • 空名单
    • 全部为零的列表
    • 有序的名单
    • 颠倒的清单
    • 所有相同元素的列表
    • 一张很大的单子

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

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

    是的,随机化。生成随机有效大小的随机有效列表,然后验证排序结果是否有序。这有助于涵盖您可能错过的任何案例,并避免您可能做出的任何错误假设。这在测试函数时尤其重要 "black box" 这意味着测试人员对其内部结构一无所知。每次对函数运行更多随机列表时,都会进一步降低出现错误的可能性。

    最后,使用 test coverage