计算机算法:算法与算法分析
计算机算法的设计与分析

计算机算法的设计与分析计算机算法是计算机科学中非常重要的概念,它是解决问题和完成任务的步骤和规则。
在计算机科学领域,算法的设计与分析被广泛应用于各种领域,如数据结构、人工智能、图像处理等。
本文将重点探讨计算机算法的设计与分析,并介绍一些常见的算法。
一、算法的定义和特点算法是指解决问题的有限步骤序列,其中每个步骤具有明确的目标和执行顺序。
算法的设计与分析是通过选择和组合适当的数据结构和算法,以解决实际问题和优化计算性能。
合理设计的算法应具备以下特点:1. 正确性:算法能够解决问题,并给出正确的结果。
2. 可读性:算法的结构和步骤清晰易懂,容易被其他人理解和阅读。
3. 高效性:算法的执行时间和所需资源尽可能少,以提高计算效率。
4. 通用性:算法能够适用于不同规模和类型的问题,并具有良好的扩展性。
二、算法的设计方法在设计算法时,可以采用不同的方法和策略。
下面介绍几种常见的算法设计方法:1. 分治法:将大问题划分成若干个相同或类似的小问题,逐个解决小问题,最后将结果合并。
2. 动态规划:将复杂问题划分成一系列相互联系的子问题,通过解决子问题来求解原问题。
3. 贪心算法:每次选择当前看起来最优的策略来解决问题,不考虑后续可能产生的影响。
4. 回溯法:采用试错的思想,尝试所有可能的答案,当发现不满足条件时,进行回溯重新尝试。
5. 随机算法:通过随机选择的方式求解问题,时间复杂度通常较高。
三、算法的复杂性分析算法的复杂性分析是评估算法的执行时间和所需资源的一种方法。
一般来说,常用的复杂性分析有时间复杂性和空间复杂性。
1. 时间复杂性:衡量算法执行所需的时间。
常见的时间复杂性表示方法有大O记法,表示算法执行时间的上限。
2. 空间复杂性:衡量算法执行所需的额外内存空间。
常见的空间复杂性表示方法也是大O记法,表示算法所需额外内存空间的上限。
通过复杂性分析,可以选择适当的算法来解决特定问题,并评估算法的性能。
四、常见的算法以下是几种常见的计算机算法:1. 排序算法:包括冒泡排序、选择排序、插入排序、快速排序等,用于按照一定规则对数据进行排序。
计算机算法设计与分析

计算机算法设计与分析计算机算法设计与分析在计算机科学领域扮演着重要的角色。
它是研究和开发高效算法的过程,以解决各种计算问题。
在本文中,我们将探讨算法设计与分析的基本原理、常见算法类型以及算法分析的重要性。
一、算法设计与分析的基本原理算法设计的目标是开发一种能够解决特定问题的步骤序列。
这些步骤应该是明确的、非歧义的,并且能够在有限的时间内产生预期的结果。
为了实现这一目标,算法设计需要考虑以下几个主要原理:1. 问题抽象:将实际问题转化为计算机能够理解和处理的抽象形式。
这涉及到定义输入和输出,以及建立问题的数学模型。
2. 分解与合成:将复杂问题分解为更简单的子问题,然后将子问题的解合并成原始问题的解。
这种分解与合成的过程可以提高算法的可读性和效率。
3. 数据结构选择:选择适当的数据结构来存储和操作问题的输入和输出。
不同的数据结构对于不同的问题具有不同的性能和效率。
4. 控制结构设计:设计算法控制结构,如循环、条件语句和递归等,以实现预期的计算过程。
二、常见的算法类型在算法设计与分析中,有各种各样的算法类型可供选择。
以下是一些常见的算法类型:1. 排序算法:排序算法用于按照一定的规则对数据进行排序。
常见的排序算法包括冒泡排序、插入排序、选择排序、归并排序和快速排序等。
2. 搜索算法:搜索算法用于查找指定数据的位置或者判断数据是否存在。
常见的搜索算法包括线性搜索、二分搜索和哈希搜索等。
3. 图算法:图算法用于处理图数据结构上的问题。
常见的图算法包括最短路径算法、最小生成树算法和拓扑排序算法等。
4. 动态规划算法:动态规划算法用于解决一些最优化问题,它通过将问题分解为子问题,并利用已解决的子问题的解来解决原始问题。
三、算法分析的重要性算法分析是评估算法性能和效率的过程,它对于算法设计与分析至关重要。
通过对算法进行分析,我们可以了解算法的时间复杂度、空间复杂度和性能边界等关键指标。
这些指标可以帮助我们选择最适合特定问题的算法,并预测算法在不同输入情况下的表现。
计算机算法的设计与分析

