[英]Sorting algorithm correctness verification
我正在嘗試驗證排序算法S
的正確性,該算法對至少 4 GB 的大數組A
進行排序。 假設S
以非遞減順序排序,僅檢查A[i - 1] <= A[i] for 1 <= i < n
是不夠的。 這是因為S
生成的鍵,即使已排序,也可能包含一個或多個不屬於原始A
鍵。
我至少可以想到兩種簡單的方法來測試正確性:
A
進行排序之前將A
復制到A_copy
,在A_copy
上使用std::sort
,並在排序后檢查A[i] == A_copy[i] for 0 <= i < n
。std::unordered_map
來存儲排序前A
中鍵的頻率,除了非遞減順序檢查外,還用排序后的頻率進行驗證。 上述方法存在明顯的問題。 std::sort
對於大數據非常慢,並且需要O(n)
額外的 memory。 使用 map 應該更快,但如果密鑰是唯一的,則還需要額外的O(n)
memory。
我的問題:有沒有更好的方法來執行這種既快速又使用O(1)
額外 memory 的正確性檢查?
謝謝。
您可以將您的算法視為通過不可靠通道傳輸的消息,並利用錯誤檢測/糾正方法。 主要區別在於您的數據超出了原始順序,而大多數糾錯都對 position 敏感,盡管不是全部。
一種簡單的解決方案是將所有a
的hash(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.