算法设计与分析——算法复杂性分析

这篇博客的内容摘自课本,针对课本中缺少的5道证明题,作为练习,给出证明。

算法运行时所需要的计算机时间资源的量称为时间复杂性。这个量应该集中反应算法的效率,并从运行该算法的实际计算机中抽象出来。换句话说,这个量应该是只依赖于要解的问题的规模、算法的输入和算法本身的函数。
  如果分别用 N,I和A 表示算法要解的问题的规模、算法的输入和算法本身,而且用 T 表示时间复杂性,那么,应该有 T=T(N,I,A) 。通常 A 隐含在复杂性函数名中,因而将 T 简写为 T(N,I) 。
现在,时间复杂性分析的主要问题是如何将复杂性函数具体化,即对于给定的 N,I和A ,如何导出 T(N,I) 的数学表达式,来给出计算 T(N,I) 的法则。
根据 T(N,I) 的概念,它应该是算法在一台抽象的计算机上运行所需要的时间。设此抽象的计算机所提供的原运算有 k 种,它们分别记为 O1,O2,...,Ok 。又设每执行一次这些元运算所需要的时间分别为 t1,t2,...,tk 。对于给定的算法 A ,设经统计,用到元运算 Oi 的次数为 ei,i=1,2,...,k 。很清楚,对于每一个 i,1≤i≤k,ei 是 N和I 的函数,即 ei=ei(N,I)
。因此有


  式中, ti(i=1,2,...,k ),是与 N和I 无关的常数。
       显然,不可能对规模为 N 的每一种合法的输入都去统计 ei(N,I),i=1,2,...,k 。因此 T(N,I) 的表达式还要进一步简化,或者说,只能在规模为 N 的某些或某类有代表性的合法输入中统计相应的 ei,i=1,2,...,k ,评价其时间复杂性。通常只考虑三种情况下的时间复杂性,即最坏情况、最好情况和平均情况下的时间复杂性,并分别记为 Tmax(N)、Tmin(N)和Tavg(N) 。在数学上有

  式中, DN 是规模为 N 的合法输入的集合; I∗ 是 DN 中使 T(N,I∗) 达到 Tmax(N) 的合法输入;I∼ 是 DN 中使 T(N,I∼) 达到 Tmin(N) 的合法输入;而 P(I) 是在算法的应用中出现输入 I 的概率。
  以上三种情况下的时间复杂性从某一角度反应算法的效率,各有局限性,也各有各的用处。实践表明,可操作性最好且最有实际价值的是最坏情况下的时间复杂性。
  为了简化算法复杂性的分析,下面引入复杂性渐近性态的概念。
  设 T(N) 是前面所定义的关于算法A的复杂性函数。一般来说,当 N 单调递增且趋于 ∞ 时, T(N) 也将单调增加且趋于 ∞ 。对于 T(N) ,如果存在 T∼(N) ,使得当 N→∞ 时有 T(N)−T∼(N))/T(N)→0 ,那么,就说 T∼(N) 是 T(N) 当 N→∞ 时的渐近性态,或称 T∼(N) 为算法 A 当 N→∞ 的渐近复杂性,而与 T(N) 相区别。
  因为在数学上, T∼(N) 是 T(N) 当 N→∞ 时的渐近表达式。直观上, T∼(N) 是 T(N) 中略去低阶项所留下的主项,所以它无疑比 T(N) 来得简单。比如当 T(N)=3N2+4NlogN+7 时,T∼(N) 的一个答案是 3N2 ,因为这时有

