【算法学习day04】时间复杂度、对数器

时间复杂度

O(n)表示的是最差情况下的复杂度

额外空间复杂度看的是自主空间,也就是除了题目要求返回的或者题目本身的参数以外,自主解决该问题开辟的空间,比如题目里让返回一个数组,参数里也有个数组,这个时候不需要额外新开辟数组,则复杂度仍为O(1)而不是O(n)

Java中,HashMap相关操作的时间复杂度为O(1),TreeMap相关操作的时间复杂度为O(logN),二分查找的时间复杂度为O(logN)

时间复杂度尽可能低之后,额外空间复杂度尽可能优化 → 最优解

最优解不考虑常数项时间的优化

时间复杂度从小到大:

O(1) < O(logN) < O(N) < O(N*logN) < O(N^2) <= O(N^k) < O(2^N) <= O(k^N) < O(N!)

对数器

在没有在线测试(OJ)的条件下对算法进行测试 → 自己生成大样本随机数据

同样的一个功能可能有多种实现方法,暴力的时间复杂度高的方法往往容易想出来,而想出来的以为是最优解的优化方法要验证是否正确,就可以用对数器进行测试该方法。

生成大量测试数据,对两套思路同时进行测试,如果两套思路运行结果不一致,可能就会产生一些没想到的边界条件,进一步去看两个方法是否正确。

    public static int[] generateRandomArray(int maxSize, int maxValue) {
        // Math.random() → [0, 1)随机等概率小数
        // Math.random() * N → [0, N)随机等概率小数
        // (int) (Math.random() * N) → [0, N - 1]整数等概率返回
        int[] arr = new int[(int)((maxSize + 1) * Math.random())]; // 长度为[0, MaxSize]的随机值
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); // 随机值 - 随机值 可能正 负 0
        }
        return arr;
    }

copyArray方法用来copy数组元素并生成一个新的数组对象,对拷贝自arr的arr1和arr2操作结果如果结果不一样,可以打印原本arr数组的值,并调小maxSize,用来找错误的样例
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值