簡體   English   中英

排序算法正確性驗證

[英]Sorting algorithm correctness verification

我正在嘗試驗證排序算法S的正確性,該算法對至少 4 GB 的大數組A進行排序。 假設S以非遞減順序排序,僅檢查A[i - 1] <= A[i] for 1 <= i < n是不夠的。 這是因為S生成的鍵,即使已排序,也可能包含一個或多個不屬於原始A鍵。

我至少可以想到兩種簡單的方法來測試正確性:

  1. 在對A進行排序之前將A復制到A_copy ,在A_copy上使用std::sort ,並在排序后檢查A[i] == A_copy[i] for 0 <= i < n
  2. 維護一個std::unordered_map來存儲排序前A中鍵的頻率,除了非遞減順序檢查外,還用排序后的頻率進行驗證。

上述方法存在明顯的問題。 std::sort對於大數據非常慢,並且需要O(n)額外的 memory。 使用 map 應該更快,但如果密鑰是唯一的,則還需要額外的O(n) memory。

我的問題:有沒有更好的方法來執行這種既快速又使用O(1)額外 memory 的正確性檢查?

謝謝。

您可以將您的算法視為通過不可靠通道傳輸的消息,並利用錯誤檢測/糾正方法 主要區別在於您的數據超出了原始順序,而大多數糾錯都對 position 敏感,盡管不是全部。

一種簡單的解決方案是將所有ahash(a)的 XOR 值存儲在A中,盡管它只能可靠地檢測是否添加了一個元素(例如,如果一個元素被添加了兩次,它將無法識別它)。

int verification = 0;
for (const auto& a : A) {
  verification ^= hash(a)
}
mySort(A);
for (const auto& a : A) {
  verification ^= hash(a)
}

if (verification != 0) {
  // invalid
} else {
  // valid
}

文獻包含更多用於識別甚至糾正您可以使用的電線上的錯誤的選項。 這些將允許您在使用的額外 memory 數量和您能夠找到的錯誤數量之間做出很好的權衡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM