目录

  • 1 算法概述
    • 1.1 PPT
    • 1.2 算法的基本概念
    • 1.3 算法分类(待优化)
    • 1.4 算法分析方法
    • 1.5 算法设计工具STL核心知识点
    • 1.6 微视频-算法时间复杂度分析
    • 1.7 C++ STL容器知识汇总
    • 1.8 练习题
  • 2 递归算法设计技术
    • 2.1 什么是递归
    • 2.2 练习题
  • 3 分治法 Divide & Conquer
    • 3.1 分治法概述
    • 3.2 分治法在组合问题中的应用
      • 3.2.1 棋盘覆盖问题
      • 3.2.2 最大子段和问题
      • 3.2.3 高精度乘法
    • 3.3 源代码
    • 3.4 练习题
    • 3.5 编程题
  • 4 蛮力法 Brute Method
    • 4.1 蛮力法概述
    • 4.2 图的深度优先和广度优先遍历
    • 4.3 源代码
    • 4.4 作业题
    • 4.5 编程题
  • 5 回溯法Back Tracking
    • 5.1 回溯法概述
    • 5.2 0/1背包问题
    • 5.3 n皇后问题
    • 5.4 源代码
    • 5.5 作业题
    • 5.6 编程题
  • 6 贪心法Greedy Algorithm
    • 6.1 贪心法概述
    • 6.2 求解背包问题
    • 6.3 求解活动安排问题
    • 6.4 TSP旅行商问题
    • 6.5 快乐司机C源码
    • 6.6 快乐司机C++源码
    • 6.7 作业题
    • 6.8 编程题
  • 7 分枝限界法
    • 7.1 分枝限界概述
    • 7.2 经典案例
    • 7.3 练习题
  • 8 动态规划Dynamic Programming
    • 8.1 动态规划概述
    • 8.2 兑零钱问题
    • 8.3 最长公共子序列问题
    • 8.4 源代码
    • 8.5 练习题
    • 8.6 编程题
  • 9 其他附加资料
    • 9.1 字节《算法中文手册》
    • 9.2 未分类作业
    • 9.3 未分类作业2
    • 9.4 未分类作业3
算法的基本概念

算法的五大特征

输入:算法有零个或多个输入量  
输出:算法至少产生一个输出量
确定性:算法的每一条指令都有确切的定义
可行性:算法的每一条指令都必须足够基本,可以通过已经实现的基本运算执行有限次实现
有穷性:算法必须总能在执行有限步之后终止

程序 = 算法

不等于,程序是算法用某种程序设计语言的具体实现,程序不一定满足算法的五大特征,如操作系统是一个无限循环中执行的程序,不满足有穷性,但操作系统的各种任务当成一个单独的问题来看,每一个问题的子程序都通过特定的算法来实现。

算法设计的目标

算法设计的目的是求解问题,设计目标应满足如下几个:
正确性:要求算法能够正确地执行预先规定的功能和性能要求。
可使用性:要求算法能够方便的使用。
可读性:算法易于人的理解,逻辑清晰,简单的,结构化的。
健壮性:算法具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查,不经常出现异常中断或死机现象。
高效率与低存储量需求:通常,算法的效率主要指算法的执行时间,对于同一个问题如果有多种算法可以求解,执行时间短的算法效率高。算法存储量指的是算法执行过程中所需的最大存储空间。效率和低存储都与问题的规模有关。

精确、启发、近似和随机算法?

精确算法:总能保证求得问题的解
启发式算法:通过使用某种规则、简化或智能猜测来减少问题求解时间
近似算法:致力于快速寻找近似解而不执着于最优解的算法
随机算法:执行过程中需要做出某些随机选择的算法

算法描述方法

自然语言描述、流程图、伪代码、程序设计语言等

算法性能与性能评价

指程序运行时所需的内存空间量和计算时间,包括系统开销和求解问题本身的开销。
评价方法:解析方法、实验测量方法(未必准确)

算法复杂度

