二、初识算法

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


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 定义

2.5.2 图一

理解:我们通过函数 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阶的方法

2.5.2 图一

  • 常数阶 O ( 1 ) O(1) O(1)
    算法一:
    2.5.2 图二

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

    运行次数 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)

  • 线性阶
    2.5.2 图四
    for循环中的代码执行 n n n次,则时间复杂度为 O ( n ) O(n) O(n)

  • 对数阶 O ( l o g n ) O(logn) O(logn)
    2.5.2 图五
    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)
    算法一:
    2.5.2 图六
    嵌套for循环,内外层都为 n n n次,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
    算法二:
    2.5.2 图七
    嵌套for循环,外层为 m m m次,内层为 n n n次,时间复杂度为 O ( m ∗ n ) O(m*n) O(mn)
    算法三:
    2.5.2 图八

    i01n - 1
    执行次数nn - 11

    总执行次数为
    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+(n1)+...+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 常见的时间复杂度

2.5.3 图一
大小关系:
2.5.3 图二


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值