显然, 3N2 比 3N2+4NlogN+7 简单多了。
  由于当 N→∞ , T(N) 渐近于 T∼(N) ,我们有理由用 T∼(N) 来代替 T(N) 作为算法 A 在 N→∞ 时的复杂性的度量。而且由于 T∼(N) 明显比 T(N) 简单,这种替换明显的是对算法复杂性分析的一种简化。进一步考虑到分析算法的复杂性的目的在于比较解同一个问题的两个不同算法的效率。而当要比较的两个算法的渐近复杂性的阶不同时,只要能确定出各自的阶,就可以判定出哪一个算法的效率高。换句话说,这时的渐近复杂性分析只要关心 T∼(N) 的阶就够了,不必关心包含在 T∼(N) 中的常数因子。所以,假设算法中用到的所有不同的元运算各执行一次所需要的时间都是一个单位时间。与此同时,引出以下渐近意义下的记号 O,Ω,θ和o 。
  以下设 f(N)和g(N) 是定义在正数集上的正函数。
  如果存在正的常数 C 和自然数 N0 ,使得当 N≥N0 时有 f(N)≤Cg(N) ,则称函数 f(N) 当 N 充分大时上有界,且 g(N) 是它的一个上界,记为 f(N)=O(g(N)) 。这时还说 f(N) 的阶不高于 g(N) 的阶。
  举几个例子:
  (1)因为对于所有的 N≥1 有 3N≤4N ,所以有 3N=O(N) ;
  (2)因为当 N≥1 时有 N+1024≤1025N ,所以有 N+1024N=O(N) ;
  (3)因为当 N≥10 时有 2N2+11N−10≤3N3 ,所以有 2N2+11N−10=O(N2);
  (4)因为对所有 N≥1 有 N2≤N3 ,所以有 N2=O(N3) ;
  (5)作为一个反例, N3≠O(N2) 。因为若不然,则存在正的常数 C 和自然数 N0 ,使得当 N≥N0有N3≤CN2 ,即 N≤C 。显然,当 N=max{N0,⌊C⌋+1} 时这个不等式不成立,所以N3≠O(N2) 。
  按照符号 O 的定义,容易证明它有如下运算规则:
  (1)O(f)+O(g)=O(max(f,g));
  (2)O(f)+O(g)=O(f+g) ;
  (3)O(f)O(g)=O(fg) ;
  (4)如果g(N)=O(f(N)) ,则 O(f)+O(g)=O(f) ;
  (5)O(Cf(N))=O(f(N)) ,其中 C 是一个正的常数;
  (6)f=O(f) 。

下面仅给出规则(1)的证明过程,其余类似。
设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
类似地,设 G(N)=O(g) ,则存在正的常数 C2 和自然数 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=max{C1,C2},N3=max{N1,N2},h(N)=max{f,g} ,则对所有的 N≥N3 ,
F(N)≤C1f(N)≤C1h(N)≤C3h(N)
类似地,有
G(N)≤C2g(N)≤C2h(N)≤C3h(N)
因而
O(f)+O(g)=F(N)+G(N)≤C3h(N)+C3h(N)≤2C3h(N)=O(h)=O(max(f,g))

O(f)+O(g)=O(f+g) 证明

设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
类似地,设 G(N)=O(g) ,则存在正的常数 C2 和自然数 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=max{C1,C2},N3=max{N1,N2},则对所有的 N≥N3 ,有
F(N)≤C1f(N)≤C3f(N)
G(N)≤C2g(N)≤C3g(N)
故有:
O(f)+O(g)=F(N)+G(N)≤C3f(N)+C3g(N)=C3(f(N)+g(N))=O(f+g)

O(f)O(g)=O(fg) 证明

设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
类似地,设 G(N)=O(g) ,则存在正的常数 C2 和自然数 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=C1*C2, N3=max{N1,N2}, 则对所有的 N≥N3 ,有
F(N)≤C1f(N)
G(N)≤C2g(N)
故有:
O(f)*O(g)=F(N)*G(N)≤C1f(N)*C2g(N)=C3*f(N)*g(N)=O(f*g)

如果g(N)=O(f(N)) ,则 O(f)+O(g)=O(f) ;

设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
类似地,设 G(N)=O(g) ,则存在正的常数 C2 和自然数 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
因为g(N)=O(f(N))
令 C3=C1+C2,N3=max{N1,N2},则对所有的 N≥N3 ,有
F(N)≤C1f(N)≤C3f(N)
G(N)≤C2g(N)≤C3g(N)
故有:
O(f)+O(g)=F(N)+G(N)=O(f)+O(f(N))=O(f)

O(Cf(N))=O(f(N)) ,其中 C 是一个正的常数;

对O(f(N))设 F(N)=O(f(N)) 。根据符号 O 的定义,存在正常数 C0 和自然数 N0 ,使得对所有的 N≥N0 ,有F(N)≤C0f(N) 。
因而存在正常数C0/C和自然数N0,使得对所有 N≥N0 ,F(N)≤(C0/C)*Cf(N)
因而O(Cf(N))=O(f(N))

f=O(f) 证明

设 F(N)=O(f) 。根据符号 O 的定义,存在正常数 C1 和自然数 N1 ,使得对所有的 N≥N1 ,有 F(N)≤C1f(N) 。
故有:
O(f)=F(N)≤C1f(N)=f