计算机算法的设计与分析计算机算法的设计和分析随着计算机技术的不断发展,算法成为了关键的核心技术之一。
算法的设计和分析是指通过一系列的步骤和方法来解决计算机问题的过程。
本文将详细介绍计算机算法的设计和分析。
一、算法设计的步骤:1. 理解和定义问题:首先需要明确所要解决的问题,并对其进行深入的理解,确定问题的输入和输出。
2. 分析问题:对问题进行分析,确定问题的规模、特点和约束条件,以及可能存在的问题解决思路和方法。
3. 设计算法:根据问题的性质和特点,选择合适的算法设计方法,从而得到解决问题的具体算法。
常见的算法设计方法包括贪心算法、分治算法、动态规划算法等。
4. 实现算法:将步骤3中设计的算法转化为计算机程序,并确保程序的正确性和可靠性。
5. 调试和测试算法:对实现的算法进行调试和测试,包括样本测试、边界测试、异常输入测试等,以验证算法的正确性和效率。
二、算法分析的步骤:1. 理解算法的效率:算法的效率是指算法解决问题所需的时间和空间资源。
理解算法的时间复杂度和空间复杂度是进行算法分析的基础。
2. 计算时间复杂度:时间复杂度用来表示算法解决问题所需的时间量级。
常用的时间复杂度包括常数时间O(1)、对数时间O(logn)、线性时间O(n)、平方时间O(n^2)等。
3. 计算空间复杂度:空间复杂度用来表示算法解决问题所需的空间资源量级。
常用的空间复杂度包括常数空间O(1)、线性空间O(n)、指数空间O(2^n)等。
4. 分析算法的最坏情况和平均情况:算法的最坏情况时间复杂度和平均情况时间复杂度是进行算法分析的关键指标。
最坏情况时间复杂度表示在最不利条件下算法所需的时间量级,平均情况时间复杂度表示在一般情况下算法所需的时间量级。
5. 比较算法的优劣:通过对不同算法的时间复杂度和空间复杂度进行分析,可以对算法的优劣进行比较,从而选择合适的算法。
三、常见的算法设计与分析方法:1. 贪心算法:贪心算法通过每一步的选择来寻求最优解,并且这些选择并不依赖于其他选择。
算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。
本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。
二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。
具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。
实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。
三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。
- 实现顺序搜索和二分搜索算法。
2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。
3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。
4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。
- 多次重复同样的操作,取平均值以减小误差。
5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。
四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。
- 插入排序:执行效率一般,在中等规模数据排序中表现良好。
- 快速排序:执行效率最高,适用于大规模数据排序。
2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。
- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。
实验结果表明,不同算法适用于不同规模和类型的问题。
正确选择和使用算法可以显著提高程序的执行效率和性能。
五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。
计算机算法设计与分析代码

