算法初步知识点.docx

上传人:b****1 文档编号:2407011 上传时间:2022-10-29 格式:DOCX 页数:17 大小:27.41KB
下载 相关 举报
算法初步知识点.docx_第1页
第1页 / 共17页
算法初步知识点.docx_第2页
第2页 / 共17页
算法初步知识点.docx_第3页
第3页 / 共17页
算法初步知识点.docx_第4页
第4页 / 共17页
算法初步知识点.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

算法初步知识点.docx

《算法初步知识点.docx》由会员分享,可在线阅读,更多相关《算法初步知识点.docx(17页珍藏版)》请在冰豆网上搜索。

算法初步知识点.docx

算法初步知识点

-----------------------Page1-----------------------

6.3算法基础

前面,我们讨论了程序设计中关于数据组织的问题。

对程序设计来说,另外一个重要的

问题是如何确定数据处理的流程,即确定解决问题的步骤。

这就是算法问题。

算法是一组确

定的解决问题的步骤。

它和机器以及语言并无关系,但最终还是需要使用特定的语言加以实

现。

6.3.1算法的概念

算法是计算机科学特别是软件设计中最具研究性质的。

在计算机科学中,算法是研究适

合计算机程序实现问题解决的方法,因此它是许多计算机问题的核心研究对象。

一般认为,算法是一组明确的、可以执行的步骤的有序集合。

“有序集合”说明算法中

的步骤是有顺序关系的。

算法中的每一步骤还必须是“明确的”,模棱两可的步骤不能构成

算法。

例如,“把变量x加上一个不太大的整数”。

这里“不太大的整数”就很不明确。

另外,

算法中的每一步骤还必须是“可执行的”。

这里所说的可执行不是一定要能被计算机所直接

执行,即它不一定直接对应计算机的某个指令。

但至少对阅读算法的人来说,相应步骤是有

效和可以实现的。

例如,“列出所有的正整数”就是不可执行的(有无穷多的)。

当我们使用计算机来解决问题的时候,有时会面临多种可能的解决途径。

而选择不同的

解决途径可能会有不同的问题求解效率。

如果是一个简单的问题,这种选择也许无关紧要;

但对大型问题,这种选择就是至关重要的。

如果被设计的程序需要机器运行数年、或至少数

GB以上的内存,那就看不出这个程序还有什么意义。

对于一些复杂的问题,例如对现实的

模拟过程,使用设计优良的算法使系统运行速度和性能得以成倍的提高是完全可能的。

所以,不管需要解决的问题是属于哪个应用领域,严谨的、合理的、高效的算法设计对

解决复杂问题是非常有意义的。

下面,我们来看一个简单的算法例子。

【例6.3】在一个从小到大顺序排好的整数序列中查找某一指定的整数所在的位置。

这是一个查找问题。

我们可以比较两种不同的查找方法。

[方法一]一种简单而直接的方法是按顺序查找,相应的查找步骤是:

1)查看第一个数。

2)若当前查看的数存在,则

若该数正是我们要找的数,则找到,查找过程结束;

若不是我们要找的数,继续查下一个数,重复2)步。

3)若当前查看的数不存在,则要找的数不在序列里,查找过程结束。

[方法二]二分查找法(或称折半查找法,binarysearch)。

由于序列中的整数是从小到大

排列的,所以可以应用此方法。

该方法的要点是,先比较序列中间位置的整数,如果与

要找的数一样,则找到;若比中间那个整数小,则只要用同样方法在前半个序列中找就

可以了;否则,在后半个序列中找。

相应查找步骤如下:

1)把含n个整数的有序序列设为待查序列S

2)若S不空,则取序列S中中间位置的整数,并设为middle。

若我们要找的数与middle一样,则找到,查找过程结束。

若我们要找的数小于middle,则将S设为middle之前的半段序列,重复2)。

若我们要找的数大于middle,则将S设为middle之后的半段序列,重复2)。

3)若S为空,则要找的数不在序列中,过程结束。

在上述两种方法中,顺序查找方法简单,但效率不高。

一般来说,若整数序列中整数的

·255·

-----------------------Page2-----------------------

个数为n,即平均要找n/2次才找到(若该数在序列中)。

而二分查找法虽然思路相对复杂,

但效率高。

通过分析可以知道,若要查找的数在个数为n的序列中,二分查找法平均花log2(n)

次左右的比较就可以找到。

当问题的规模(n)很大时,不同算法的效率就可以很明显地看

出来了。

例如,当n为100万时,顺序查找平均要比较50万次左右,而二分查找平均用20

次就够了(log2(100万)≈20)。

算法的时间效率不仅与算法本身有关,而且与问题的规模有关。

算法的时间效率与问题

规模的关系称为该算法的时间复杂性(timecomplexity)。

例如,对于顺序查找算法,一般我

们称其时间复杂性是问题规模的线性函数(与问题规模成正比增长),而二分查找法的时间

复杂性则是对数函数(log),因而它随问题规模变大而在算法时间的增长上并不是很快。

我们再来看一个数论方面的算法--计算最大公约数的欧几里德算法。

该算法大概可以被

认为是最古老的算法之一了。

【例6.4】求两个数的最大公约数(Gcd),即可以同时整除这两个数的最大整数。

例如

Gcd(50,15)=5。

假设两个整数为m和n,并且有m大于n(如果n大于m,则交换m和

n)。

欧几里德算法是通过连续运用以下等式,计算余数直到余数为0为止,最后非0的余数

就是最大公约数。

其中,mmoden代表m除以n的余数。

Gcd(m,n)=Gcd(n,mmoden)

例如,Gcd(50,15)=Gcd(15,5)=Gcd(5,0)=5