根据符号 O 的定义,用它评估算法的复杂性,得到的只是当规模充分大时的一个上界。这个上界的阶越低,则评估的就越精确,结果就越有价值。
  

Ω :如果存在正的常数 C和自然数 N0 ,使得当 N≥N0 时有 f(N)≥Cg(N) ,则称函数 f(N) 当 N 充分大时下有界;且 g(N) 是它的一个下界,记为 f(N)=Ω(g(N)) 。这时还说 f(N) 的阶不低于 g(N)) 的阶。
同样要指出,用 Ω 评估算法的复杂性,得到的只是该复杂性的下界。这个下界的阶越高,则评估就越精确,结果就越有价值。它常常与符号 O 配合以证明某问题的一个特定算法是该问题的最优算法或该问题的某算法类中最优算法。
定义 f(N)=θ(g,(N)) 当且仅当 f(N)=O(g(N)) 且 f(N)=Ω(g(N)) 。这时,我们说 f(N)与g(N) 同阶。
最后,如果对于任意给定的 ε>0 ,都存在正整数 N0 ,使得当 N≥N0 时有 f(N)/g(N)<ε ,则称函数 f(N) 当 N 充分大时的阶比 g(N) 低,记为 f(N)=o(g(N)) 。

原文地址:https://www.cnblogs.com/wkfvawl/p/12015752.html

时间: 2024-10-01 22:13:21

算法设计与分析——算法复杂性分析的相关文章

算法设计:全排列算法代码实现

在上星期的算法设计课程的学习中,我们学习了两种全排列算法,该算法用于求出数组{1,2,3,...,n}的所有可能的排列,今天我们就来看看这个算法的具体代码实现. 1. 第一种算法 第一种算法和我们现实生活中习惯的方法较为相似,以{1,2,3}为例,我们先写出第一种排列123,然后将2与3交换,得到132:再回到123,交换1与2得到213,再将1与3交换.....直到得到所有的排列. 该算法伪码如下: PERMUTATIONS1(int n): for j←1 to n a[j]←j end f

算法设计与分析课程复习笔记(1)

一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种"抽象的机器"之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合适的RAM计算模型. 1.3 RAM(Random Access Machine)模型 RAM模型的基本构成如下: RAM计算模型有如下特点: 一个简单操作花费一步:键值比较.加减.内存访问 没有操作可以被分解:循环.子程序 内存:访存是一个简单操作.无限制的内存 二.算法设计 2.1 算

贪心算法设计 关于区间选择问题

/* 现在有n项工作,知道每一项工作的开始时间和结束时间,问最多可以选择多少工作 算法设计:贪心算法,不断选择不冲突的那些结束时间最短的工作 */ #include<iostream> #include<vector> #define max_n 100001 using namespace std; int N; //first is the start of the job,and the secone is the end time of the job typedef pa

大数据算法(一)亚线性算法

来源:大数据算法 王宏志 一.概述 大数据定义:在给定的资源约束下,以大数据为输入,在给定时间约束内可以生成满足给定约束结果的算法. 大数据特点:4V 大数据算法可以不是: 精确算法 内存算法 串行算法 仅在电子计算机上运行的算法 大数据算法不仅是: 云计算 MapReduce 大数据分析和挖掘的算法 难度: 访问全部数据时间过长 读取部分数据 亚线性算法 数据难以放入内存 将数据存储到磁盘上 外存算法 仅基于少量数据进行计算 空间亚线性算法 单个计算机难以保存全部数据 并行处理 并行算法 计算

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

算法设计与分析 ------最近对问题与8枚硬币问题

利用减治法实现8枚硬币问题: 参考资料:http://blog.csdn.net/wwj_748/article/details/8863503    算法设计--八枚硬币问题 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stdio.h> 4 using namespace std; 5 6 7 void eightcoin(int arr[]); 8 void compare(int a,in

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

【通知】《算法设计与分析》实验课、理论课补课、考试时间、加分等安排 及 个人目标设定

Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多 变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 否患有某种病. 在讲解Logistic回归理论之前,我们先从LR分类器说起.LR分类器,即Logistic Regression Classifier. 在分类情形下,经过学习后的LR分类器是一组权值,当测试样本的数据输入时,这组权值与测试数据按 照线性加和得到 这里是每个样本的个特征. 之后按照s

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<