计算机算法设计与分析代码计算机算法设计与分析是计算机科学领域中非常重要的一门课程,它涉及到了算法的设计、实现和性能分析等方面。
在本文中,我将首先介绍算法设计与分析的概念和重要性,然后详细讨论几个常用的算法设计技巧,并给出相应的代码实现示例。
算法设计与分析是指在解决实际问题时,选择合适的算法思想和设计方法,通过对算法的正确性、效率和可靠性等方面进行分析,以找到最优的算法解决方案。
一个好的算法设计可以极大地提高程序的运行效率和质量,从而更好地满足用户的需求。
在算法设计与分析中,有许多常用的算法设计技巧和方法,例如贪心算法、分治算法、动态规划算法和回溯算法等。
下面我将以几个具体的例子来说明这些算法设计技巧的应用。
首先是贪心算法。
贪心算法是一种简单而高效的算法思想,它在每一步选择中都采取当前最优的选择,从而希望能够达到全局最优解。
一个经典的例子是找零钱问题。
假设有一定面值的货币和一个需要找零的金额,我们的目标是用最少数量的货币来找零。
下面是贪心算法的代码实现示例:```def make_change(coins, amount):coins.sort(reverse=True)num_coins = 0for coin in coins:while amount >= coin:amount -= coinnum_coins += 1if amount == 0:return num_coinselse:return -1```接下来是分治算法。
分治算法将一个大问题划分成多个小问题,分别解决小问题后再将结果合并起来,从而得到最终的解。
一个经典的例子是归并排序。
归并排序将一个数组分成两个部分,分别对两个部分进行排序,然后将两个有序的部分合并起来。
下面是归并排序的代码实现示例:```def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = arr[:mid]right = arr[mid:]left = merge_sort(left)right = merge_sort(right)return merge(left, right)def merge(left, right):result = []i=0j=0while i < len(left) and j < len(right): if left[i] < right[j]:result.append(left[i])i+=1else:result.append(right[j])j+=1while i < len(left):result.append(left[i])i+=1while j < len(right):result.append(right[j])j+=1return result再来是动态规划算法。
计算机算法设计五大常用算法的分析及实例

计算机算法设计五⼤常⽤算法的分析及实例摘要算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
也就是说,能够对⼀定规范的输⼊,在有限时间内获得所要求的输出。
如果⼀个算法有缺陷,或不适合于某个问题,执⾏这个算法将不会解决这个问题。
不同的算法可能⽤不同的时间、空间或效率来完成同样的任务。
其中最常见的五中基本算法是递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法。
本⽂通过这种算法的分析以及实例的讲解,让读者对算法有更深刻的认识,同时对这五种算法有更清楚认识关键词:算法,递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法AbstractAlgorithm is the description to the problem solving scheme ,a set of clear instructions to solve the problem and represents the describe the strategy to solve the problem using the method of system mechanism . That is to say, given some confirm import,the Algorithm will find result In a limited time。
If an algorithm is defective or is not suitable for a certain job, it is invalid to execute it. Different algorithms have different need of time or space, and it's efficiency are different.There are most common algorithms: the recursive and divide and conquer、dynamic programming method、greedy algorithm、backtracking、branch and bound method.According to analyze the five algorithms and explain examples, make readers know more about algorithm , and understand the five algorithms more deeply.Keywords: Algorithm, the recursive and divide and conquer, dynamic programming method, greedy algorithm、backtracking, branch and bound method⽬录1. 前⾔ (4)1.1 论⽂背景 (4)2. 算法详解 (5)2.1 算法与程序 (5)2.2 表达算法的抽象机制 (5)2.3 算法复杂性分析 (5)3.五中常⽤算法的详解及实例 (6)3.1 递归与分治策略 (6)3.1.1 递归与分治策略基本思想 (6)3.1.2 实例——棋盘覆盖 (7)3.2 动态规划 (8)3.2.1 动态规划基本思想 (8)3.2.2 动态规划算法的基本步骤 (9)3.2.3 实例——矩阵连乘 (9)3.3 贪⼼算法 (11)3.3.1 贪⼼算法基本思想 (11)3.3.2 贪⼼算法和动态规划的区别 (12)3.3.3 ⽤贪⼼算法解背包问题的基本步骤: (12)3.4 回溯发 (13)3.4.1 回溯法基本思想 (13)3.3.2 回溯发解题基本步骤 (13)3.3.3 实例——0-1背包问题 (14)3.5 分⽀限界法 (15)3.5.1 分⽀限界法思想 (15)3.5.2 实例——装载问题 (16)总结 (18)参考⽂献 (18)1. 前⾔1.1 论⽂背景算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
并行计算算法设计与分析

并行计算算法设计与分析一、引言在现代计算机系统中,并行计算已经成为一种重要的技术手段。
并行计算算法的设计与分析是研究并行计算的核心内容之一。
本文将详细介绍并行计算算法的设计与分析方法,并讨论其在实际应用中的意义与挑战。
二、并行计算算法的分类1. 数据并行算法数据并行算法采用将计算任务分割为多个子任务,每个子任务在不同的处理单元上并行执行的方式。
典型的数据并行算法包括矩阵乘法算法、并行排序算法等。
2. 任务并行算法任务并行算法是将计算任务分解为多个相互独立的子任务,并行执行的方式。
各个子任务之间没有数据依赖关系,可以同时进行计算。
典型的任务并行算法包括并行搜索算法、并行图算法等。
3. 流水线并行算法流水线并行算法是将计算任务分解为多个阶段,不同处理单元在不同阶段上并行执行,通过流水线的方式提高计算效率。
典型的流水线并行算法包括多级缓存机制的并行计算算法、指令级并行计算算法等。
三、并行计算算法的设计方法1. 并行分解并行分解是指将原始的计算任务分解为多个子任务的过程。
在并行分解过程中,需要考虑任务的划分方式、任务之间的依赖关系以及负载均衡等问题。
2. 并行通信并行通信是指多个处理单元之间的信息传递与同步。
在并行计算算法的设计中,合理的并行通信方式能够提高计算效率。
常用的并行通信方式包括消息传递接口MPI、共享内存等。
3. 并行合并并行合并是指将多个子任务的计算结果合并为最终的结果的过程。
在并行合并过程中,需要考虑合并方式以及结果的正确性验证等问题。
四、并行计算算法的分析方法1. 速度up与加速比速度up表示并行计算与串行计算相比的计算速度提升程度。
加速比表示并行计算中处理单元数量增加时,计算速度相对于串行计算的提升比例。
通过对速度up与加速比的分析,可以评估并行算法的性能优劣。
2. 并行性的度量与评估并行性是指并行计算中各个子任务可以同时进行的程度。
通过对并行性的度量与评估,可以确定并行计算算法的最佳并行度。
计算机算法设计与分析(第5版)第1章

算法渐近复杂性
• T(n) , as n ; • (T(n) - t(n) )/ T(n) 0 ,as n; • t(n)是T(n)的渐近性态,为算法的渐近复杂性。 • 在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶
问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
算法复杂性分析
• 算法复杂性 = 算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
项留下的主项。它比T(n) 简单。
渐近分析的记号
• 在下面的讨论中,对所有n,f(n) 0,g(n) 0。 • (1)渐近上界记号O • O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
0 f(n) cg(n) } • (2)渐近下界记号 • (g(n)) = { f(n) | 存在正常数c和n0使得对所有n n0有:
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
• Tavg(n) = p(I )T (I ) size(I )n
•
for x > -1,
x ln(1 x) x 1 x
•
for any a > 0,
Hale Waihona Puke log b nlim
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法与算法分析计算机与算法有着不可分割的关系,可以说,没有算法就没有计算机,计算机无法独立于算法而存在,因此算法被誉为计算机的灵魂。
但是,算法不一定依赖于计算机而存在。
算法可以是抽象的,实现算法的主体可以是计算机,也可以是人。
只是多数时候,很多算法对于人来说过于复杂,计算工作量太大且常常重复,人脑难以胜任,算法就通过计算机来实现。
1.算法的概念日常生活中到处都在使用算法,例如,到商店购物,首先确定要购买的东西,然后进行挑选、比较,最后去付款,这一系列活动就是购物的“算法”。
算法就是解决问题的方法和步骤。
方法不同,对应的步骤自然也不一样。
算法设计时,首先应该考虑采用什么方法,确定后再考虑具体的求解步骤。
所以,通常把解题过程准确而完整的描述称为解该问题的算法。
进一步说,程序就是用计算机语言表达的算法,流程图就是图形化了的算法。
程序的目的是加工数据,而如何加工数据是算法的问题。
程序是算法与数据结构的统一。
算法是对事物本质的数学抽象,看似深奥却体现着点点滴滴的朴素思想。
因此,学习和研究算法能锻炼思维,使思维变得更加清晰、更有逻辑,对日后的学习和生活都会产生深远的影响。
【例1】交换两瓶墨水。
有一瓶红墨水、一瓶蓝墨水,现要求把原来装红墨水的瓶子改装蓝墨水,把原来装蓝墨水的瓶子改装红墨水。
【解】这个问题的解决办法是找一个空瓶子来倒腾一下,算法(也就是解决问题的步骤)如下:第一步:将红墨水倒入空瓶子中;第二步:将蓝墨水倒入原来装红墨水的瓶子中;第三步:将已倒入空瓶子中的红墨水倒入原来装蓝墨水的瓶子中;第四步:结束。
以上算法是用自然语言来写的,容易理解,但比较繁琐。
如果用变量a表示装有红墨水的瓶子,变量b表示装有蓝墨水的瓶子,变量t表示空瓶子,用符号“←”表示把一个变量的值放入另一个变量中(此处指把一个瓶子中的墨水倒入另一个瓶子中),那么上述算法表示如下:t ←aa ←bb ←t这就是常用的两个变量交换的算法,这样的算法简洁、明了。
【例2】求s = a + aa + aaa + aaaa + ...... 的值。
其中,a是一个数字(0≤a ≤9),n是最后一项中a的个数(n ≽1),a和n的值从键盘输入。
例如,若a = 7,n = 5,则s = 7+77+777+7777+77777。
【解】 这是一个求n 个数据项累加的问题,当输入n 的值后,算法可以用确定循环次数的循环结构实现。
设置一个存储累加和的变量s ,其初值为0;设置循环控制变量i 表示求和的项数(i ≤n );设置数据项为t ,其初值为0,在重复执行的循环体中逐次将t * 10 + a 的值累加到变量s 中。
算法流程图如图1所示。
图1 例2的流程图YN开始t ←0, s ←0i ←1t ←t*10 + ai ←i+1输出s 结束i ≤n 输入a,n s ←s +t由以上例子可以看出,一个算法由一些操作组成,这些操作是按一定的控制结构所规定的次序执行的。
这些操作包括:①逻辑运算:与、或、非;②算术运算:加、减、乘、除;③数据比较:大于、小于、等于、不等于;④数据传送:输入、输出、赋值。
算法中的每一步都必须能分解成这些基本操作,否则算法是不可行的。
算法的功能不仅取决于所选用的操作,还取决于各操作之间的执行次序,即控制结构。
任何复杂的算法都可以用顺序、选择、循环三种控制结构组合而成。
用流程图可以形象地表示出算法的控制结构。
2.算法的基本特性著名计算机科学家Knuth把算法的性质归纳为以下五点。
(1)有穷性(Finiteness)一个算法必须在执行有穷步之后结束,即任何算法必须在有限时间内完成。
算法的执行步数是有限的,解必须在有限步内得到,不能出现“死循环”,任何不会终止的算法都是没有意义的。
算法执行时间应该合理,这种合理性应该具体问题具体分析。
如果一个算法在计算机上要运行上千年,那就失去了实用价值,尽管它是有穷的。
(2)确定性(Definiteness)组成算法的每个步骤都是确定的、明确无误的。
也就是说,算法中的每一步必须有确切的含义,理解时不能产生二义性,不能模棱两可,不能含糊不清。
例如,生活中假定照着菜谱学做菜,这道菜的做法是这样的:第一步:锅中放入少许油,加花椒爆香;第二步:放入切好的肉片,煎炒到适当的时候放水;第三步:煮沸时,加入少量调味品;第四步:淋入适量香油,出锅。
生活中可以按照这样的菜谱做菜,但让计算机执行这样的“算法”就不行,因为其中有“少许”、“适当”、“少量”、“适量”等不确定性的词汇。
如果把这个菜的做法看成一个“算法”,那么这个算法是不满足确定性的。
(3)可行性(Effectiveness)算法中的每一步操作都应是可以执行的,或者都可以分解成计算机可执行的基本操作。
典型的、不可行的操作如下:①“公鸡下蛋”式的操作:比如以0做分母,即便在数学中也是不可行的。
②想当然的操作:例如算法中某一步要求方程f(x)=0的根。
计算机只是帮助人们计算,至于如何计算这是算法设计者或程序员的事,也就是说,如果我们不知道怎么求解一个问题,计算机也无能为力。
但像两个变量交换这样的算法步骤“A⇔B”是可行的,因为它可以分解成下面三个可执行的基本操作“T⇐A,A⇐B,B⇐T”。
(4)输入(Input)算法开始前,允许有若干个输入量,也可以没有输入量。
(5)输出(Output)每种算法必须有确定的结果,产生一个或多个输出。
否则,“只开花不结果”的算法是没有意义的。
可见,算法是一个过程,这个过程由一套明确的规则组成,这些规则制定了一个操作的顺序,以便用有限的步骤提供特定类型问题的解答。
3.算法的表示(描述)面对一个待求解的问题,求解的方法首先源于人的大脑,经思考、论证而产生。
算法表示(描述)就是把这种大脑中求解问题的方法和思路用一种规范的、可读性强的、容易转换成程序的形式(语言)描述出来。
算法描述出来是为了交流和共享,一是提交给程序设计人员,作为编写程序代码的依据,二是供算法研究、设计与学习用。
经过多年的研究和实践,描述算法大致有4种方法。
(1)自然语言自然语言就是我们生活中所使用的语言,如汉语、英语等。
用自然语言描述算法的特点是熟悉、方便和容易理解。
【例3】求3个数中值最大的一个。
算法用自然语言可描述如下:第一步:输入3个数a、b、c;第二步:如果a>=b,则将a放到max中,否则将b放到max中;第三步:如果c>=max,则将c放到max中;第四步:输出max,即为三个数中最大的一个。
此例中设置了一个变量max,用于存放两个数比较后的值较大的数。
【例4】输入一个大于1的正整数,求出该数的所有因数并输出。
算法用自然语言可描述如下:第一步:输入一个大于1的正整数n;第二步:依次以1、2、3、4…n-1、n为除数去除n;第三步:依次检查余数是否为0,若为0,则是n的因数;若不为0,则不是n的因数;第四步:输出n的所有因数。
用自然语言描述算法,其缺点和不足也相当明显,主要表现在以下三个方面。
①易产生歧义。
自然语言往往要根据上下文才能判别其含义,书写没有严格的标准,只有人类才能理解和接受。
②语句比较繁琐冗长,并且很难清楚地表达算法的逻辑流程。
如果算法中包含判断、循环处理,尤其是这些处理的嵌套层数增多,自然语言描述其流程既不直观又很难表达清楚。
③自然语言表示的算法不便翻译成计算机程序设计语言。
因此,自然语言常用于粗略地描述某个算法的大致情况。
(2)计算机语言计算机语言是一种人工语言,即人为设计的语言,如Pascal、VB、C、C++等。
用计算机语言来描述算法,得到的结果既是算法也是程序,直接可以上机运行。
【例5】求三个数中最大的数。
【解】用C语言描述的算法如下:#include <stdio.h>main(){int x,y,z,max;scanf(“%d,%d,%d”,&x,&y,&z);if(x>y)max=x;elsemax=y;if(z>max)max=z;printf(“最大值为:%d\n”,max);}计算机语言的语法非常严格,描述出来的过程过于复杂,对于学习算法设计的初学者来说,过早陷入程序设计语言的语法泥潭,难以抓住问题的本质。
此外,计算机语言很多,且各有特点,到底用哪一种语言来描述算法,把算法变成程序又用哪一种语言,都要根据具体情况来分析。
(3)图形化工具为了形象地描述算法,人们设计了许多专用的图形工具来描述算法,即以一种比较直观的方法展示算法的操作流程,如流程图、N-S图等。
流程图是使用最早的算法和程序描述工具。
它符号简单,表现直观、灵活(例如可用箭头线来表示程序中的goto操作),不依赖于任何具体的计算机和计算机程序设计语言。
由于流程线可以比较随意地跳转,很容易出现不符合结构化设计原则的现象,并且对于功能较复杂的算法,绘制流程图的规模会过于庞大,绘制过程也会过于繁杂,影响对算法的阅读理解。
N-S图也被称为盒图。
1973年,美国学者I. Nassi 和B. Shneiderman提出了一种在流程图中完全去掉流程线,全部算法写在一个矩形框内,在框内还可以包含其他框的流程图形式,称为N-S结构流程图(以两个人的名字的头一个字母组成)。
它比文字描述直观、形象、易于理解;比传统流程图紧凑易画,尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,不可能出现流程无规律的跳转,而只能自上而下地顺序执行,表示的算法都是结构化的算法。
但因为完全取消了“跳转”,可能使某些情况下简单的处理过程复杂化了。
【例6】 计算10!【解】 用流程图和N-S 图描述如下:图2 例6的流程图和N-S 图(4)伪代码为了避免自然语言的含混不清和防止歧义性,人们往往采用意义准确唯一且已形式化的类计算机语言来描述算法。
伪代码是一种介于自然语言和程序设计语言之间的代码,它表述Y N开始n ←1i ←2n ←n * i i >10i ←i+1输出n结束n ←1i ←2i ≤10n ←n * i输出n简洁、结构清晰、易于阅读。
伪代码不拘泥于程序设计语言的具体语法和实现细节,着重以灵活的形式表现被描述对象。
程序设计语言中一些与表达算法关系不大的部分往往被伪代码省略了,如变量定义等。
有时调用某些函数或处理简单任务也用一句自然语言代替,并不给出具体实现过程,如“找出3个数中的最大数”。
由于伪代码在语法结构上的随意性,目前并不存在一个通用的伪代码语法标准。
人们以某些高级程序设计语言为基础,例如Pascal、C、C++等,经简化后进行伪代码的编写,这种编写出来的语言称为“类Pascal语言”、“类C语言”等。
【例7】输入一个年份,判断是否为闰年,并输出结果。
算法主体用伪代码描述如下:scanf ( y );if (((y mod 4=0) and (y mod 100≠0)) or (y mod 400=0))printf (y”是闰年”);elseprintf (y”不是闰年”);【例8】输入3个数,判断能否构成三角形。