type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jun 2, 2024 09:10 AM
时空复杂度分析,数据范围推复杂度和数据类型,黑盒测试原理,常见错误及解决方式
为什么要学数据结构呢?
优化解决问题的方式(在LeetCode上不超时/更高效率)
0 本节配套代码
1 时间复杂度
时间复杂度就是用来方便开发者估算出程序的运行时间
1.1 大O表示法
代码运行次数的数量级别
以下代码的时间复杂度:
O(3+3n^2+2n+1) = O(3n^2+2n+4) = O(n^2)
1.2 举例
1.2.1 O(1)
1.2.2 O(logn)
1.2.3 O(n)
1.2.4 O(n^2)
1.2.5 问以下代码的时间复杂度是多少?(two points)
1.3 各种复杂度比较
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(2^n) (指数阶)
1.4 python内置函数的时间复杂度
1.5 递归表达式的时间复杂度计算(主方法/定理)
主方法的一般形式是:
T(n) = aT(n/b) + f(n)
a是递归调用的次数,n/b是递归子问题的规模,f(n)是在分解和合并子问题过程中花费的时间。
根据主方法,可以通过比较f(n)和的大小关系来确定T(n)的时间复杂度:
当f(n) = Θ(n^c)时,
- 如果c < ,则T(n) = Θ()。
- 如果c = ,则T(n) = Θ()。
- 如果c > ,则T(n) = Θ(f(n))。
举例:
递归式:T(n) = 2T(n/2) + n
对于这个递归式,我们可以将其形式转化为上述一般形式:
a = 2, b = 2, f(n) = n
根据上述公式,可以得到:
= = 1
f(n) = n = Θ()
由于f(n) = Θ(),其中c = 1 = ,因此T(n) = Θ(n log n)。
因此,该递归式的时间复杂度为O(n log n)。
2 空间复杂度
用来评估自定义函数或算法内存占用大小
原地工作:额外空间相对于输入数据量来说是常数O(1)
3 数据范围
3.1 确定算法
一般笔试题的时间限制是1秒或2秒,代码执行次数控制在
10^7∼10^8
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
3.2 确定数据类型
python自带超长数字,一般只需要判断是整数,小数还是字符串即可,注意小数精度问题
4 黑盒测试原理
LeetCode是如何评判一份代码的正确性的?
只比较标准输出和程序输出
一般有一组
input
文件和一组output
文件,先运行你的程序,同时在后台开始计时,将所有input
数据加入输入流中,将程序输出的内容和output
文件比对
若运行时出错时即执行出错,若在计时器计时结束前你的程序未能结束即超出时间限制,若存在程序输出与标准输出不一致即答案错误,否则答案正确以下通过代码来简单演示LeetCode的判题机制
5 LeetCode上的常见错误及解决方式
5.1 答案错误
一般来说是某些特殊情况没有考虑到,这个时候可以根据评测给出的错误样例进行代码的模拟,找到代码出错的位置,分析代码出错的原因并加以改正
5.2 超出时间限制
一般来说是算法的时间复杂度太高了,需要根据题目给定的数据范围优化自己的代码,或者更换更为高效的实现方法
5.3 执行出错
一般来说问题是数组越界,或是变量未定义,类型不匹配等问题,具体观察错误信息定位错误的位置
- 作者:ziuch
- 链接:https://ziuch.com/article/OJ-Quick-Start?target=comment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。