對數器的概念和使用
對數器一般用於驗證你寫的演算法是否正確,因為自己寫的測試用例可能寫的考慮不夠全面。
0.有一個你想測試的方法a
1.實現一個絕對正確但是時間複雜度不好的方法b
2.實現一個隨機樣本產生器
3.實現比對的方法
4.把方法a和方法b比對很多次來驗證方法a是否正確
5.如果有一個樣本比對出錯,列印樣本分析是哪個方法出錯
6.當樣本數量很多時,比對測試依然正確,可以確定方法a已經正確。
舉例程式碼
假設我們需要測試我們自己寫的插入排序
//要測試的方法 function insertSort(arr) { for (let i = 1; i < arr.length; i++) { for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } //正確的方法 function rightMethod(arr) { arr.sort((a, b)=>a - b); } //隨機陣列生成器,size為最大長度,value為最大值 function generateRandomArray(size, value) { //生成長度隨機的陣列 let arr = new Array(Math.floor((size + 1) * Math.random())); for (let i = 0; i < arr.length; i++) { arr[i] = Math.floor((value + 1) * Math.random()); } return arr; } //拷貝陣列方法 function copyArray(arr) { if (arr == null) { return null; } return [].concat(arr); } //比對方法 function isEqual(arr1, 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 (let i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { return false } } return true; } //測試 function Test() { let testTimes = 5000; let size = 10; let value = 100; let succeed = true; for (let i = 0; i < testTimes; i++) { let arr1 = generateRandomArray(size, value); let arr2 = copyArray(arr1); let arr3 = copyArray(arr1); insertSort(arr1); rightMethod(arr2); if (!isEqual(arr1, arr2)) { succeed = false; console.log(arr3); break; } } console.log(succeed ? "nice" : "Fucking fucked"); } Test();
如果輸入nice說明所有測試用例正確。