算法设计基础:复杂度分析、数据表示与问题规约
1. 复杂度分析
1.1 基本概念
在算法设计中,通常会分析算法的最坏情况运行时间和空间复杂度。复杂度表示为输入参数在最坏输入情况下的函数。例如,若输入是长度为 $n$ 且字母表大小为 $\sigma$ 的字符串,线性时间算法的运行时间为 $O(n)$,这里的 $O(·)$ 是常见的大 $O$ 符号,它隐藏了常数。这意味着运行时间上限为 $cn$ 个基本操作,其中 $c$ 是某个常数。
我们不将字母表大小视为常数,会使用 $O(n\sigma)$ 和 $O(n \log \sigma)$ 等表达式,这些并非线性复杂度界。对于空间需求,常用 $n \log \sigma(1 + o(1)) = n \log \sigma + o(n \log \sigma)$ 等符号,其中 $o(·)$ 表示一个渐近增长速度严格慢于其参数的函数,例如 $O(n \log \sigma / \log \log n)$ 可简化为 $o(n \log \sigma)$。
1.2 特殊算法复杂度
有些算法的运行时间为 $O(dn^c)$,其中 $c$ 是常数,$d$ 是输入中给定的整数,可独立于输入大小 $n$ 取任意大的值,这种算法称为伪多项式算法。更一般地,一些算法的运行时间为 $O(f(k)n^c)$,其中 $c$ 是常数,$f(k)$ 是一个不依赖于 $n$ 但仅依赖于输入的另一个(通常较小)参数 $k$ 的任意函数,这种算法称为固定参数可处理算法。若 $k$ 较小且 $f(k)$ 增长足够慢,该算法是高效的,问题是可处理的。
1.3 复杂度符号
除了 $o(·
超级会员免费看
订阅专栏 解锁全文
945

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



