1. 应用场景
你在网上找到了某个公司的面试题,你想了好久,感觉自己会做,但是你找不到在线测试,你好心烦.
你和朋友交流面试题,你想了好久,感觉自己会做,但是你找不到在线测试,你好心烦.
你在网上做笔试,但是前几个测试用例都过了,突然一个巨大无比数据量来了,结果你的代码报错了,如此大的数据量根本看不出哪错了,你好心烦.
- 你想要测的方法a
- 实现复杂度不好但是容易实现的方法b
- 实现一个随机样本产生器
- 把方法a和方法b跑相同的随机样本,看看得到的结果是否一样
- 如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a和方法b
- 当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
对数器的门槛其实是比较高的,因为往往需要在两种不同思路下实现功能相同的两个方法,暴力一个、想象中的最优解是另一个。
以后的很多题目都会用到对数器,几乎可以验证任何方法,尤其在验证贪心、观察规律方面很有用
到时候会丰富很多对数器的实战用法,这里只是一个简单易懂的示例
2. 示例
以"三傻"排序为例
java
// 生成随机数组
public static int[] randomArray(int n, int max) {
// n: 数组长度
// max:数组最大值
int[] arr = new int[n];
for (int i=0; i< n; i++){
arr[i] = (int) (Math.random() * max) + 1;
}
return arr;
}
// 拷贝数组
public static int[] copyArray(int[] arr) {
int[] copy = new int[arr.length];
for (int i=0; i< arr.length; i++){
copy[i] = arr[i];
}
return copy;
}
// 验证两个数组是否相同
public static boolean sameArray(int[] arr1, int[] arr2) {
for (int i=0; i< arr1.length; i++){
if (arr1[i] != arr2[i]){
return false;
}
}
return true;
}
public static void main(String[] args) {
// 随机数组最大长度
int N = 100;
// 数组中的值的最大值
int v = 1000;
// 测试次数
int testTimes = 50000;
System.out.println("测试开始");
for (int i = 0; i < testTimes; i++) {
// 随机生成数组的长度
int n = (int) (Math.random() * N);
int[] arr = randomArray(n, v);
int[] arr1 = copyArray(arr);
int[] arr2 = copyArray(arr);
int[] arr3 = copyArray(arr);
selectionSort(arr1);
bubbleSort(arr2);
insertionSort(arr3);
if (!sameArray(arr1, arr2) || !sameArray(arr3, arr1)) {
System.out.println("出错了");
break;
}
}
System.out.println("测试结束");
}
python
def randomArray(n, v):
"""
生成随机数组
:param n: 随机数组的长度
:param v: 随机数组中的最大值
:return: 生成的数组
"""
arr = []
for i in range(n):
# Return random integer in range [a, b], including both end points.
arr.append(random.randint(1, v))
return arr
def sameArray(arr1, arr2):
# 判断数组是否相同
for i in range(len(arr1)):
if arr1[i] != arr2[i]:
return False
return True
if __name__ == '__main__':
# 随机数组长度
N = 100
# 随机数组最大值
V = 2000
# 测试的次数
test_times = 50000
print("测试开始")
for i in range(test_times):
# 生成随机数组的长度
n = random.randint(1, N)
arr = randomArray(n, V)
arr1 = arr.copy()
arr2 = arr.copy()
arr3 = arr.copy()
selection_sort(arr1)
insertion_sort(arr2)
bubble_sort(arr3)
if (not sameArray(arr1, arr2) or not sameArray(arr1, arr3)):
print('出错了')
break
print('测试结束')
c++
// 拷贝数组的函数
std::vector<int> copyArray(const std::vector<int>& arr) {
return std::vector<int>(arr);
}
// 验证两个数组是否相同的函数
bool sameArray(const std::vector<int>& arr1, const std::vector<int>& arr2) {
if (arr1.size() != arr2.size()) return false;
for (size_t i = 0; i < arr1.size(); i++) {
if (arr1[i] != arr2[i]) return false;
}
return true;
}
// 生成随机数组的函数
std::vector<int> randomArray(int n, int v) {
std::vector<int> arr(n);
for (int i = 0; i < n; i++) {
arr[i] = std::rand() % v;
}
return arr;
}
int main() {
// 随机数组最大长度
int N = 100;
// 数组中的值的最大值
int v = 1000;
// 测试次数
int testTimes = 50000;
std::cout << "测试开始" << std::endl;
for (int i = 0; i < testTimes; i++) {
// 随机生成数组的长度
int n = std::rand() % N;
std::vector<int> arr = randomArray(n, v);
std::vector<int> arr1 = copyArray(arr);
std::vector<int> arr2 = copyArray(arr);
std::vector<int> arr3 = copyArray(arr);
selectionSort(arr1);
bubbleSort(arr2);
insertionSort(arr3);
if (!sameArray(arr1, arr2) || !sameArray(arr3, arr1)) {
std::cout << "出错了" << std::endl;
break;
}
}
std::cout << "测试结束" << std::endl;
return 0;
}