005【入门】对数器-验证的重要手段

1. 应用场景

你在网上找到了某个公司的面试题,你想了好久,感觉自己会做,但是你找不到在线测试,你好心烦.
你和朋友交流面试题,你想了好久,感觉自己会做,但是你找不到在线测试,你好心烦.
你在网上做笔试,但是前几个测试用例都过了,突然一个巨大无比数据量来了,结果你的代码报错了,如此大的数据量根本看不出哪错了,你好心烦.

  1. 你想要测的方法a
  2. 实现复杂度不好但是容易实现的方法b
  3. 实现一个随机样本产生器
  4. 把方法a和方法b跑相同的随机样本,看看得到的结果是否一样
  5. 如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a和方法b
  6. 当样本数量很多时比对测试依然正确,可以确定方法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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值