网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
O(mn)
3.3 时间复杂度的判断
常见时间复杂度如下: |
O
(
1
)
<
O
(
l
o
g
n
)
<
O
(
n
)
<
O
(
n
l
o
g
n
)
<
O
(
n
2
)
<
O
(
2
n
)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2n)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2n),其中
O
(
l
o
g
n
)
=
O
(
l
o
g
2
n
)
O(logn)=O(log_2n)
O(logn)=O(log2n)
具体的案例说明如下: |
- O(1):
print("Hello World")
- O(n):
for i in range(n):
print('Hello World')
- O
(
n
2
)
O(n^2)
O(n2)
for i in range(n):
for j in range(n):
print('Hello World')
注意: 这里的时间复杂度相当于一个单位,因此我们只关注最高阶的情况。例如:
for i in range(n):
print("Hello World")
for j in range(n):
print('Hello World')
上面这个虽然相当于是
n
2
n
n^2+n
n2+n个计算,但是我们记为
O
(
n
2
)
O(n^2)
O(n2)。可以看出一个循环相当于一个n,如果减半呢?
- O
(
l
o
g
n
)
O(logn)
O(logn)
while n > 1:
print(n)
n = n//2
此时循环减半,它的复杂度是
O
(
l
o
g
n
)
O(logn)
O(logn),例如,当n=64时候,打印的输出为:64,32,16,8,4,2.一共六次,等价于
l
o
g
2
64
=
6
log_264=6
log264=6。
如何快速判断算法复杂度: |
下面介绍最基本情况下如何判断算法复杂度。
- 确定问题规模n
- 如果有循环减半——
l
o
g
n
logn
logn
- k层关于n的循环——
n
k
n^k
nk
主项定理: |
上面的方法是判断一些最基本的简单的情况,下面我们介绍一种处理更复杂情况的判断方法:主项定理
假设
a
≥
1
,
b
1
,
f
(
n
)
a\geq1,b>1,f(n)
a≥1,b>1,f(n)为一个函数,
T
(
n
)
T(n)
T(n)由递归式:
T
(
n
)
=
a
T
(
n
b
)
f
(
n
)
T(n) = aT(\frac{n}{b})+f(n)
T(n)=aT(bn)+f(n)
T
(
n
)
T(n)
T(n)的渐进有如下情况:
(1)如果
f
(
n
)
<
n
l
o
g
b
a
f(n)<n^{log_ba}
f(n)<nlogba,
T
(
n
)
=
O
(
n
l
o
g
b
a
)
T(n)=O(n^{log_ba})
T(n)=O(nlogba)
(2)如果
f
(
n
)
=
n
l
o
g
b
a
f(n)=n^{log_ba}
f(n)=nlogba,
T
(
n
)
=
O
(
n
l
o
g
b
a
f
(
n
)
)
T(n)=O(n^{log_ba}f(n))
T(n)=O(nlogbaf(n))
(3)如果
f
(
n
)
n
l
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
f
(
n
)
=
n
l
o
g
b
a
f(n)=n^{log_ba}
f(n)=nlogba,
T
(
n
)
=
O
(
n
l
o
g
b
a
f
(
n
)
)
T(n)=O(n^{log_ba}f(n))
T(n)=O(nlogbaf(n))
(3)如果
f
(
n
)
n
l
[外链图片转存中…(img-Tfg8M9k5-1715703398453)]
[外链图片转存中…(img-9WQuVizv-1715703398454)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!