对数器的概念:
(1)有一个你想要测的方法a,
(2)实现一个绝对正确但是复杂度不好的方法b,
(3)实现一个随机样本产生器
(4)实现比对的方法
(5)把方法a和方法b比对很多次来验证方法a是否正确。
(6)如果有一个样本使得比对出错,打印样本分析是哪个方法出 错
(7)当样本数量很多时比对测试依然正确,可以确定方法a已经 正确。
说白了对数器就是用来快速检验自己写的算法或者函数是否满足所有的情况,一般测试就枚举几个测试用例,样本容量太小,使用对数器可以自行测试自己的算法在大容量样本下结果。
这里以简单排序来使用对数器:
冒泡排序:
function bubbleSort (arr) {
if (!Array.isArray(arr)) {
return error.paramsError
} else {
for (let e = arr.length -1; e > 0; e--) {
for (let i = 0; i < e; i++) {
if (arr[i] > arr[i+1]) {
swap(arr, i, i+1)
}
}
}
}
}
// 交换函数
function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp
}
// 错误列表
let error = {
paramsError: "The params may be wrong",
rangeError: "The array has no value",
resError: "测试结果不正确"
}
// 随机样本产生器
function generateRandomArray(maxSize, maxValue) {
let arr = [];
arr.length = Math.floor(((maxSize+1) * Math.random()))
for (let i = 0; i<arr.length; i++) {
arr[i] = Math.floor((maxValue + 1) * Math.random()) - Math.floor(maxValue * Math.random())
}
return arr;
}
// 测试方法 比较两个数组是否相等
function isEqual(arr1, arr2) {
if ((arr1.length === 0 && arr2.length !== 0) || (arr1.length !== 0 && arr2.length === 0)) {
return false;
}
if (arr1.length === 0 && arr2.length === 0) {
return true;
}
if (arr1.length !== arr2.length) {
return false;
}
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
// 测试冒泡排序写法 输出数组元素
function logArray(arr) {
if (arr.length === 0) {
return;
}
for (let i = 0; i<arr.length; i++) {
console.log(arr[i] + " ");
}
}
let testTime = 50000,
maxValue = 100,
maxSize = 100,
succeed = true;
for (let i = 0; i < testTime; i++) {
let arr1 = generateRandomArray(maxSize, maxValue);
let arr2 = arr1.slice(0);
bubbleSort(arr1);
// debugger;
// 绝对正确的排序方法
arr2.sort((a,b) => a-b)
if (!isEqual(arr1,arr2)) {
console.log(error.resError);
succeed = false;
}
}
console.log(succeed ? "it works" : "error");
let arr = generateRandomArray(maxSize, maxValue);
logArray(arr);
bubbleSort(arr);
logArray(arr);
选择排序:
// 交换函数
function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp
}
// 比较函数
function isEqual(arr1, arr2) {
if ((arr1.length === 0 && arr2.length !== 0) || (arr1.length !== 0 && arr2.length === 0)) {
console.log("两个参数数组不等");
return false;
}
if (arr1.length === 0 && arr2.length === 0) {
return true;
}
if (arr1.length !== arr2.length) {
console.log("两个参数长度不等");
return false;
}
for (let i = 0; i<arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
function selectionSort(arr) {
if (!Array.isArray(arr) || arr.length === 0) {
console.log("传入参数必须为数组且不为空");
return;
}
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i;
for (let j = i+1; j<arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex)
}
}
// 随机生成器
function generateRandomArray(maxSize, maxValue) {
let arr = []
arr.length = Math.floor((maxSize + 1) * Math.random());
for (let i = 0; i < arr.length; i++) {
arr[i] = Math.floor((maxValue+1) * Math.random()) - Math.floor(maxValue * Math.random())
}
return arr;
}
// 测试
let testTime = 500000,
maxValue = 100,
maxSize = 100,
succeed = true;
for (let i = 0; i < testTime; i++) {
let arr1 = generateRandomArray(maxSize, maxValue);
let arr2 = JSON.parse(JSON.stringify(arr1));
selectionSort(arr1)
arr2.sort((a,b) => a-b);
if (!isEqual(arr1, arr2)) {
succeed = false;
console.log(arr1);
console.log(arr2);
break;
}
}
if (succeed) {
console.log( "it works");
} else {
console.log("false");
}
let arr = generateRandomArray(maxSize, maxValue);
console.log(arr);
selectionSort(arr);
console.log(arr);
插入排序:
// 交换函数
function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp
}
// 比较函数
function isEqual(arr1, arr2) {
if ((arr1.length === 0 && arr2.length !== 0) || (arr1.length !== 0 && arr2.length === 0)) {
console.log("两个参数数组不等");
return false;
}
if (arr1.length === 0 && arr2.length === 0) {
return true;
}
if (arr1.length !== arr2.length) {
console.log("两个参数长度不等");
return false;
}
for (let i = 0; i<arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
function insertionSort(arr) {
if (!Array.isArray(arr) || arr.length < 2) {
console.log("请传入一个数组");
}
for (let i = 1; i < arr.length; i++) {
for (let j = i-1; j >=0 && arr[j] > arr[j+1]; j--) {
swap(arr, j, j+1);
}
}
}
// 随机生成器
function generateRandomArray(maxSize, maxValue) {
let arr = []
arr.length = Math.floor((maxSize + 1) * Math.random());
for (let i = 0; i < arr.length; i++) {
arr[i] = Math.floor((maxValue+1) * Math.random()) - Math.floor(maxValue * Math.random())
}
return arr;
}
// 测试
let testTime = 500000,
maxValue = 100,
maxSize = 100,
succeed = true;
for (let i = 0; i < testTime; i++) {
let arr1 = generateRandomArray(maxSize, maxValue);
let arr2 = JSON.parse(JSON.stringify(arr1));
insertionSort(arr1);
arr2.sort((a,b) => a-b);
if (!isEqual(arr1, arr2)) {
succeed = false;
console.log(arr1);
console.log(arr2);
break;
}
}
if (succeed) {
console.log( "it works");
} else {
console.log("false");
}
let arr = generateRandomArray(maxSize, maxValue);
console.log(arr);
insertionSort(arr);
console.log(arr);