求Gcd(m,n)的算法可使用一个更加结构化的描述,分为3步:

1)如果n=0,返回m的值作为结果,同时过程结束;否则进入第2)步。

2)用m除以n,得到余数赋值给rem

3)将n的值赋给m,将余数rem赋给n,返回第1)步。

这个算法和数学中分别找到m、n的质因数到最后求得最大公约数的过程相比,欧几里

德算法在实现上要容易的多,而且更适合计算机的实现。

实际上,这个问题的算法是一个迭代过程。

一般情况下,一次迭代并不是按照一个常数

因子递减,能够证明在两次迭代以后,余数最多是原始值的一半,因此迭代次数至多是2logn。

这个算法还可以用于验证两个数互为素数的证明,例如Gcd(314159,271218)=1就

是证明了它们是互为素数。

就算法而言,它主要考虑的是问题求解的步骤或过程。

但若要把算法变成程序,还有许

多事情要做。

首先要考虑问题中数据的表达,例如对于前面用二分法求解查找问题的算法来

说,要考虑:

(1)如何表达整数序列(一般用数组);

(2)如何表达我们下一步要查找的范

围,即子序列S的范围(一般可用S的首、尾两个整数在数组中的下标来表示);(3)要查

找的数和S的中间整数(可各用一个变量)。

其次,要将算法过程用程序设计语言中的控制

语句来实现(最主要的是循环控制与条件控制语句)。

最后,要仔细设计与用户的交互(主

要是数据的输入与输出)。

在程序实现中,数据的组织(数据结构)与算法是密切相关的、互为依赖的。

好的数据

结构有可能会导致一个高效率的算法。

所以,Pascal之父、结构化程序设计的先驱Niklaus

Wirth就认为,“算法+数据结构=程序”。

6.3.2算法的表示

我们可以用多种方式来描述算法中解决问题的步骤,包括用自然语言、伪代码(pseudo

code)或流程图(flowchart)。

当然,程序本身也是对算法的一个精确的表达。

在前面的一些例子中,我们基本采用自然语言的方式来描述算法。

下面分别来介绍伪代

码和流程图的表示方法。

·256·

-----------------------Page3-----------------------

伪代码是一种主要应用符号、接近于程序形式的算法表示方法。

与程序相比,伪代码表

示主要关心算法的过程,而忽略程序中应有的一些细节(如变量定义等)。

目前,伪代码还

没有标准。

有些人使用得过细(基本接近于程序),有些人应用得过粗。

流程图是算法的图形表示法。

它使用大图的形式掩盖了算法的所有细节,只显示算法从

开始到结束的整个流程。

在流程图表示中,用箭头→表示各步骤处理的流程,用矩形代表各

处理步骤,用菱形代表处理的分支。

程序设计语言中最典型的三种控制结构可用流程图表示如下(图6.13)。

真假假

判断判断

语句i

语句模块语句模块

语句i+1ij

语句模块i

语句i+2

a)顺序结构b)分支结构c)循环结构

图6.13三种控制结构的流程图

前面,顺序查找的过程也可用以下流程图表示(图6.14)。

查看下一个数

不存在

下个数存在否

存在

当前数是否等

于所要找的数

找到,输出当前数位置未找到

结束

图6.14顺序查找

·257·

-----------------------Page4-----------------------

同样,二分查找算法也可以用以下流程图(图6.15)来表示。

初始化left、right为拟查找序列的首尾整数的下标;i=1;

left<=right

middle=(left+right)/2

x小x大

比较待查找数x与

middle对应数的大小

相等

left=middle+1返回middleright=middle+1

没找到,返回-1

图6.15二分查找法

6.3.3算法的设计

设计算法的目的是确定问题的求解步骤。

实际上,人们在设计算法求解问题时往往会自

觉或不自觉地采用一些问题的分析与求解策略。

这就是算法设计的思想或方法。

比较典型的

算法设计方法有:

贪心法、分治法、回溯法等。

1、贪心法(greedy)

贪心法(Greedy)背后隐藏的基本思想是从小的方案推广到大方案的解决方法。

它分阶

段工作,在每一个阶段总是选择认为当前最好的方案,而不考虑将来的后果。

所以,贪心法

只需随着过程的进行保持当前的最好方案。

这种“眼下能多占便宜的就先占着”的贪心者的

策略就是这类算法名称的来源。

用这种策略设计的算法往往比较简单,但不能保证求得的最后解是最佳的。

在许多情况

下,最后解即使不是最优的,只要它能够满足设计目的,这个算法还是具有价值的。

我们举一个经典的例子进一步说明贪心法的设计思路。

典型的贪心法的例子是找零钱问题:

如果有一些硬币,其面值有1角、5分、2分和1

分,要求用最少数量的硬币给顾客找某数额的零钱(如2角4分)。

贪心法的思路是:

每次选取最大面额的硬币,直到凑到所需要的找零数额。

如2角4分

的找零问题,首先考虑的是用“角”,共需要2个1角,还余4分;考虑5分,再考虑2分,

最后的结果是用2个1角2个2分。

当然,这种找零的方法不能保证最优。

例如,若硬币中有面值7分的硬币,现在要找1

角4分。

贪心法的结果是1个1角,2个2分;而实际上用2个7分就可以了。

另外,从一系列整数中挑选最大值的整数也可以用贪心法来做。

其设计思路是:

逐个查

看这一系列整数,先认为第一个是最大的,然后查看下一个;若新观察到的整数比已知最大

的整数还要大,则更新当前最大值,直到看完所有的整数。

这就相当于拿一箩筐苹果让你挑

一个

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1