数据结构与算法系列文章目录
【数据结构与算法】data structures & algorithms 第一章:复杂度分析 【数据结构与算法】data structures & algorithms 第二章:基本概念 【数据结构与算法】data structures & algorithms 第三章:线性数据结构 【数据结构与算法】data structures & algorithms 第四章:树的数据结构 【数据结构与算法】data structures & algorithms 第五章:图的数据结构 【数据结构与算法】data structures & algorithms 第六章:各类常见的排序算法 【数据结构与算法】data structures & algorithms 第七章:散列表算法的初步运用 【数据结构与算法】data structures & algorithms 第八章:红黑树的理解与使用
一、时间复杂度
-
简介
- 不同计算机的软硬件环境不同,所以不能通过计算机上运行所消耗的时间来度量;
- 一般地,时间复杂度是用总的执行次数来间接表示程序的运行时间,这样根据不同性能的计算机,单位时间内执行速度来度量时间的消耗;
- 数据结构中,每条语句的执行次数,被称为该语句的频度;在计算代码的频度时,一般会得到一个式子,此时需要简化,取最大的因子;如有
2
n
+
3
n
2
+
1
2n + 3n^2 + 1
2n+3n2+1?,通过
n
→
∞
n\rightarrow \infty
n→∞,我们可以把式子简化为
n
2
n^2
n2?;
- 一般地,习惯用大O表示法,表达
T
(
n
)
T(n)
T(n)的时间复杂度,即
O
(
频
度
)
O( 频度 )
O(频度);一般情况下,以最坏情况的频度作为时间复杂度;
-
计算
- 寻找算法的基本语句:执行次数最多的语句,通常在最内侧循环的循环体中;
- 将基本语句执行次数的数量级放入大O中;
- 常见的时间复杂度
O
(
1
)
<
O
(
log
?
n
)
<
O
(
n
)
<
(
n
log
?
n
)
<
O
(
n
2
)
<
o
(
n
3
)
<
?
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1) < O(\log n) < O(n) < (n\log n) < O(n^2) < o(n^3) < \cdots < O(2^n) < O(n!) < O(n^n)
O(1)<O(logn)<O(n)<(nlogn)<O(n2)<o(n3)<?<O(2n)<O(n!)<O(nn) 一般地,算法没有循环体的时间复杂度为
O
(
1
)
O(1)
O(1),即常数时间;
O
(
log
?
n
)
,
O
(
n
)
,
O
(
n
log
?
n
)
,
O
(
n
2
)
,
O
(
n
3
)
O(\log n),O(n),O(n\log n),O(n^2),O(n^3)
O(logn),O(n),O(nlogn),O(n2),O(n3)等称为多项式时间,带有这类时间复杂度的算法才算是可执行的有效算法;
O
(
2
n
)
,
O
(
n
!
)
O(2^n),O(n!)
O(2n),O(n!)等被称为指数时间;
二、空间复杂度
-
简介
- 算法运行过程中临时占用空间大小的度量,用
S
(
n
)
S(n)
S(n)定义;
- 一般地,只注意定义变量的语句;
- 计算复杂度时,观察与n的变化关系,如
i
n
t
??
a
=
0
int \ \ a = 0
int??a=0,与n无关,
i
n
t
??
b
[
n
]
int \ \ b[n]
int??b[n],与n有关;
-
计算
- 程序占用存储空间与输入值无关,则为
O
(
1
)
O(1)
O(1);
- 如果随着输入值n的增大,申请的临时空间成线性增长,则为
O
(
n
)
O(n)
O(n);
- 如果随着输入值n的增大,申请的临时空间成
n
2
n^2
n2增长,则为
O
(
n
2
)
O(n^2)
O(n2);
- 如果
?
\cdots
?,
?
\cdots
?成
n
3
n^3
n3增长,则为
O
(
n
3
)
O(n^3)
O(n3);
|