JS實現對數器

汕大小吳發表於2018-08-07

對數器的概念和使用

對數器一般用於驗證你寫的演算法是否正確,因為自己寫的測試用例可能寫的考慮不夠全面。

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說明所有測試用例正確。

相關文章