发表日期: 2021-03-27 16:01:49 浏览次数:90
常宁申请400电话费用【常宁企业全国热线电话办理】常宁开通400电话电信价格、常宁微信公众号代运营外包托管、常宁网店编辑装修美工、常宁网站推广优化大概需要多少钱
常宁,隶属湖南省,是由衡阳市代管的县级市。位于湖南省南部、湘江中游南岸,东隔舂陵水与耒阳市为界,南与郴州市桂阳县相连,西与永州市祁阳县接壤,北濒湘江与祁东县、衡南县二县相望。2020年,常宁下辖14个镇、4个乡、5个街道。境内地势南高北低,大致呈两级阶梯形分布,属亚热带季风性湿润气候。地处北纬26°07'至26°36',东经112°07'至112°41'之间。面积2046.6平方千米 [1] 。
常宁为中国油茶之乡 [2] 、杉木楠竹之乡 [3] 、公交免费城市 [4] 、全国第二批商务综合行政执法试点县级城市 [5] 、全国第三批资源枯竭城市 [6] 。
2018年,常宁市地区生产总值(GDP)331.93亿元,常住人口80.5万人。 [7]
2018年10月22日,入选2018年全国农村一二三产业融合发展先导区创建名单。 [8] 2019年1月9日,凭借版画入选2018—2020年度“中国民间文化艺术之乡”名单。 [9] 天堂山-西江风景区被评为省级风景名胜区。 [1]
2019年3月6日,中央宣传部、财政部、文化和旅游部、国家文物局《中央宣传部 财政部,文化和旅游部,国家文物局关于公布《革命文物保护利用片区分县名单(第一批)》的通知》常宁市名列其中。 [10] 2021年1月29日,入选湖南省人民政府公布的2020年度真抓实干成效明显的地区名单。
在本章中,我们将介绍以下主要概念。
迭代程序设计(2.2节)。
归纳证明(2.3节和2.4节)。
归纳定义(2.6节)。
递归程序设计(2.7节和2.8节)。
证明程序的正确性(2.5节和2.9节)。
除此之外,通过这些概念的例子,我们还会着重介绍计算机科学中一些有趣的重要思想。其中包括:
排序算法,包括选择排序(2.2节)和归并排序(2.8节)。
奇偶校验及数据错误的检测(2.3节)。
算术表达式及其代数变形(2.4节和2.6节)。
平衡圆括号(2.6节)。
新手程序员都会学习使用迭代,采用某种循环结构(如C语言中的for
语句和while
语句)。在本节中,我们将展示一个迭代算法的例子——“选择排序”。在2.5节中,我们还将通过归纳法证明这种算法确实能排序,并会在3.6节中分析它的运行时间。在2.8节中,我们要展示如何利用递归设计一种更加高效的排序算法,这种算法使用了一种称作“分而治之”的技巧。
常见主题:自定义和依据-归纳
在学习本章时,大家应该注意到有两个主题贯穿多个概念。第一个是自定义(self-definition),就是指概念是依据其自身定义或构建的。例如,我们提到过,表可以定义为空,或一个元素后跟一个表。
第二个主题是依据-归纳(basis-induction)。递归函数通常都含有某种针对不需要递归调用的“依据”实例,以及需要一次或多次递归调用的“归纳”实例进行测试。众所周知,归纳证明包括依据和归纳步骤,归纳定义也一样。依据-归纳这一对非常重要,在后文中每次出现依据情况或归纳步骤时,都会突出标记这些词语。
运用恰当的自定义不会出现悖论或循环性,因为自定义的子部分总是比被定义的对象“更小”。此外,在经过有限个通向更小部分的步骤后,就能到达依据情况,也就是自定义终止的地方。例如,表L 是由一个元素和比L 少一个元素的表构成的。当我们遇到没有元素的表,就有了表定义的依据情况:“空表是表”。
再举个例子,如果某递归函数是有效的,那么从某种意义上讲,某一函数调用的参数必须要比调用该函数的函数副本的参数“更小”。还有,在经过若干次递归调用后,我们必须要让参数“小到”函数不再进行递归调用为止。
要排序具有n个元素的表,我们需要重新排表中的元素,使它们按照非递减顺序排列。
假设有整数表{3,1,4,1,5,9,2,6,5}。我们要将其重新排列成序列{1,1,2,3,4,5,5,6,9},实现对该表的排序。请注意,排序不仅会整理好各值的顺序,使每个元素的值小于等于接下来那个元素的值,而且不会改变每个值出现的次数。因此,排序好的表中有两个1和两个5,而原表中只出现一次的数字都只有一个。
只要表的元素有“小于”的顺序可言,也就是具备我们通常用符号<表示的关系,就可对这些元素排序。例如,如果这些值是实数或整数,那么符号<就表示实数或整数的小于关系;如果这些值是字符串,就按字符串的词典顺序来排列(“词典顺序”的介绍详见下文附注栏)。有时候,当元素比较复杂,比如当元素是结构体时,就可能使用每个元素的一部分(比如某个特定字段)来进行比较。
词典顺序
要比较两个字符串,通常是依据它们的词典顺序进行比较的。假设c1c2…ck和d1d2…dm是两个字符串,其中每个c 和每个d 都只代表一个字符。字符串的长度k 和m 不一定是相同的。我们假设对字符而言也有<顺序,例如,在C语言中,字符就是小的整数,所以字符常量和字符变量可以在算术表达式中作为整数使用。因此,我们可以使用整数间惯有的<关系,区分两个字符中哪个字符“小于”另一个字符。这种顺序包含这样一个自然的概念,出现在字母表靠前位置的小写字母,要“小于”出现在字母表中靠后位置的小写字母,同样的道理对大写字母也成立。
这样我们可以将字符串的这种顺序称为字典、词典或字母表顺序,如下所示。如果以下任意一条成立的话,我们就说c1c2…ck< d1d2…dm 。
1. 第一个字符串是第二个字符串的真前缀(proper prefix),这表示k< m,而且对i =1,2,…,k而言,都有ci =di。根据这条规则,就有
bat<batter
。作为这条规则的特例,可能有k=0,这样第一个字符串就不含任何字符。我们用希腊字母ε 表示空字符串这种不含字符的字符串。当k=0时,规则(1)表示对任何非空字符串s 而言,都有ε<s。2. 对某个i>0的值,两个字符串的前i-1个字符都相同,但第一个字符串的第i 个字符要小于第二个字符串的第i 个字符。也就是说,对j=1, 2, …, i-1,都有cj =dj,而且cj < dj。根据这条规则,
ball<base
,因为这两个单词是从第3个字母起开始不同的,而ball
的第三个字母是l
, 要比base
的第三个字母s
更小。
a≤b这一比较关系总是表示,要么a< b,要么a 和b 具有相同的值。如果a1≤a2≤…≤an,也就是说,如果这些值有着非递减顺序,那么我们就说表(a1, a2, …, an)是已排序的。排序是这样一种操作,它接受任意表(a1, a2, …, an),并生成满足如下条件的表(b1, b2, …, bn)。
1. 表(b1, b2, …, bn)是已排序的;
2. 表(b1, b2, …, bn)是原表的排列。也就是说,表(a1, a2, …, an)中的每个值出现的次数,和那些值出现在(b1, b2, …, bn)中的次数是一模一样的。
排序算法接受任意的表作为输入,并生成对输入进行过排列的已排序表作为输出。
考虑base
,ball
,mound
,bat
,glove
,batter
这列单词。有了该输入,排序算法会按照词典顺序生成输出:ball
,base
,bat
,batter
,glove
,mound
。
假设要对一个具有n 个整数的数组A
按照非递减顺序排序。我们可以通过对这个步骤的迭代来完成该工作:找出尚不在数组已排序部分的一个最小元素1,将其交换到数组未排序部分的第一个位置。在第一次迭代中,我们在整个数组A[0..n-1]
中找出(“选取”)一个最小元素,并将其与A[0]
互换位置。2在第二次迭代中,我们从A[1..n-1]
中找出一个最小元素,并将其与A[1]
互换位置。继续进行这种迭代。在开始第i+1次迭代时,A[0..i-1]
已经是将A
中较小的i 个元素按照非递减顺序排序了,而数组中余下的元素则没有特定的顺序。在第i+1次迭代开始前数组A
的状态如图2-1所示。
1这里说“一个”最小元素是因为最小值可能出现多次。如果是这样,找到任何一个最小值就行了。
2为了描述数组中某个范围内的元素,我们采用了Pascal语言中的约定。如果A是数组,那么A[i..j]
就表示数组A中下标从i 到j 这个范围内的那些元素。
图 2-1 在进行选择排序的第i+1次迭代前数组的示意图
对名字与值的约定
我们可以将变量视为具有名字和值的框。在提到变量时,比如
abc
,我们会使用等宽字体来表示其名字;在提到变量abc
的值时,我们会使用斜体字,如abc。总之,abc
表示框的名字,而abc则表示它的内容。
在第i+1次迭代中,要找出A[i..n-1]
中的一个最小元素,并将其与A[i]
互换位置。因此,在经过第i+1次迭代之后,A[0..i]
已经是将A
中较小的i+1个元素按照非递减顺序排序了。在经过第n+1次迭代之后,就完成了对整个数组的排序。
图2-2展示了用C语言编写的选择排序函数。这个名为SelectionSort
的函数接受数组A
作为其第一个参数。第二个参数n表示的是数组A
的长度。
void SelectionSort(int A[], int n) { int i, j, small, temp;(1) for (i = 0; i < n-1; i++) { /* 将small 置为剩余最小元素第一次出现时 的下标*/(2) small = i;(3) for (j = i+1; j < n; j++)(4) if (A[j] < A[small])(5) small = j; /* 到达这里时,small 是A[i..n-1] /* 中第一个最小元素的下标, */ /* 现在交换A[small]与A[i]。 */(6) temp = A[small];(7) A[small] = A[i];(8) A[i] = temp; } }复制代码
图 2-2 迭代的选择排序
第(2)到(5)这几行程序从数组未排序的部分A[i..n-1]
中选取一个最小元素。我们首先在第(2)行中将下标small
的值设为i。第(3)到(5)这几行的for
循环会依次考量所有更高的下标j,如果A[j]
的值小于A[i..j-1]
这个范围内的任何数组元素的值,那么就将small 置为j。这样一来,我们就将变量small
的值置为A[i..n-1]
中最先出现的那个最小元素的下标了。
在为下标small
选好值后,在第(6)到(8)行中,我们要将处于该位置的元素与A[i]
处的元素互换位置。如果small=i,交换还是会进行,只是对数组没有任何影响。请注意,要交换两个元素的位置,还需要一个临时的位置来存储二者之一。因此,我们在第(6)行将A[small]
里的值移到temp
中,并在第(7)行将A[i]
里的值移到A[small]
中,最终在第(8)行将原来A[small]
里的值从temp
移到A[i]
中。
常宁申请400电话费用【常宁企业全国热线电话办理】常宁开通400电话电信价格、常宁微信公众号代运营外包托管、常宁网店编辑装修美工、常宁网站推广优化大概需要多少钱
备案号: 苏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