渐进符号的含义
- 格式:doc
- 大小:137.50 KB
- 文档页数:3
数据结构(一)目录第1章序论 (1)1.1 什么是数据? (1)1.2 什么是数据元素? (1)1.3 什么是数据结构及种类? (1)1.4 数据的逻辑结构 (1)1.5 数据的物理结构 (1)1.6 算法和算法分析 (1)1.7 算法的五个特性 (1)1.8 算法设计的要求 (2)1.9 算法效率的度量 (2)第2章线性表 (3)2.1 线性表举例 (3)2.2 线性表的存储 (4)2.3 线性表-栈 (4)2.4 队列 (4)2.5 双端队列 (6)第3章树和二叉树 (6)3.1 树 (6)3.1.1 树的基本概念 (6)3.1.2 树的常用存储结构 (6)3.1.3 树的遍历 (7)3.2 二叉树 (7)3.2.1 二叉树的基本概念 (7)3.2.2 二叉树与树的区别 (7)3.2.3 树及森林转到二叉树 (7)3.2.4 二叉树的性质 (8)3.2.5 满二叉树 (8)3.2.6 完全二叉树 (8)3.2.7 完全二叉树的性质 (9)3.2.8 二叉树的四种遍历 (9)3.2.9 二叉排序树 (10)3.2.10 平衡二叉树 (11)3.2.11 m阶B-树 (11)3.2.12 最优二叉树 (11)3.2.13 二叉树的存储结构 (12)3.3 广义表 (13)3.4 矩阵的压缩存储 (14)3.4.1 特殊矩阵 (14)3.4.2 压缩存储 (14)第4章历年真题讲解 (15)4.1 2009年上半年 (15)4.2 2009年下半年 (15)4.3 2010年上半年 (15)4.4 2011年上半年 (16)4.5 2011年下半年 (16)4.6 2012年上半年 (17)4.7 2012年下半年 (17)4.8 2013年上半年 (18)4.9 2013年下半年 (18)4.10 2014年上半年 (18)4.11 2014年下半年 (19)4.12 2015年上半年 (19)4.13 2015年下半年 (19)4.14 2016年上半年 (20)第1章序论什么是数据?所有能输入到计算机中并能够被计算机程序处理的符号的总称,它是计算机程序加工的原料。
渐进记号的定义渐进确界Θ Θ(g(n))={ f(n):存在正常数c1,c2和n0,使对所有的n>=n0,有0<=c1g(n)<=f(n)<=c2g(n) }(在集合表⽰法中,“:”应读作“满⾜......的特性”)渐进上界O O(g(n))={ f(n):存在正常数c和n0,使对所有n>=n0,有0<=f(n)<=cg(n) }渐进下界Ω Ω(g(n))={ f(n):存在正常数c和n0,使对所有n>=n0,有0<=cg(n)<=f(n) }⾮渐进紧确的上界o其中,O记号所提供的渐进上界可能是也可能不是渐进紧确的。
我们使⽤o记号表⽰⾮渐进紧确的上界: o(g(n))={ f(n):对任意正常数c,存在常数n0>0,使对所有的n>=n0,有0<=f(n)<=cg(n) }⾮渐进紧确的下界ωω记号与Ω记号的关系就好像o记号与O记号的关系⼀样。
我们⽤ω记号来表⽰⾮渐进紧确的下界: ω(g(n))={ f(n):对任意正常数c,存在常数n0>0,使对所有的n>=n0,有0<=cg(n)<f(n) }或者另⼀种定义为 f(n)∈ω(g(n))当且仅当g(n)∈o(f(n))记号Θ,O和Ω的图例。
在每个部分中,n0是最⼩的可能值;⼤于n0的值也有效。
a)Θ记号限制⼀个函数在常数因⼦内。
如果存在正常数n0,c1和c2使得在n0右边f(n)的值永远在c1g(n)与c2g(n)之间,那么可以写成f(n)=Θ(g(n))。
b)O记号给出⼀个函数在常数因⼦内的上限。
如果存在正常数n0和c使得在n0右边f(n)的值永远等于或⼩于cg(n),那么可以写成f(n)=O(g(n))。
c)Ω记号给出⼀个函数在常数因⼦内的下限。
如果存在正常数n0和c使得在n0右边f(n)的值永远等于或⼤于cg(n),那么可以写成f(n)=Ω(g(n))。
公文常见标点符号用法公务活动中易用错读错的标点和字词一、公文中易误用的标点1.顿号的误用。
一是顿号、逗号、分号、句号混用。
在完整的句子里,顿号是句子内部并列词语之间的停顿;逗号是单句内部成分与成分之间或复句内部各分句之间的停顿;分号是复句内部并列分句之间的停顿;句号是陈述句末尾用的点号。
这4个点号在句子中是循序渐进的,通俗地说,句号管分号、逗号、顿号;分号管逗号、顿号;逗号管顿号。
行政机关公文问题通常出在:⑴混用顿号和逗号;⑵混用逗号和分号;⑶分号内部用句号。
如“要加强东、西方文化交流。
”在表示方位时,“东、西”可用顿号隔开(二者是并列关系),也可以不用顿号隔开,如“地不分南北,人不分东西”;但“东西方”不能用顿号隔开(“东”和“西方”不是并列关系),类似的还有“上、下午,前、后台”等,都不正确。
二是表示概数不应用顿号隔开。
如“参加培训班大概有七、八十人。
”这句话中“七八十”是概数,不能用顿号隔开。
三是表示结构层次序数的阿拉伯数字后面应为圆点,不是顿号。
这个不规范现象比较普遍。
在题序后面误用顿号。
例如:第一、第二、首先、其次、等等,顿号(、)应改为逗号(,)。
(一)、(二)、(三)、(1)、(2)、(3)、①、②、③、等等,这些序号既然用了括号,就不能再加顿号及其他标点。
1、2、3、A、B、C、a、b、c、等等,阿拉伯数字和拉丁字母作序号时后面不用顿号,应该用下脚圆点号“.”(只有中文数字序号后面才使用顿号如“一、二、三、等”)。
2.冒号“:” 误为比号“︰”。
3.破折号误为两个一字线“——”或一个化学单键号“—”,破折号应为“——”。
把“——”改为“——”的方法是:将其刷黑再选择成黑体,两个一字线就连在一起了。
4.表示数量范围的数字之间误用了一字线“—”或半字线“-”,应该用浪纹线“~”,如11月1日~11月5日,2~3天,20~30人,等等。
浪纹线“~”可在插入菜单中的特殊符号里查找,也可在新罗马字体下按Shift+~。
数学的语言学习数学中的专业术语和符号数学是一门理性而精确的学科,其中运用了许多专业术语和符号来表达数学思想和解决问题。
掌握这些术语和符号对于学习和理解数学概念至关重要。
本文将探讨数学中的专业术语和符号,重点介绍其使用方法和意义。
一、数学专业术语的学习数学专业术语是数学领域内的特定词汇,用于描述概念、定理和推理过程等。
学习数学专业术语有助于准确理解和表达数学思想。
以下是一些常见的数学专业术语:1. 函数(Function):函数是数学中常见的概念,表示一种特定的对应关系。
函数通常用符号 f(x) 或 g(x) 表示,其中 x 为自变量,f(x)为关于 x 的函数值。
2. 导数(Derivative):导数是描述函数变化率的概念,表示函数在某一点的瞬时变化速率。
导数常用符号 f'(x) 或 dy/dx 表示,其中 f'(x)表示函数 f(x) 的导数。
3. 积分(Integral):积分是求函数面积或曲线长度的方法,也是导数的逆运算。
积分常用符号∫f(x)dx 表示,其中∫表示积分运算符。
4. 矩阵(Matrix):矩阵是由数字排列成的矩形数表,用于表示线性方程组或进行线性变换。
矩阵通常用方括号 [] 表示,例如 A = [a_ij],其中 a_ij 表示矩阵 A 中的元素。
5. 向量(Vector):向量是表示大小和方向的量,常用于描述物理力学和几何概念。
向量通常用有方向的箭头表示,例如向量 v。
学习数学专业术语时,可以通过阅读教材、参考词典以及专业论文等渠道进行学习。
同时,积极解决数学问题,参与数学讨论和实践操作,也能够加深对数学术语理解和运用的熟练程度。
二、数学符号的学习除了专业术语外,数学领域中还广泛使用各种符号来简化表达和表示数学关系。
掌握数学符号对于理解和解决数学问题非常重要。
以下是一些常见的数学符号:1. 加号(+)和减号(-):加号表示两数之和,减号表示两数之差。
例如,a + b 表示 a 和 b 的和,a - b 表示 a 和 b 的差。
§1.3 渐近符号设)(n T 是算法A 的复杂性函数。
一般说来,当n 单调增加趋于∞时,)(n T 也将单调增加趋于∞。
如果存在函数)(~n T ,使得当∞→n 时有0)(/))(~)((→-n T n T n T ,则称)(~n T 是)(n T 当∞→n 时的渐近性态,或称)(~n T 是算法A 当∞→n 的渐近复杂性。
因为在数学上,)(~n T 是)(n T 当∞→n 时的渐近表达式,)(~n T 是)(n T 中略去低阶项所留下的主项,所以它无疑比)(n T 来得简单。
进一步分析可知,要比较两个算法的渐近复杂性的阶不相同时,只要确定出各自的阶,就可以知道哪一个算法的效率高。
换句话说,渐近复杂性分析只要关心)(~n T 的阶就够了,不必关心包含在)(~n T 中的常数因子。
所以,我们常常有对)(~n T 的分析进一步简化,即假设算法中用到的所有不同的运算(基本)各执行一次所需要的时间都是一个单位时间。
综上分析,我们已经给出了简化算法复杂性分析的方法和步骤,即只考虑当问题的规模充分大时,算法复杂性在渐近意义下的阶。
为此引入渐近符号,首先给出常用的渐近函数。
常 用 的 渐 进 函 数在下面的讨论中,用f(n)表示一个程序的时间或空间复杂性,它是实例特 征n (一般是输入规模)的函数。
由于一个程序的时间或空间需求是一个非负的实数,我们假定函数f(n)对于n 的所有取值均为非负实数,而且还可假定n>=0。
渐近符号O 的定义:f(n)=O(g(n))当且仅当存在正的常数c 和n 0,使得对于所有的n>=n 0,有f(n)<=cg(n)。
此时,称g(n)是f(n)的一个上界。
函数f 至多是函数g 的c 倍,除非0n n <。
即是说,当n 充分大时,g 是f 的一个上界函数,在相差一个非零常数倍的情况下。
通常情况下,上界函数取单项的形式,如表1所列。
C 0=O(1): f(n) 等于非零常数的情形。
《算法设计与分析》教案张静第1章绪论算法理论的两大论题:1. 算法设计2. 算法分析1.1 算法的基本概念1.1.1 为什么要学习算法理由1:算法——程序的灵魂➢问题的求解过程:分析问题→设计算法→编写程序→整理结果➢程序设计研究的四个层次:算法→方法学→语言→工具理由2:提高分析问题的能力算法的形式化→思维的逻辑性、条理性1.1.2 算法及其重要特性算法(Algorithm):对特定问题求解步骤的一种描述,是指令的有限序列。
算法的五大特性:⑴输入:一个算法有零个或多个输入。
⑵输出:一个算法有一个或多个输出。
⑶有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
⑷确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
⑸可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
1.1.3 算法的描述方法⑴自然语言优点:容易理解缺点:冗长、二义性使用方法:粗线条描述算法思想注意事项:避免写成自然段欧几里德算法⑶程序设计语言优点:能由计算机执行缺点:抽象性差,对语言要求高使用方法:算法需要验证注意事项:将算法写成子函数欧几里德算法#include <iostream.h>int CommonFactor(int m, int n) {int r=m % n;while (r!=0){m=n;n=r;r=m % n;}return n;}void main( ){cout<<CommonFactor(63, 54)<<endl;}⑷伪代码——算法语言伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
优点:表达能力强,抽象性强,容易理解使用方法:7 ± 2欧几里德算法1. r = m % n;2. 循环直到 r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;3. 输出 n ;1.1.4 算法设计的一般过程1.理解问题2.预测所有可能的输入3. 在精确解和近似解间做选择4. 确定适当的数据结构5.算法设计技术6.描述算法7.跟踪算法8.分析算法的效率9.根据算法编写代码1.2 算法分析算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算➢时间复杂性(Time Complexity)➢空间复杂性(Space Complexity)算法分析的目的:➢设计算法——设计出复杂性尽可能低的算法➢选择算法——在多种算法中选择其中复杂性最低者时间复杂性分析的关键:➢ 问题规模:输入量的多少;➢ 基本语句:执行次数与整个算法的执行时间成正比的语句for (i=1; i<=n; i++)for (j=1; j<=n; j++)x++;问题规模:n基本语句:x++1.2.1 渐进符号1. 大O 符号定义1.1 若存在两个正的常数c 和n 0,对于任意n ≥n 0,都有T (n )≤c ×f (n ),则称T (n )=O (f (n ))2. 大Ω符号定义1.2 若存在两个正的常数c 和n 0,对于任意n ≥n 0,都有T (n )≥c ×g (n ),则称T (n )=Ω(g (n ))问题规模n 执行次3. Θ符号定义1.3 若存在三个正的常数c 1、c 2和n 0,对于任意n ≥n 0都有c 1×f (n )≥T (n )≥c 2×f (n ),则称T (n )=Θ(f (n ))例: T (n )=5n 2+8n +1当n ≥1时,5n 2+8n +1≤5n 2+8n +n=5n 2+9n ≤5n 2+9n 2≤14n 2=O (n 2)当n ≥1时,5n 2+8n +1≥5n 2=Ω(n 2)∴ 当n ≥1时,14n 2≥5n 2+8n +1≥5n 2则:5n 2+8n +1=Θ(n 2)0问题规模n 执行次数问题规模n 执行次数定理 1.1 若T(n)=amnm +am-1nm-1 + … +a1n+a0(am>0),则有T(n)=O(nm)且T(n)=Ω(n m),因此,有T(n)=Θ(n m)。
什么是基本运算?答:基本运算是解决问题时占支配地位的运算(一般1种,偶尔两种);讨论一个算法优劣时,只讨论基本运算的执行次数。
什么是算法的时间复杂性(度)?答:算法的时间复杂性(度)是指用输入规模的某个函数来表示算法的基本运算量。
T(n)=4n3什么是算法的渐近时间复杂性?答:当输入规模趋向于极限情形时(相当大)的时间复杂性。
表示渐进时间复杂性的三个记号的具体定义是什么?答:1. T(n)= O(f(n)):若存在c > 0,和正整数n0≣1,使得当n≣n0时,总有T(n)≢c*f(n)。
(给出了算法时间复杂度的上界,不可能比c*f(n)更大)2. T(n)=Ω(f(n)):若存在c > 0,和正整数n0≣1,使得当n≣n0时,存在无(给出了算法时间复杂度的下界,复杂度不可能比c*f(n)穷多个n ,使得T(n)≣c*f(n)成立。
更小)3. T(n)= Θ(f(n)):若存在c1,c2>0,和正整数n0≣1,使得当n≣n0时,总有T(n)≢c1*f(n),且有无穷多个n,使得T(n)≣c2*f(n)成立,即:T(n)= O(f(n))与T(n)=Ω(f(n))都成立。
(既给出了算法时间复杂度的上界,也给出了下界)什么是最坏情况时间复杂性?什么是平均情况时间复杂性?答:最坏情况时间复杂性是规模为n的所有输入中,基本运算执行次数为最多的时间复杂性。
平均情况时间复杂性是规模为n的所有输入的算法时间复杂度的平均值(一般均假设每种输入情况以等概率出现)。
一般认为什么是算法?什么是计算过程?答:一般认为,算法是由若干条指令组成的有穷序列,有五个特性a.确定性(无二义)b.能行性(每条指令能够执行)c.输入 d.输出 e.有穷性(每条指令执行的次数有穷)只满足前4条而不满足第5条的有穷指令序列通常称之为计算过程。
函数的渐进表达式
函数的渐进表达式是指当自变量趋近于某个值时,函数的变化趋势。
常见的函数渐进表达式包括大O记号、小o记号、Θ记号等。
大O记号表示的是函数的渐进上界,即当自变量趋近于无穷大时,函数值不超过某个常数的函数集合。
例如,若函数f(n)=n^2+2n+1,则可以用O(n^2)表示,因为当n趋近于无穷大时,f(n)不会超过某
个常数乘以n的平方。
小o记号表示函数的渐进下界,即当自变量趋近于某个值时,函数值趋近于零的函数集合。
例如,若函数g(x)=x/(1+x),则可以用
o(1)表示,因为当x趋近于无穷大时,g(x)趋近于零。
Θ记号表示函数的渐进上下界相等,即当自变量趋近于某个值时,函数值在某个常数范围内波动的函数集合。
例如,若函数
h(x)=x^2-3x+5,则可以用Θ(x^2)表示,因为当x趋近于无穷大时,h(x)在某个常数范围内波动。
函数的渐进表达式有很多应用,如在算法分析、数据结构设计、计算机科学等领域中都有广泛的应用。
通过研究函数的渐进表达式,可以更好地理解函数的变化趋势,从而优化算法的效率,提高计算机程序的性能。
- 1 -。
解释渐近符号o,ω,θ的含义t O是位于o0与o1之间的点,它在o0与o1两点连线的垂直平分线上。
由于O0和O1距离不同,因此它们的纵坐标的增量必然存在差异。
对于这种差异大小,人们可以通过理论计算和实验来测定。
O的纵坐标的绝对值等于该点距O0的距离。
O的渐近线为与x轴平行的直线,过原点( O0)和O的纵坐标的绝对值为1。
当ω→∞时, O在x轴上方。
O的绝对值随着x增大而逐渐减小。
由于该点过原点,所以O在x轴上。
其坐标为:O是过原点(O0)的圆上一动点,过O的纵坐标的绝对值为1, O 的横坐标在圆周上有最大的正值和最小的负值。
O是在x轴上的动点,并且位于绝对值增大区间内。
对于任何一个过原点的圆, O的纵坐标的绝对值都在这个圆内。
O的绝对值减小区间是从O0→O1。
O 的绝对值在原点处最小,在O1处最大。
因此可知,在原点处, O的纵坐标的绝对值最小。
在x轴上, O的纵坐标的绝对值随着x增大而增大。
这说明O在x轴上有最大正值。
在x轴上, O的纵坐标的绝对值在O0处最大。
在O1处, O的纵坐标的绝对值也在O0处最大。
但O的纵坐标在O1处最大,则该点在圆上。
故其坐标为: O在x 轴上,在绝对值减小区间内。
O的绝对值最小,即, O→O1,该点在X轴上,为过原点的圆心的圆上的一个动点,它过原点的纵坐标为1。
对于O,当x→O1时,对应的纵坐标为1;当x→O0时,对应的纵坐标为-1。
从O1出发,与x轴平行的直线,只要经过O,并且纵坐标绝对值为1,就是该圆的渐近线。
因此O的渐近线可以确定一条与x轴平行的直线。
当x→O1时, OA线与x轴的交点为O,此时O与x 轴有无穷远点的距离,为零。
所以, O→O1是圆的渐近线。
O是过原点的圆上一动点,其绝对值的绝对值小于0,但大于1。
O的绝对值随着x增大而减小,这说明O在x轴上。
O的纵坐标的绝对值随着x增大而增大,这说明O在x轴上有最大正值。
对于任何一个过原点的圆, O的纵坐标的绝对值都在这个圆内。
渐进式数学符号
“渐进式数学符号”可能是指一种逐步引入和解释数学符号或概念的方法。
这种方法通常是为了帮助初学者更好地理解和掌握数学符号,通过逐步加深难度和复杂性,逐步引入更高级的数学符号和概念。
渐进式数学符号的方法可以通过以下方式实现:
1.初始阶段:从最简单的数学符号和概念开始介绍,例如整数、小数、分数
等。
2.逐步引入:随着学生理解和掌握先前介绍的符号和概念,逐步引入更复杂
的数学符号和概念,例如代数式、方程式、函数等。
3.实例和应用:通过实例和应用来解释数学符号和概念,帮助学生更好地理
解其意义和应用。
4.练习和巩固:通过大量的练习和巩固来帮助学生熟练掌握数学符号和概念。
渐进式数学符号的方法可以帮助学生在学习过程中逐步建立自信心和兴趣,并且更好地掌握数学知识和技能。
具体来说,渐进式数学符号包括以下内容:1.基本的数学符号:如加号(+)、减号(-)、乘号(×)、除号(÷)、等
号(=)等。
2.代数符号:如代数式、方程式、不等式等。
3.函数符号:如函数符号(f(x))及其相关概念,如函数的定义域、值域等。
4.数学运算符:如指数、根号、绝对值等。
5.三角函数符号:如正弦(sin)、余弦(cos)、正切(tan)等。
6.其他符号:如向量、矩阵、行列式等。
总之,渐进式数学符号是一种逐步引导学习者理解和掌握数学知识和技能的方法,通过逐步加深难度和复杂性,帮助学生建立自信心和兴趣,提高数学水平。
数学距离变化符号
数学中常用的距离变化符号有以下几种:
1. Δ(大写希腊字母 delta),表示两个数值之间的差异或变化。
例如,Δx表示x的变化量,Δy表示y的变化量。
2. ∆(小写希腊字母 delta),与大写Δ类似,用于表示差异或变化。
例如,∆t表示时间的变化量。
3. ∂(小写希腊字母 delta),表示偏微分。
在多元函数中,∂表示对某个变量的偏导数。
例如,∂f/∂x表示函数f对变量x 的偏导数。
4. | |(绝对值符号),表示取绝对值。
例如,|x|表示数x的绝对值。
5. || ||(双竖线符号),表示向量的范数或模。
例如,||v||表示向量v的模。
6. d(微分符号),表示微分运算。
例如,dx表示对变量x的
微分。
7. △(三角形符号),表示相对变化率。
例如,如果x的初始值为x1,最终值为x2,则△x = (x2 x1) / x1 表示x的相对变化率。
这些符号在数学中用于描述数值的变化、差异、导数、绝对值以及向量的范数等概念。
它们有助于精确地表示数学关系和运算。
大O符号是计算机科学中常用的符号,用于表示算法的时间复杂度和空间复杂度。
它是在分析算法效率和性能时非常重要的工具,可以帮助我们理解算法在不同输入规模下的表现,并进行比较和评估。
一、大O符号的定义大O符号是一种用数学方式描述算法渐进复杂度的表示法。
在计算机科学中,我们通常用大O符号来描述算法的最坏情况下的时间复杂度。
其定义如下:如果存在正常数 c 和 n0,使得当n≥n0 时,对于函数 f(n) 和 g(n),总有0≤f(n)≤cg(n),那么我们可以称 f(n) 是 O(g(n)) 的。
这个定义可以直观地理解为,当输入规模足够大时,函数 f(n) 的增长将不会超过函数 g(n) 的增长的某个倍数。
二、大O符号的作用1. 衡量算法性能大O符号可以帮助我们衡量和比较不同算法的性能,从而找到最优的解决方案。
通过分析算法的时间复杂度和空间复杂度,我们可以选择最适合特定问题的算法。
2. 预测算法性能通过大O符号,我们可以在没有实际运行程序的情况下对算法的性能进行预测。
这对于评估算法在不同输入规模下的表现非常有帮助,可以为系统设计和优化提供指导。
3. 优化算法使用大O符号分析算法的时间复杂度和空间复杂度,可以帮助我们发现算法中的瓶颈和不足之处,进而进行针对性的优化工作,提高算法的效率和性能。
三、大O符号的常见时间复杂度1. O(1):常数时间复杂度。
无论输入规模的大小,算法的执行时间都是常数。
例如:直接访问数组元素、执行一个简单操作。
2. O(log n):对数时间复杂度。
算法的执行时间与输入规模的对数大小成正比。
例如:二分查找算法。
3. O(n):线性时间复杂度。
算法的执行时间与输入规模成正比。
例如:线性查找算法、遍历数组。
4. O(n log n):线性对数时间复杂度。
算法的执行时间与输入规模的对数倍成正比。
例如:归并排序、快速排序等。
5. O(n^2):平方时间复杂度。
算法的执行时间与输入规模的平方成正比。
§1.3 渐近符号
设)(n T 是算法A 的复杂性函数。
一般说来,当n 单调增加趋于∞时,)(n T 也
将单调增加趋于∞。
如果存在函数)(~n T ,使得当∞→n 时有
0)(/))(~)((→-n T n T n T ,则称)(~n T 是)(n T 当∞→n 时的渐近性态,或称)(~n T 是
算法A 当∞→n 的渐近复杂性。
因为在数学上,)(~n T 是)(n T 当∞→n 时的渐近
表达式,)(~n T 是)(n T 中略去低阶项所留下的主项,所以它无疑比)(n T 来得简单。
进一步分析可知,要比较两个算法的渐近复杂性的阶不相同时,只要确定出各自的阶,就可以知道哪一个算法的效率高。
换句话说,渐近复杂性分析只要关
心)(~n T 的阶就够了,不必关心包含在)(~n T 中的常数因子。
所以,我们常常有对
)(~n T 的分析进一步简化,即假设算法中用到的所有不同的运算(基本)各执行一次所需要的时间都是一个单位时间。
综上分析,我们已经给出了简化算法复杂性分析的方法和步骤,即只考虑当问题的规模充分大时,算法复杂性在渐近意义下的阶。
为此引入渐近符号,首先给出常用的渐近函数。
常 用 的 渐 进 函 数
在下面的讨论中,用f(n)表示一个程序的时间或空间复杂性,它是实例特 征n (一般是输入规模)的函数。
由于一个程序的时间或空间需求是一个非负的实数,我们假定函数f(n)对于n 的所有取值均为非负实数,而且还可假定n>=0。
渐近符号O 的定义:f(n)=O(g(n))当且仅当存在正的常数c 和
n 0,使得对于所有的n>=n 0,有f(n)<=cg(n)。
此时,称g(n)是f(n)的一个上界。
函数f 至多是函数g 的c 倍,除非0n n <。
即是说,当n 充分大时,g 是f 的一个上界函数,在相差一个非零常数倍的情况下。
通常情况下,上界函数取单项的形式,如表1所列。
C 0=O(1): f(n) 等于非零常数的情形。
3n+2=O(n): 可取c =4,n 0=2。
100n+6=O(n): 可取 c=101,n 0=6。
10n 2+4n+3=O(n 2): 可取
6×2n +n 2=O(2n ): 可取c =7,n 0=4.
3×log n + 2×n + n 2 =O(n 2).
n ×log n +n 2=O(n 2).
3n+2=O(n 2).
三点注意事项:
1. 用来作比较的函数g(n)应该尽量接近所考虑的函数f(n).
3n+2=O(n 2
) 松散的界限;3n+2=O(n) 较好的界限。
2. 不要产生错误界限。
n 2+100n+6,当n<3时,n 2+100n+6<106n ,由此就认为n 2+100n+6=O(n). 事实上,对任何正的常数c ,只要n>c-100就有n 2+100n+6>c ×n 。
同理,3n 2+4×2n =O(n 2)是错误的界限。
3. f(n)=O(g(n))不能写成g(n)=O(f(n)),因为两者并不等价。
实际上,这里的等号并不是通常相等的含义。
按照定义,用集合符号更准确些: O(g(n))={f(n)|f(n)满足:存在正的常数c 和n 0,使得当n>=n 0时,f(n)<=cg(n)}
所以,人们常常把f(n)=O(g(n))读作:“f(n)是g(n)的一个大O 成员”。
大O 比率定理:对于函数)(n f 和)(n g ,如果极限))(/)((lim n g n f n ∞
→存在,则))(()(n g O n f =当且仅当存在正的常数c ,使得 c n g n f n ≤∞
→))(/)((lim . 证明:略。
例子 ,所以)(23n O n =+;
,所以)(241022n O n n =++; ,所以)2(2*62n n O n =+; ,所以)2(*3216n O n n =+, 但是这不是一个好的上界估计,问题出在极限值不是正的常数。
下述不等式对于复杂性阶的估非常有帮助:
定理2.3.1. 对于任意一个正实数x 和ε,有下面的不等式:
1) 存在某个0n 使得对于任何0n n ≥,有ε+<x x n n )(log )(log 。
2) 存在某个0n 使得对于任何0n n ≥,有n n x <)(log 。
3) 存在某个0n 使得对于任何0n n ≥,有ε+<x x n n 。
4) 存在某个0n 使得对于任何0n n ≥,有n x n 2<。
5) 对任意实数y ,存在某个0n 使得对于任何0n n ≥,有ε+<x y x n n n )(l o g 。
例子 根据定理1,我们很容易得出:)(log 323n O n n n =+ ;)(log 4205.24n O n n n =+;)2(log /2log 253534n O n n n n n n n =+。