《零基础学算法》—— 第1章 基础算法思想

本文介绍了编程中的核心概念——算法的思想,包括递推、枚举、递归、分治、贪婪、试探等算法的基本思想及应用场景,帮助读者理解并掌握算法设计的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 编程的灵魂:数据结构 + 算法

编程 = 数据结构 + 算法 + 程序设计语言

1.3 递推算法思想

  • 顺推法:Fibonacci数列(小兔子繁殖问题)
  • 逆推法

1.4 枚举算法思想

需要满足两个条件:

  • 可预先确定候选答案的数量
  • 候选答案的范围在求解之前必须有一个确定的集合

1.5 递归算法思想

一般有三个要求:

  • 每循环调用一次,求解问题的规模都有所缩小,即将求解问题化为一个缩小了的子问题
  • 相邻两次循环之间有紧密的联系,前一次要为后一次做准备(通常,前一次的输出就作为后一次的输入)
  • 当子问题的规模极小时,应该能直接给出答案而不再进行递归调用(必须有一个结束递归的条件),因而每次递归调用都是有条件的,无条件递归调用会使程序死循环而不能正常结束(最终导致堆栈溢出)

综上,有几点需要注意:

  • 必须有一个明确的递归结束条件,成为递归出口
  • 递归算法接替通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序
  • 在递归调用的过程中,系统每一次递归调用的返回点、局部量等保存在系统的堆栈中,当递归调用的次数太多时,就可能造成堆栈溢出

实例:求阶乘、数制转换

1.6 分治算法思想

一般具有以下特征的问题可以使用分治法来求解:

  • 求解问题可以分解为若干个规模较小的相同问题
  • 求解问题的规模分解到一定的程度,就能够很容易的求解
  • 合并子问题的解可以得到求解问题的解
  • 有求解问题所分解出的各个子问题是互相独立的

分治与递归算法经常同时应用在算法设计之中:分解--求解--合并

1.7 贪婪算法思想

贪婪算法总是做出在当前看来是最好的选择。不从整体最优考虑,选择局部最优选择。大多情况下,贪婪算法即使不能得到整体最优解,但其最终结果却非常近似最优解。贪婪算法是一种不追求最优解,只希望得到较为满意解的方法。贪婪算法一般可以快速得到满意得解,因为它省去了为找最优解要穷尽所有可能而必须耗费大量的时间。所以贪婪算法不要回溯。

使用贪婪算法时,通常采用自顶向下的方法来解,每一步都使用最贪婪的选择,使原问题变为一个相似的、规模更小的问题。

贪婪算法基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的求得更好的解。当到达算法中的某一步不能再继续前进时,该算法停止,给出近似解。

该算法存在以下问题:

  • 不能保证最后的解是最优的
  • 不能用来求最大或最小解问题
  • 只能求满足某些约束条件的可行解得范围

例如,在超市购物,收银员找补零钱时,为使零钱纸币张数最少,不考虑找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才考虑下一种较小面值的币种。

1.8 试探算法思想

也成回溯法,是一种系统地搜索问题解得方法。基本思想史:为了求得问题的解,先选择某一种可能情况进行探测,在试探过程中,一旦发现原来的选择的假设情况是错误的,就退回一步,重新选择,继续向前探测,如此反复,直至得到解或证明无解。

例如,在棋手思考下一步该走哪里时,首先试想下一步棋的位置,计算对手的应对,再计算自己的应对,若对手的应对于我不利,则取消下一步的设想,然后重新计算下一步棋的位置。这是一步试探法。再如,迷宫求解。

1.9 模拟算法

计算机程序在与人的交互中经常会出现一些不能创建数学模型,也不能使用前面介绍的各种算法求解的问题。这是,课使用计算机来模拟生成日常生活中的相关数据,来分析相应的数据。例如,可用计算机模拟跑硬币得到正反面概率的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值