C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 基础

    • 算法基础 - 常见算法和比较
    • 算法基础 - 复杂度分析
  • 常见算法

    • 排序 - 冒泡排序
    • 排序 - 选择排序
    • 排序 - 插入排序
    • 排序 - 希尔排序
    • 排序 - 归并排序
    • 排序 - 快速排序
    • 排序 - 堆排序
    • 排序 - 计数排序
    • 排序 - 桶排序
    • 排序 - 基数排序
  • 领域算法

    • 领域算法 - 布隆过滤器
  • 分布式算法

    • 分布式算法 - 分布式一致性算法Raft

算法基础 - 常见算法和比较

  • 递推和递归的比较
  • 暴力递归和动态规划

参考资料

  • 最常用的五种算法设计思想
  • 八大算法基础思想

算法思想

  • 穷举法

    • 列出问题所有可能解的情况,从中搜索正确答案。
  • 分治算法

    • 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
  • 递推算法

    • 从已知的条件出发,逐步推算出问题的解。每一次推导的结果可以作为下一次推导的开始,这似乎跟迭代、递归的思想有点类似,不过递推的范畴要更广一些。
  • 递归算法

    • 把问题转化成规模更小的同类子问题,先解决子问题,再通过相同的求解过程逐步解决更高层次的问题,最终获得最终的解。即在函数或者子过程的内部,直接或间接的调用自己算法。
    • 递归调用分为两种情况:
      • 直接递归,即在方法中调用方法本身
      • 间接递归,即间接地调用一个方法
  • 动态规划算法

    • 每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
  • 贪心算法

    • 对问题求解时,保证每次操作都是局部最优的,并且最后得到的结果是全局最优的
  • 回溯算法

    • Backtracking(回溯)属于 DFS。实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
    • 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法
  • 模拟算法

    • 许多真实场景下,由于问题规模过大、变量过多等因素,很难将具体的问题抽象出来,也就无法针对抽象问题的特征来进行算法的设计。这个时候,模拟思想或许是最佳的解题策略。
    • 模拟的过程就是对真实场景尽可能的模拟,然后通过计算机强大的计算能力对结果进行预测。这相较于上述的算法是一种更为宏大的思想。在进行现实场景的模拟中,可能系统部件的实现都需要上述几个算法思想的参与。

算法比较

递推和递归的比较

*「递」的理解可以是逐次、逐步。在递推中,是逐次对问题进行推导直到获得最终解。而在递归中,则是逐次回归迭代,直到跳出回归。

暴力递归和动态规划

暴力递归

  1. 把问题转化为规模小的同类问题的子问题;
  2. 有明确不需要继续进行递归的条件Cbase case);
  3. 有当得到了子问题的结果之后的决策过程;
  4. 不记录每一个子问题的解。

动态规划

  1. 从暴力递归中来;
  2. 将每一个问题的解记录下来,避免重复计算;
  3. 将暴力递归的过程,抽象成状态表达;
  4. 并且存在化简状态表达,使其更加间洁的可能。

先写出尝试版本,分析可变参数,哪些参数可以表示子返回状态,即几个可变参数,生成几维表,把终止状态在表中写出来,回到base case中不依赖的位置填好,普遍位置需要哪些位置还回去,就是填表顺序。

动态规划

通常用于解决计数、求最值、求存在性的问题。

  1. 确认状态
  2. 转移方程
  3. 初始条件和边界情况
  4. 计算顺序
Last Updated:
Contributors: klc407073648
Next
算法基础 - 复杂度分析