算法简介

本文深入解析算法的定义,探讨算法的五大特性与设计目标,包括有穷性、确定性、可行性、输入与输出,以及正确性、健壮性、时间效率、空间效率和可读性。同时,阐述算法与数据结构的关系,强调算法建立在数据结构之上,对数据结构的操作需通过算法描述。

算法定义

曾获图灵奖的著名计算科学家D.knuth对算法做过一个为学术界广泛接受的描述性定义。

一个算法(Algorithm)是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列。

算法的规则必须满足以下5个特性:

  • ① 有穷性:对于任意一组合法的输入值,算法在执行有穷步骤之后一定能结束。即算法的操作步骤为有限个,且每步都能在有限时间内完成。
  • ② 确定性:对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。
  • ③ 可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。
  • ④ 有输入:算法有零个或多个输入数据。输入数据是算法的加工对象,既可以由算法指定,也可以在算法执行过程中通过输入得到。
  • ⑤ 有输出:算法有一个或多个输出数据。输出数据是一组与输入有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。

有穷性可行性是算法最重要的两个特征。

算法的设计目标

算法设计应满足以下5个目标:

  • ① 正确性:算法应确切地满足应用问题的需求,这是算法设计的基本目标。
  • ② 健壮性:即使输入数据不合适,算法也能做出适当处理,不会导致不可控结果。
  • ③ 高时间效率:算法的执行时间越短,时间效率越高。
  • ④ 高空间效率:算法执行时占用的存储空间越少,空间效率越高。
  • ⑤ 可读性:算法表达思路清晰,简洁明了,易于理解。

如果一个操作有多个算法,显然应该选择执行时间短和存储空间占用少的算法。但是,执行时间短和存储空间占用少有时是矛盾的,往往不可兼得,此时,算法的时间效率通常是首要考虑因素。

算法的描述

算法是对问题求解过程的描述,它精确地指出怎样从给定的输入信息得到要求的输出信息,其中操作步骤的语义明确,操作序列的长度有限。
用自然语言或伪码描述算法能够抽象地描述算法设计思想,但是计算机无法执行。因此,数据结构和算法实现需要借助程序设计语言,将算法表达成基于一种程序设计语言的可执行程序。

算法与数据结构

算法建立在数据结构之上,对数据结构的操作需要用算法来描述
例如,线性表和树都有遍历、插入、删除、查找、排序等操作。通过研究算法,能够更深刻地理解数据结构的操作。
算法设计依赖于数据的逻辑结构,算法实现依赖于数据的存储结构。
例如,线性表的插入和删除操作,采用顺序存储结构,由于数据元素是相邻存储的,所以插入前和删除后都必须移动一些元素;采用链式存储结构,插入或删除一个元素,只需改变相关结点的链接关系,不需移动元素。线性表(a0,a1,…,an-1)两种存储结构的插入操作如图1.6所示,插入x作为第i个元素,其中length表示数组容量。

实现一种抽象数据类型,需要选择合适的存储结构,使得以下两方面的综合性能最佳:

  • 对数据的操作所花费的时间短;
  • 占用的存储空间少。

对线性表而言,当不需要频繁进行插入和删除操作时,可采用顺序存储结构;当插入和删除操作很频繁时,可采用链式存储结构。

后记

算法的简介略微枯燥甚至感觉难以理解,不过先只要有个印象,不需要死记硬背

### 贪心算法与动态规划算法简介 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法[^1]。例如,在旅行推销员问题中,如果旅行员每次都选择最近的城市,这就是一种贪心算法的应用场景[^1]。 动态规划算法的核心在于将一个问题分解为若干个子问题,并通过存储子问题的解来避免重复计算,从而提高效率[^2]。与贪心算法不同的是,动态规划算法中的每一步选择通常依赖于相关子问题的解,而贪心算法则是基于当前状态下的局部最优选择进行决策[^2]。 #### 贪心算法的关键特性 贪心算法的可行性依赖于两个基本要素:**贪心选择性质****最优子结构性质**。其中,贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择来达到。这意味着在每一步中,算法只需关注当前状态下的最优选择,而无需考虑未来的决策或子问题的解。 #### 动态规划算法的关键特性 动态规划算法的核心思想是将复杂问题分解为更小的子问题,并通过递归或迭代的方式解决这些子问题。动态规划通常以自底向上的方式解决子问题,而贪心算法则以自顶向下的方式进行迭代选择[^2]。 #### 关于PDF文档下载 对于贪心算法动态规划算法简介,用户可以参考以下方法获取相关PDF文档: 1. 访问学术资源网站如Google Scholar、ResearchGate等,搜索关键词“Greedy Algorithm Introduction PDF”或“Dynamic Programming Introduction PDF”。 2. 在知名编程学习平台(如LeetCode、GeeksforGeeks)查找相关教程,并查看是否提供可下载的PDF版本。 3. 使用在线工具如PDF转换器,将网页内容保存为PDF格式。 以下是两个算法的简单实现示例: #### 贪心算法示例 ```python def activity_selection(start, finish): n = len(start) selected = [] i = 0 selected.append(i) for j in range(1, n): if start[j] >= finish[i]: selected.append(j) i = j return selected ``` #### 动态规划算法示例 ```python def fibonacci(n): if n <= 1: return n dp = [0] * (n + 1) dp[1] = 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值