发表日期: 2021-04-10 16:24:44 浏览次数:143
沧州小程序制作【沧州企业邮箱】沧州网站外包、沧州微信商城开发、沧州网店美工、沧州淘宝设计
沧州市,河北省地级市,地处河北省东南部、河北平原东部的黑龙港流域,位于北纬37°29′~38°57′,东经115°42′~117°50′之间。东部滨临渤海,北部与天津、廊坊接壤,西部及西南部与保定、衡水毗邻,南隔漳卫新河与山东省的滨州、德州相望。
沧州市因濒临渤海而得名,市中心北距天津市120千米、北京市240千米,西南距省会石家庄220千米。沧州市辖2个市辖区,4个县级市,10个县及沧州渤海新区、沧州经济开发区、沧州高新技术产业开发区,总面积1.4万平方公里。 [1-3]
2020年10月,入选河北省第一批新型智慧城市建设试点名单。
从示例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
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878