我正在尝试验证排序算法S
的正确性,该算法正在对至少4 GB的大型数组A
进行排序。假设S
以非降序排序,仅检查A[i - 1] <= A[i] for 1 <= i < n
是不够的。这是因为S
产生的键即使已排序,也可能包含一个或多个不属于原始A
的键。
我可以想到至少两种简单的方法来测试正确性:
- 在对
A
进行排序之前,将A_copy
复制到A
,在std::sort
上使用A_copy
,并在排序后检查A[i] == A_copy[i] for 0 <= i < n
。 - 维护
std::unordered_map
以便在排序前将密钥的频率存储在A
中,并在排序后除非降序检查外还使用频率进行验证。
上述方法存在明显的问题。 std::sort
对于大数据非常慢,并且需要O(n)
额外的内存。使用映射应该更快,但是如果键是唯一的,则还需要额外的O(n)
内存。
我的问题:有没有更好的方法来执行既快速又使用O(1)
额外内存的排序正确性检查?
谢谢。