算法导论3-1
读书笔记
渐近记号用来刻画算法的运行时间,但是想要综合性的覆盖所有的输入,需要不同的渐近记号;
\(\theta\)记号,确定一个算法的渐近上界和渐近下界,具体定义如下:
\(\theta(g(n))\)=
{\(f(n)\): 存在正常量\(c_1\)和\(c_2\)和\(n_0\),使得对所有的\(n\geq{n_0}\),有\(0\leq{c_1g(n)}\leq{f(n)}\leq{c_2g(n)}\)}
此处\(f(n)\)代表该算法的准确运行时间,包含所有的低阶项、常量等细节;
\(\theta(g(n))\)代表最高项为\(g(n)\)的所有函数的集合;
这里函数\(f(n)\)被它的上界\(c_1g(n)\)和它的下界\(c_2g(n)\)夹裹,也就是对所有的\(n\geq{n_0}\),存在一个常数\(c\),使得\(cf(n)\)=\(g(n)\),则称\(g(n)\)是\(f(n)\)的一个渐近紧确界;
\(O\)记号,确定一个算法的渐近上界,具体定义如下:
\(O(g(n))\)={\(f(n)\): 存在正常量\(c\)和\(n_0\),使得对所有\(n\geq{n_0}\),有\(0\leq{f(n)}\leq{cg(n)}\)};
一般用来描述最坏运行时间
\(\Omega\)记号,确定一个算法的渐近下界,具体定义如下:
\(\Omega(g(n))\)={\(f(n)\): 存在正常量\(c\)和\(n_0\),使得对所有的\(n\geq{n_0}\),有\(0\leq{cg(n)}\leq{f(n)}\)};
一般用来描述最好运行时间
\(o\)记号,确定一个算法的非渐近紧确的上界,形式化定义如下:
\(o(g(n))\)={\(f(n)\): 对任意正常量\(c>0\),存在常量\(n_0>0\),使得所有的\(n\geq{n_0}\),有\(0\leq{f(n)}<{cg(n)}\)};
\(\omega\)记号,确定一个算法的非渐近紧确的下界,形式化定义如下:
\(\omega(g(n))\)={\(f(n)\): 存在正常量\(c>0\),存在常量\(n_0>0\),使得对所有的\(n\geq{n_0}\),有\(0\leq{cg(n)}<{f(n)}\)};
课后习题
3.1-1
假设\(f(n)\)和\(g(n)\)都是渐近非负函数,使用\(\theta\)记号的基本定义证明\(max(f(n), g(n))=\theta(f(n)+g(n))\)。
题目的意思是让我们证明:
存在正常量\(c_1\)和\(c_2\)和\(n_0\),使得对所有的\(n\geq{n_0}\),有\(0\leq{c_1({f(n)}+g(n))}\leq{max(f(n),g(n))}\leq{c_2({f(n)+g(n)}})\)
因为这两个函数都是非负的,所以不等式最左边显然成立;
此处令\(c_2=1\),就有\(max(f(n), g(n))\leq{(f(n)+g(n))}\)显然成立;
然后令\(c_1=\frac{1}{2}\),就有\(\frac{f(n)+g(n)}{2}\leq{max(f(n)+g(n))}\)显然成立;
证毕;
3.1-2
证明:对任意实常量\(a\)和\(b\),其中\(b>0\),有
\((n+a)^b=\theta(n^b)\)
也就是让我们证明:
存在正常量\(c_1\)、\(c_2\)和\(n_0\),使得对所有的\(n\geq{n_0}\),有
\(0\leq{c_1n^b}\leq{(n+a)^b\leq{c_2n^b}}\)
对于所有\(n\geq{-a}\),不等式的最左边显然成立;
3.1-3
解释为什么“算法A的运行时间至少是\(O(n^2)\)”这一表述是无意义的。
这个问题的提问方式有问题,这里的无意义应该写成错误;
这里的至少,指明了下界;但是\(O(n^2)\)又指明了上界,两者是冲突的,所以这一说法的错误的;
3.1-4
\(2^{n+1} = O(2^n)\)成立吗?\(2^{2n}=O(2^n)\)成立吗?
对于第一个等式成立;
因为有\(n>0\),使得\(0\leq{2^{n+1}}\leq{4*2^n}\)成立。
对于第二个等式不成立;
此处使用反证法,先假定\(2^{2n}=O(2^{n})\)成立,那么根据定义必有:
成立,也就是要求\(2^n\leq{c}\),显然可知不等式不可能成立,所以\(2^{2n}=O(2^n)\)不成立。
3.1-5
证明定理3.1
定理3.1 的内容是
3.1-6
对于任意两个函数\(f(n)\)和\(g(n)\),当且仅当\(f(n)=O(g(n))\)和\(f(n)=\Omega(g(n))\)时,\(f(n)=\theta(g(n))\)成立;
事实上,上述定理是显然成立的,当一个函数的渐近上界和渐近下界都确定了,那它的渐近确界也就确定了。
3.1-7
证明: 一个算法的运行时间为\(\theta(g(n))\)当且仅当其最坏运行时间为\(O(g(n))\),且其最好运行时间为\(\Omega(g(n))\)。
事实上,这和上一个问题是一致的,不在赘述。
3.1-8
证明: \(o(g(n))\bigcap\omega(g(n))\)为空集
根据定义有以下不等式成立:
推断有以下式子成立:
上述不等式,显然不能同时成立,也就是这两个集合的交集为空集,证毕;
3.1-9
可以扩展我们的记号到有两个参数\(n\)和\(m\)的情形,其中的\(n\)和\(m\)可以按不同的速率独立地趋于无穷。对于给定的函数\(g(n, m)\),用\(O(g(n,m))\)来表示以下函数集:
\[\begin{aligned} & O(g(n,m))=\{f(n,m):存在正常量c,n_0和m_0,使得对所有n\geq{n_0},\\ & 或m\geq{m_0},有0\leq{f(n,m)}\leq{cg(n,m)}。 \end{aligned} \]请给出\(\Omega(g(n,m))\)和\(\theta(g(n,m))\)相应的定义。
\(\Omega(g(n,m))\)定义如下:
\(\theta(g(n,m))\)定义如下: