二、初识算法
2.1 算法的基本特性
2.1.1 输入输出
零个或多个输入,至少有一个或多个输出。
2.1.2 有穷性
不会出现无限循环,运行时间可以接受。
2.1.3 确定性
每一个步骤都有确定的含义。
2.1.4 可行性
每一个步骤都是可行的。
2.2 算法的设计要求
2.2.1 正确性
- (1)无语法错误。
- (2)对于合法输入,产生满足要求的输出结果。
- (3)对于非法输入,得出满足规格说明的结果。
- (4)对于精心选择甚至刁难的数据,都有满足要求的结果。
2.2.2 可读性
便于阅读、理解和交流。
2.2.3 健壮性
对于非法输入,能做出正确的处理。
2.2.4 时间效率高和存储量低
2.3 算法效率的度量方法
2.2.1 事后统计方法
通过设计好的测试程序和数据,比较不同算法的运行时间。
缺陷:
(1)花费大量的时间和精力。
(2)时间的比较依赖计算机硬件和软件等环境因素,可能会掩盖算法本身的优劣。
(3)测试数据设计困难,且需要规模很大的数据(因为程序的运行时间与测试数据的规模有很大关系)
2.2.2 事后分析估算方法
依据统计方法对算法进行估算。
2.3 函数的渐进增长
2.3.1 定义
给定两个函数 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n),如果存在一个整数 N N N,使得对于所有的 n > N n>N n>N, f ( n ) f(n) f(n)总是比 g ( n ) g(n) g(n)大,那么,我们说 f ( n ) f(n) f(n)的渐进增长快于 g ( n ) g(n) g(n)。
p.s. 渐进增长越快,算法越差。
2.3.2 比较函数的渐近增长性
(1)忽略常数
(2)忽略与最高次项相乘的常数
(3)忽略其他次要项
(4)关注最高次项的阶数
2.5 算法的时间复杂度(大O记法)
2.5.1 定义

理解:我们通过函数
T
(
n
)
T(n)
T(n),即语句总的执行次数,表示一个算法的时间复杂度。
但是,
T
(
n
)
T(n)
T(n)可能含有多个项,还有常数,不容易观察比较。
因此,我们希望使
T
(
n
)
T(n)
T(n)变得更加简单。我们找到另一个函数
f
(
n
)
f(n)
f(n),
T
(
n
)
T(n)
T(n)和
f
(
n
)
f(n)
f(n)的增长率相同。我们用
O
(
f
(
n
)
)
O(f(n))
O(f(n))表示渐进时间复杂度。
所以,
T
(
n
)
T(n)
T(n)增长越慢,算法越好。
2.5.2 推导大O阶的方法

-
常数阶 O ( 1 ) O(1) O(1)
算法一:

运行次数 T ( n ) = 3 T(n)=3 T(n)=3
第一步,将常数3改成1;无最高阶项,则复杂度就为 O ( 1 ) O(1) O(1)。
算法二:

运行次数 T ( n ) = 12 T(n)=12 T(n)=12
第一步,将常数12改为1;无最高阶项,则复杂度就为 O ( 1 ) O(1) O(1)。像上述两种算法一样, T ( n ) T(n) T(n)与 n n n的大小无关,则算法复杂度就为 O ( 1 ) O(1) O(1),又叫常数阶。
p.s.
(1)无论常数是多少,都记为 O ( 1 ) O(1) O(1)。
(2)对于单纯的分支结构(不包含在循环结构中),时间复杂度也为 O ( 1 ) O(1) O(1)。 -
线性阶

for循环中的代码执行 n n n次,则时间复杂度为 O ( n ) O(n) O(n)。 -
对数阶 O ( l o g n ) O(logn) O(logn)

2 x = n 2^x=n 2x=n
x = l o g n x=logn x=logn
时间复杂度为 O ( n ) O(n) O(n)。 -
平方阶 O ( n 2 ) O(n^2) O(n2)
算法一:

嵌套for循环,内外层都为 n n n次,时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
算法二:

嵌套for循环,外层为 m m m次,内层为 n n n次,时间复杂度为 O ( m ∗ n ) O(m*n) O(m∗n)。
算法三:

i 0 1 … n - 1 执行次数 n n - 1 … 1 总执行次数为
n + ( n − 1 ) + . . . + 1 = n ( n + 1 ) 2 = n 2 2 + n 2 n + (n - 1) + ... + 1 = \frac{n(n + 1)}{2} = \frac{n^2}{2} + \frac{n}{2} n+(n−1)+...+1=2n(n+1)=2n2+2n
依照大 O O O推导法,第一步,无常数,不考虑;第二步,保留最高阶项, n 2 2 \frac{n^2}{2} 2n2;第三步,去掉该项的系数即 1 2 \frac{1}{2} 21。时间复杂度为 O ( n 2 ) O(n^2) O(n2)。结论:循环的时间复杂度等于循环体的复杂度乘以循环运行的次数。
2.5.3 常见的时间复杂度

大小关系:

完
本文详细介绍了算法的基本特性,设计要求,如正确性、可读性和健壮性,以及如何度量算法效率,包括事后统计和估算方法。重点讲解了函数的渐进增长和大O记法,展示了不同阶的时间复杂度及其应用场景。
1100

被折叠的 条评论
为什么被折叠?