算法复杂性是算法运行所需要的计算机资源的量,只依赖于算法所解问题的规模、算法的输入和算法本身的函数。
时间复杂度  :使用解析方法时程序 p 的时间复杂度表示为输入量的函数关系。
空间复杂度  :程序 p 运行时所需的内存空间大小和实例特征的函数关系。包括指令空间(与实例特征无关的常数)、数据空间(常量、简单变量、复合变量、环境栈空间等)、复合变量所需空间(与问题实例特征有关)。
最好复杂度:在最理想的情况下,算法的复杂度,常用于给出一个算法的计算时间的下界,用来否定一个算法
最坏复杂度:在最糟糕的情况下,算法的复杂度,当应用对计算时间/空间有严格要求时,应做最坏情形分析,考虑最坏时间/空间复杂度。
平均复杂度:加权平均情况下,算法的复杂度。

问题的难易因素

决策与优化问题:二者的复杂性近似等价

输入长度:输入实例的二进制编码长度(如 0/1背包问题和合数问题的伪多项式时间复杂度)

非确定性算法::产生与验证,获取证书的非确定性。注意与算法的确定性(指令执行的无歧义性)区别。

分类定义典例
易解问题存在一个多项式界的求解算法数组求和
难解问题不存在多项式界求解算法,即求解该问题算法的复杂性至少是指数级的旅行商问题
不可解问题不能被确定型图灵机求解的计算问题,即不存在任何算法能够求解的计算问题停机问题,对角论证法

NP-完全问题

NP-完全问题是算法中的一个重要概念





分类定义
P能够被确定性图灵机在多项式时间内求解的问题
NP有不确定的多项式界算法的判定问题,包含P类问题
NPH
(NP-hard)
所有NP类问题都可以多项式规约到NP-hard问题
NPC既是NP问题又是NP-hard问题

注:多项式规约记作X≤pY ,当且仅当存在一个多项式界的确定性算法 T,满足对 X 的每个输入实例 x 生成一个实例T(x)  , x 是 X 的合法输入实例且对应 yes答案  T(x)是 Y 的合法输入实例且对应 yes答案,意味着 X 至多和 Y 一样难。

算法分析

渐进分析

忽略掉 T(n)系数与低阶项, 仅关注高阶项(可用 Lim证明法)

渐进记号(重点)

  • 常用渐进比较(重点)

  • 常用渐进等式

操作计数法
基本操作的执行时间必须是常数 s

步(频率)计数法

程序步的执行时间必须是常数 s

五大算法

基本思想特点重点难点
贪心核心是最优化问题,在其限制条件和优化函数的作用下,使优化函数取得最佳值的可行解为最优解(贪心选择过程与性质)不一定能找到最优解k-优化贪心正确性证明
分治分:将大问题分成相同类型的小问题
治:小问题可以在常数时间内解决
合:已知小问题的解可以合并共同解出大问题的解
巧用递归\\
动态规划一个问题的解决方案是一系列子问题决策的决策的结果
每一步的决策都是循序渐进的,后进行的决策会受到先前决策的影响
最优子序列状态转移方程
回溯确认方案
\
回溯组织解空间内系统性的搜索,类比深度优先搜索(DFS),搜索并回溯尽所有活结点,则是搜索结束的标志。一个点有机会被多次激活为E-结点E-结点:当前所处的结点位置
活结点:可被再次转换为E-结点的结点
死结点:不能在被激活的结点
状态空间树、限界条件
对比分支限界,分清搜索结点顺序
分支限界根据活结点表的优先级对解空间进行被激活过的E-结点不可能再次被激活活节点表三种形式FIFO(队列)、LIFO(堆栈)、优先队列(堆)
状态空间树、限界条件
对比回溯,分清搜索结点顺序

对于经典算法的学习,主要基于五大类算法,对应到各种具体应用问题上,建议以以下模式学习

适用条件+算法分类+算法设计+算法分析+经典例题(理论)+代码实现+一般化扩展(引申出更多问题)