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(n^2)<O(2^n)
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
o
g
b
a
f(n)>n^{log_ba}
f(n)>nlogba,
T
(
n
)
=
O
(
f
(
n
)
)
T(n)=O(f(n))
T(n)=O(f(n))
下面我们来看一下我们刚刚那个例子
while n>1:
print(n)
n = n//2
上面这个代码每一次都把数据分成两部分,然后打印。那么按主项定理,可以写出一下式子:
T
(
n
)
=
T
(
n
2
)
1
T(n) = T(\frac{n}{2})+1
T(n)=T(2n)+1
此时
a
=
1
,
b
=
2
,
f
(
n
)
=
1
=
n
0
a=1,b=2,f(n)=1=n^0
a=1,b=2,f(n)=1=n0,计算
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新