簡體   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