
发表日期: 2021-04-13 09:10:24 浏览次数:118
邢台网站推广【邢台办理400电话】邢台SEO优化、邢台微信公众号APP客户端小程序开发、邢台网站托管、邢台APP开发
邢台,简称“邢”,古称邢州、顺德府,是河北省地级市,河北省政府批复确定的京津冀城市群节点城市、河北省级历史文化名城、冀中南先进制造业基地和物流枢纽 [1] 。截至2020年,全市下辖4个区、12个县、代管2个县级市。 [2] 总面积12400平方千米,市区建成区面积214.84平方千米,常住人口739.52万人,城镇人口401.04万人,城镇化率54.23%。 [3-5]
邢台地处中国华北地区、河北南部,境内京广、京九铁路,京广、京九高铁,京港澳、大广、太行山高速纵贯南北;邢和、邢黄铁路,邢衡、邢汾、邢临、青银高速横贯东西,与邢台国际内陆港、邢台机场构成了“东出西联、南承北接”的交通枢纽。 [6]
邢台拥有3500余年建城史,距今五万至十万年前就有人类栖息繁衍,历史上曾四次建国、五次定都,有“五朝古都、十朝雄郡”之称,是华夏版图上建城历史排名第三的城市 [7] ,华北历史上第一座城市,中国最早的古都之一,历经三千多年行政建制未曾中断、城址未曾迁移。邢台古城是黄河以北地区建城最早的“第一古城”,被誉为“燕赵第一城”。 [8]
邢台悠久的历史涌现出郭守敬、李牧、宋璟、刘秉忠等先贤,走出了郭威、柴荣、孟知祥、孟昶等帝王,千古一帝秦始皇东巡途中驾崩于邢台沙丘 [9-10] 。 邢台也是唐朝皇室祖籍地(唐祖陵) [11-14] ,发生过尧舜禅让、胡服骑射、巨鹿之战、黄巾起义等影响中国历史进程的事件,有破釜沉舟、鹿死谁手、民脂民膏、腹背受敌等近百条成语、典故源自邢台。
正如我们在3.4节中看到的,通过舍弃一些常数因子和低阶项,可以简化大O表达式。我们将会看到,在分析程序时,作出这样的简化有多重要。一般来说,某个程序的运行时间来源于程序中很多不同的语句或程序段,而一小部分程序占用大量运行时间的情况也很平常(由“90-10”法则可知)。通过舍弃一些低阶项,并将相等或近似相等的项结合起来,通常能大大简化表示运行时间的大O表达式。
首先,我们要拿出考虑大O表达式时的一个实用规则。诸如≤这样的关系,就被称为传递的,因为它遵循“若A≤B,且B≤C,则A≤C”这样的法则。例如,因为3≤5,5≤10,所以我们可以确定3≤10。
而“是f的大O”这样的关系是另一种具有传递性的关系。也就是说,如果f(n)是O(g(n)),而且g(n)是O(h(n)),就有f(n)是O(h(n))。要知道原因,首先假设f(n)是O(g(n))。那么存在证物n1和c1,使得对所有的n≥n1,都有f(n)≤c1g(n)。类似地,如果g(n)是O(h(n)),就存在证物n2和c2,使得对所有的n≥n2,都有g(n)≤c2h(n)。
多项和指数大O表达式
多项式的次数是指多项式所有项中的最高指数。例如,示例3.3和示例3.5中提到的多项式T(n)的次数为5,因为其最高阶项为3n5。从我们已经阐明的两个原则(常数因子不产生影响,以及低阶项不产生影响),以及大O表达式的传递律,可知以下几点。
1. 如果p(n)和q(n)都是多项式,且q(n)的次数大于等于p(n)的次数,就有p(n)是O(q(n))。
2. 如果q(n)的次数小于p(n)的次数,那么p(n)不是O(q(n))。
3. 指数式是指形如an的表达式(其中a>1)。指数式要比多项式增长得更快。也就是说,我们可以为任一多项式p(n)证明,p(n)是O(an)。例如,n5是O((1.01)n)。
4. 反过来,对a>1,不存在指数式an为多项式p(n)的O(p(n))。
设n0是n1和n2二者中的较大值,而且令c=c1c2。我们声称n0和c为“f(n)是O(h(n))”这一事实的证物。这里假设n≥n0。因为n0=max(n1,n1),所以我们知道n≥n1且n≥n2。因此,f(n)≤c1g(n),且g(n)≤c2h(n)。
现在用c2h(n)替换不等式f(n)≤c1g(n)中的g(n),就证明了f(n)≤c1c2h(n)。该不等式就证明了f(n)是O(h(n))。
从示例3.3中可知
T(n)=3n5+10n4-4n3+n+1
是O(n5),还可以从规则“常数因子不产生影响”中知道n5是O(0.01n5)。通过大O的传递律,可知T(n)是O(0.01n5)。
我们之前对程序的运行时间T(n)的定义是,程序处理大小为n的任意输入所耗费时间单位的最大值。我们还说过,要确定T(n)的准确公式,就算不是不可能,也将非常困难。通常,可以用大O表达式O(f(n))作为T(n)的上限,从而将问题大大简化。
例如,SelectionSort程序的运行时间T(n)的上限是an2,其中a是某个常数,而且n≥1,我们将在3.6节中展示这一事实。然后可以说SelectionSort的运行时间是O(n2)。从直觉上讲,这一陈述是最为实用的,因为n2是个非常简单的函数,而且有关其他简单函数的更强陈述(比如“T(n)是O(n)”)都为假。
不过,因为大O表示法的本性,还可以说运行时间T(n)是O(0.01n2),或O(7n2-4n+26),或者是任何二次多项式的大O。原因在于,n2是任意二次式的大O,而根据传递律,就可以从T(n)是O(n2)这一事实得出T(n)是任意二次式的大O。
更糟的是,n2还是任意三次或更高次多项式,或者是任意指数式的大O。因此,再次利用传递性,T(n)是O(n3),O(2n+n4),等等。不过我们将会解释,为什么O(n2)是表示SelectionSort程序的运行时间的首选。
首先,我们一般都想要达到可以证明的“最紧”大O上界。也就是说,如果T(n)是O(n2),我们就想作出这一表述,而不是作出“T(n)是O(n3)”这种技术上正确但更弱的表述。另一方面,这种方式又存在某种疯狂性,因为如果我们喜欢用O(n2)作为运行时间的表达式,就应该更喜欢O(0.5n2),因为它更“紧凑”,而对O(0.01n2)的喜爱应该就更甚了。不过,因为在大O表达式中,常数因子是不产生影响的,所以通过缩小常数因子让预估运行时间“更紧凑”的尝试是没有意义的。因此,只要有可能,我们就会试着使用常数因子为1的大O表达式。
图3-4列出了一些比较常见的程序运行时间,以及它们的非正式名称。特别要注意,O(1)是表示“某个常数”的惯用简写形式,而且我们还将反复使用这种用意的O(1)。
大O | 非正式名称 |
|---|---|
O(1) | 常数 |
O(logn) | 对数 |
O(n) | 线性 |
O(n logn) | n logn |
O(n2) | 二次 |
O(n3) | 三次 |
O(2n) | 指数 |
图 3-4 一些常见大O运行时间的非正式名称
更精确地讲,如果同时满足如下两点
1. T(n)是O(f(n));
2. 如果T(n)是O(g(n)),那么f (n)是O(g(n))也为真(通俗地讲,我们找不出这样一个函数g(n),它至少与T(n)增长得一样快,却又比f (n)增长得慢)。
那么我们就说f (n)是T(n)的紧大O边界(tight big-oh bound)。
设T(n)=2n2+3n,而且f (n)=n2。我们说,f (n)是T(n)的紧边界(tightbound)。要知道为什么,先假设T(n)是O(g(n))。然后,存在常数c和n0,使得对所有的n≥n0,有T(n)=2n2+3n≤cg(n)。那么对n≥n0,有g(n)≥(2/c)n2。因为f (n)是n2,所以可得出,对n≥n0,有f (n)≤(c/2)g(n)。因此,f (n)是O(g(n))。
另一方面,f (n)=n3不是T(n)的紧大O 边界。现在可以选择g(n)=n2。我们已经看到,T(n)是O(g(n)),不过不能证明f (n)是O(g(n)),因为n3不是O(n2)。因此,n3不是T(n)的紧大O 边界。
在我们选择大O边界时,另一个目标就是函数表达式的简单性。与紧凑性不同,简单性有时候是种偏好问题。不过,一般还是可以按照如下标准认定函数f (n)是简单的:
1. 它只有一项;
2. 这项的系数是1。
int PowersOfTwo(int n)
{
int i;(1) i = 0;(2) while (n%2 == 0) {(3) n = n/2;(4) i++;
}(5) return i;
}复制代码图 3-5 计算一个正整数n 中因数2的数量
函数n2是简单的,2n2则不是简单的,因为系数不为1;而n2+n也不是简单的,因为它包含了两项。
不过,也存在某些情况,其中大O 紧凑性的上界和简单性的边界是相互冲突的目标。简单性边界并不能说明一切,以下就是一个例子,好在这样的情况在现实中很少出现。
考虑一下图3-5中的PowersOfTwo函数,它会接受一个正参数n,并计量n 被2整除的次数。也就是说,第(2)行的测试询问n是否为偶数,如果是,就在第(3)行的循环体中删除一个因数2。同样在这次循环中,我们递增i,而参数i的作用是计量我们从n原本的值中删除的因数2的个数。
设输入的大小就是n 本身的值。while循环的循环体由两条语句组成,即第(3)行和第(4)行,因此可以说执行该循环体一次所需的时间为O(1),也就是某个与n无关的不变时间量。如果该循环要执行m次,那么花在执行循环上的总时间就将是O(m),或者是某个与m成比例的时间量。为单独执行第(1)行和第(5)行,以及进行第一次while循环条件的测试(从技术上讲不属于任何循环迭代的一部分),还要在这个量上加上O(1)或者某个常数。因此,该程序消耗的时间是O(m)+O(1)。根据低阶项可被忽略的规则,这一时间就是O(m),除非m=0,此时这个时间就是O(1)。换个说法就是,在输入n上所花的时间与1加上2整除n的次数是成比例的。

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878