
发表日期: 2021-04-13 09:20:01 浏览次数:148
邢台小程序制作【邢台企业邮箱】邢台网站外包、邢台微信商城开发、邢台网店美工、邢台淘宝设计
邢台,简称“邢”,古称邢州、顺德府,是河北省地级市,河北省政府批复确定的京津冀城市群节点城市、河北省级历史文化名城、冀中南先进制造业基地和物流枢纽 [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] ,发生过尧舜禅让、胡服骑射、巨鹿之战、黄巾起义等影响中国历史进程的事件,有破釜沉舟、鹿死谁手、民脂民膏、腹背受敌等近百条成语、典故源自邢台。
if-else选择语句具有如下形式:
if(<condition>)
<if-part>
else
<else-part>
其中
1. 条件是待评估的表达式;
2. if部分的语句只有在条件为真(表达式的值不为0)时才执行;
3. else部分的语句只有在条件为假(评估为0)时才执行,else后的<else-part>是可选的。
只要条件中没有函数调用,不管条件多么复杂,都只需要计算机执行一定量的基本操作。因此,条件评估所花的时间为O(1)。
假设在条件中没有函数调用,而且if部分和else部分分别具有大O上界f (n)和g(n)。还假设f (n)和g(n)不会都为0,也就是说,尽管else部分可能不存在,但if部分是不会为空的。我们将确定两部分都为空的时候会发生什么留作本节的习题。
如果f (n)是O(g(n)),那么可以将O(g(n))作为选择语句运行时间的上界。原因包括:
1. 可以忽略条件所花的时间O(1);
2. 如果else部分执行,就可知g(n)是运行时间的边界;
3. 如果if部分(而不是else部分)执行,那么运行时间将是O(g(n)),因为f (n)是O(g(n))。
类似地,如果g(n)是O(f (n)),就可以通过O(f (n))确定选择语句运行时间的边界。请注意,当else部分不存在时(情况也常常是这样),g(n)为0,就肯定是O(f (n))。
当f 和g之间不存在大O关系时,问题出现了。我们知道if部分或else部分肯定有一种要执行,但不可能都执行,所以运行时间的安全上界就是f (n)和g(n)中的较大者。正如我们在示例3.10中看到的,二者谁比较大可能取决于n。因此,要将选择语句的运行时间表示为O(max(f (n),g(n)))。
正如我们在示例3.12中看到的,图3-8中第(4)行和第(5)行是选择语句,其中第(5)行是if部分,所花时间为O(1),而不存在else部分(也就是所花时间为0)。因此,f (n)是1且g(n)是0。由于g(n)是O(f (n)),可以得出O(1)是第(4)行和第(5)行运行时间的上界。请注意,在第(4)行执行测试A[j]<A[small]的时间O(1)可以忽略。
图3-9所示的代码段是个更为复杂的例子,它执行的(相对无意义的)任务是将矩阵A置为0,或是将矩阵的对角线置为1。一如我们在示例3.13中所了解的,第(2)行至第(4)行的运行时间是O(n2),而第(5)行和第(6)行的运行时间是O(n)。因此这里的f (n)是n2,g(n)是n。因为n是O(n2)所以可以忽略else部分的时间,并将O(n2)作为图3-9中整个程序段运行时间的边界。也就是说,我们不知道第(1)行的条件是否将为真或者什么时候将为真,不过唯一安全的上界是从最坏的假设中得出的,即条件为真而且if部分执行了。
(1) if (A[1][1] == 0)(2) for (i = 0; i < n; i++)(3) for (j = 0; j < n; j++)(4) A[i][j] = 0; else(5) for (i = 0; i < n; i++)(6) A[i][i] = 1;复制代码
图 3-9 if-else选择语句的示例
前文已经提到,一系列赋值、读、写操作,每一次操作的时间都是O(1),总时间也是O(1)。一般的情况是,必须能将一系列语句(其中有一些是复合语句,也就是选择语句或循环)组合起来。这样一系列简单的复合语句就是程序块(block)。要计算程序块的运行时间,需要对程序块中每条(可能是复合的)语句的大O上界求和。好在可以使用求和规则消除和中的一些项。
在图3-8的选择排序程序段中,可以将外层循环的循环体(也就是第(2)行至第(8)行)视为一个程序块。该程序块由5条语句组成。
1. 第(2)行的赋值语句。
2. 第(3)行、第(4)行和第(5)行的循环。
3. 第(6)行的赋值语句。
4. 第(7)行的赋值语句。
5. 第(8)行的赋值语句。
请注意,第(4)和第(5)行的选择语句以及第(5)行的赋值在程序块这一级是不可见的,它们已经隐藏在更大的语句,也就是第(3)行至第(5)行的循环中了。
我们知道,4条赋值语句每条所花的时间都是O(1)。在示例3.14中,已经了解到该程序块中第2条语句(也就是第(3)行至第(5)行)的运行时间是O(n-i-1)。因此,该程序块的运行时间是:
O(1)+O(n-i-1)+O(1)+O(1)+O(1)
因为1是O(n-i-1)(回想一下,我们还推导出i从不会大于n-2),所以可以通过求和规则消除所有的O(1)项。因此,整个程序块的运行时间就是O(n-i-1)。
再看一个例子,考虑一下图3-7中的程序段。它可被视为由3条语句组成的单一程序块。
1. 第(1)行的读语句。
2. 第(2)行至第(4)行的循环。
3. 第(5)行和第(6)行的循环。
我们知道,第(1)行花的时间为O(1)。从示例3.13可知,第(2)行至第(4)行花的时间是O(n2),第(5)行和第(6)行花的时间是O(n)。所以整个程序块的运行时间就是:
O(1)+O(n2)+O(n)
根据求和规则,由O(n2)可以消去O(1)和O(n)。因此可以得出图3-7中程序段的运行时间为O(n2)。
在C语言中,有一些while循环、do-while循环和for循环并未提供显式的计数变量。对于这些循环,一部分分析工作就是要找到为循环迭代次数提供上界的参数。这些证明过程通常都遵循我们在2.5节中了解的模式。也就是说,通过对循环次数的归纳证明某个命题,而该命题表明在迭代次数达到某个限制后,循环条件一定会变为假。
我们还必须建立执行一次循环迭代所花时间的边界。因此,可以对循环体加以研究,并获得其执行的边界。为了实现这个目标,必须在循环体执行后加上测试条件的时间O(1),不过除非循环体不存在,否则我们都会忽略该O(1)项。通过用迭代次数的上界乘以一次迭代所花时间的上界,可以得到循环运行时间的边界。从技术上讲,如果该循环是for循环或while循环,而不是do-while循环,就必须将进入循环体之前第一次测试条件所需的时间包含在内。不过,这个O(1)经常是可以忽略掉的。
考虑如图3-10所示的程序段。该程序会搜索数组A[0..n-1],找出该数组中的元素x。
(1) i = 0;(2) while(x != A[i])(3) i++;复制代码
图 3-10 线性查找的程序段
图3-10中第(1)行和第(3)行的两条赋值语句的运行时间均为O(1)。第(2)和第(3)行的while循环可能会执行n次,但不会超过n次,因为我们假设x确实是数组元素之一。因为第(3)行的循环体所需时间为O(1),所以该while循环的运行时间就是O(n)。根据求和规则,整个程序段的运行时间为O(n),因为这是第(1)行的赋值语句以及整个while循环所花的最大时间。在第6章中,我们还将看到这种O(n)程序是如何被使用二叉查找的O(logn)程序所代替的。
1. 对开头为for (i = a; i <= b; i++)的for循环,用a 和b 的函数表示其循环次数。对开头为for (i = a; i <= b; i--)的for循环又是怎样表示的呢?对开头为for(i = a; i <= b; i = i+c)的for循环呢?
2. 给出某个普通的选择语句if(C) {} 运行时间的大O上界,其中C 是不涉及任何函数调用的条件。
3. 给出某个普通的while循环while(C ) {}运行时间的大O上界,其中C 是不涉及任何函数调用的条件。
4. * 给出C语言switch语句运行时间的规则。
5. 给出我们能确定哪条分支被执行的选择语句运行时间的规则,比如
if (1==2)
something O(f (n));else
something O(g(n));
6. 给出循环开始前条件已知为假的退化while循环(degenerate while-loop)运行时间的规则,比如
while (1 != 1)
something O(f (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