对数器的概念和使用
文章目录
1、介绍
- 在写出一个算法程序的时候,我们往往无法通过手动输入各种各样的测试数据来验证,在OJ平台上也无法找到对应的题目来进行验证。
- 在一些样本量很大的情况下,我们往往无法考虑到所有的边界情况。
- 尤其是一些贪心算法是很难通过数学的方式来进行验证的,这时使用对数器来判断算法程序是否正确
2、使用方法
2.1 创建一个绝对正确的方法
public static void comparator(int[] arr) {
Arrays.sort(arr);
}
2.2 生成一个随机数组
maxSize为数组的大小,maxValue为数组的元素的大小的范围
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
2.3 copy数组
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
2.4 判断两数组是否相同
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
2.5 大样本测试
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
insertionSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
}
3、对插入排序进行测试
3.1插入排序
public static void insertionSort(int[] arr) {
if(arr.length < 2 || arr == null) {
return;
}
for(int i = 1; i < arr.length; i++) {
for(int j = i-1; j>=0 && arr[j+1]<arr[j];j--) {
swap(arr, j+1, j);
}
}
}
3.2测试结果
- 正确显示NICE
- 错误显示fuck