数据结构与算法分析-算法分析

本文深入探讨了算法分析的基础,包括大O符号(O)、Omega符号(Ω)和Theta符号(Θ)的定义,阐述了它们在衡量函数增长率中的作用。通过举例说明了如何使用这些符号来比较不同算法的效率。此外,文章还介绍了几个算法分析的法则,如for循环、嵌套循环和顺序语句的运行时间计算,并提供了实例来解释这些法则。通过对最大子序列和问题的解析,展示了不同复杂度的算法解决方案,包括O(N^3)、O(N^2)和O(NlogN)的算法。最后,文章讨论了对数在运行时间中的作用,包括二分查找和欧几里得算法的O(logN)运行时间,以及幂运算的O(logN)算法。
摘要由CSDN通过智能技术生成

算法分析

算法(algorithm)是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。

数学基础

定义: 如果存在正常数 c c c n 0 n_0 n0使得当 N ≥ n 0 N\geq n_0 Nn0 T ( N ) ≤ c f ( N ) T(N)\leq cf(N) T(N)cf(N),则记为 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))

定义: 如果存在正常数 c c c n 0 n_0 n0使得当 N ≥ n 0 N\geq n_0 Nn0 T ( N ) ≥ c g ( N ) T(N)\geq cg(N) T(N)cg(N),则记为 T ( N ) = Ω ( f ( N ) ) T(N)=\Omega(f(N)) T(N)=Ω(f(N))

定义: T ( N ) = Θ ( h ( N ) ) T(N)=\Theta(h(N)) T(N)=Θ(h(N))当且仅当 T ( N ) = O ( h ( N ) ) T(N)=O(h(N)) T(N)=O(h(N)) T ( N ) = Ω ( h ( N ) ) T(N)=\Omega(h(N)) T(N)=Ω(h(N))

定义: 如果 T ( N ) = O ( p ( N ) ) T(N)=O(p(N)) T(N)=O(p(N)) T ( N ) ≠ Θ ( p ( N ) ) T(N)\neq\Theta(p(N)) T(N)=Θ(p(N)),则 T ( N ) = o ( p ( N ) ) T(N)=o(p(N)) T(N)=o(p(N))

这些定义的目的是要在函数之间建立一种相对的级别。给定两个函数,通常存在一些点,在这些点上一个函数的值小于另一个函数的值,因此,像 f ( N ) < g ( N ) f(N)<g(N) f(N)<g(N)这样的声明是没有什么意义的。于是,我们比较它们的相对增长率relative rate of growth)。

如果用传统的不等式来计算增长率,那么第一个定义是说 T ( N ) T(N) T(N)的正常率小于等于 f ( N ) f(N) f(N)的增长率。第二个定义 T ( N ) = Ω ( g ( N ) ) T(N)=\Omega(g(N)) T(N)=Ω(g(N))(念成“Omega”)是说 T ( N ) T(N) T(N)的增长率大于等于 g ( N ) g(N) g(N)的增长率。第三个定义 T ) N = Θ ( h ( N ) ) T)N=\Theta(h(N)) T)N=Θ(h(N))(念成“Theta”)是说 T ( N ) T(N) T(N)的增长率等于 h ( N ) h(N) h(N)增长率。最后一个定义 T ( N ) = o ( p ( N ) ) T(N)=o(p(N)) T(N)=o(p(N))(念成“小o”)说的则是 T ( N ) T(N) T(N)的增长率小于 p ( N ) p(N) p(N)的增长率。它不同于大O,因为大O包含增长率相同这种可能性。

当我们说 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))时,我们是在保证函数 T ( N ) T(N) T(N)是在不快于 f ( N ) f(N) f(N)的速度增长;因此 f ( N ) f(N) f(N) T ( N ) T(N) T(N)的一个上界(upper bound)。与此同时, f ( N ) = Ω ( T ( N ) ) f(N)=\Omega(T(N)) f(N)=Ω(T(N))意味着 T ( N ) T(N) T(N) f ( N ) f(N) f(N)的一个下界(lower bound)。

作为一个例子, N 3 N^3 N3的增长比 N 2 N^2 N2快,因此我们说 N 2 = O ( N 3 ) N^2=O(N^3) N2=O(N3) N 3 = Ω ( N 2 ) N^3=\Omega(N^2) N3=Ω(N2) f ( N ) = N 2 f(N)=N^2 f(N)=N2 g ( N ) = 2 N 2 g(N)=2N^2 g(N)=2N2以相同的速率增长时,从而 f ( N ) = O ( g ( N ) ) f(N)=O(g(N)) f(N)=O(g(N)) f ( N ) = Ω ( g ( N ) ) f(N)=\Omega(g(N)) f(N)=Ω(g(N))都是正确的。直观地说,如果 g ( N ) = 2 N 2 g(N)=2N^2 g(N)=2N2,那么 g ( N ) = O ( N 4 ) , g ( N ) = O ( N 3 ) , g ( N ) = O ( N 2 ) g(N)=O(N^4),g(N)=O(N^3),g(N)=O(N^2) g(N)=O(N4)g(N)=O(N3)g(N)=O(N2)从技术上都是成立的,但最后一个选择是最好的答案。

法则1

如果 T 1 ( N ) = O ( f ( N ) T_1(N)=O(f(N) T1(N)=O(f(N) T 2 ( N ) = O ( g ( N ) ) T_2(N)=O(g(N)) T2(N)=O(g(N)),那么

  • T 1 ( N ) + T 2 ( N ) = max ⁡ ( O ( f ( N ) , O ( g ( N ) ) T_1(N)+T_2(N)=\max(O(f(N),O(g(N)) T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值