前沿
基于前面动态规划、贪心算法、深度搜索、广度搜索、分治算法的练习,已经初步对这些算法有个认识。但是在面对具体问题选用何种算法仍存在疑惑。下面梳理下这些算法的定义、区别和使用场景来帮助大家更有效巩固这些算法。
术语概念
自顶向下:将大问题分解为小问题,局部求解后得到整体求解的过程。
自底向上:从局部求解到整体求解的过程。
算法分类
7大搜索算法
https://blog.csdn.net/acuteeagle01/category_12660755.html#/
8大排序算法
https://blog.csdn.net/acuteeagle01/category_12659252.html#/
分治(自顶向下)
分治算法(Divide and Conquer)是一种通过将问题分解成较小的子问题,分别解决这些子问题,然后合并它们的解来解决原问题的算法设计范式。分治算法在许多经典算法中得到了广泛应用,如快速排序、归并排序、快速傅里叶变换等。
习题参考:
Java数据结构与算法(最大子数组和动态规划)-CSDN博客
动态规划(自底向上)
动态规划(Dynamic Programming, DP)是一种求解复杂问题的方法,通过将问题分解为更小的子问题来解决,并且每个子问题只解决一次,存储其结果以便在以后需要时直接查用。动态规划特别适用于有重叠子问题和最优子结构性质的问题
习题参考:
Java数据结构与算法(最大子数组和动态规划)-CSDN博客
Java数据结构与算法(最长回文子串动态规划)-CSDN博客
贪心
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优的选择,以期望最终能够得到全局最优解的方法。贪心算法通常用于解决最优化问题,比如最小生成树、最短路径等。在许多情况下,贪心算法可以得到全局最优解,但在某些情况下,它只能得到次优解。
习题参考:
Java数据结构与算法(leetcode热题881. 救生艇)-CSDN博客
Java数据结构与算法(买卖股票的最佳时机二贪心算法)-CSDN博客
回溯
回溯算法(Backtracking)是一种系统性地搜索问题解空间的算法,主要用于解决组合优化问题、约束满足问题以及其他需要探索所有可能解的场景。回溯算法通过构建解的每一步,并在发现当前解不满足条件时回退,逐步尝试所有可能的路径,以找到所有可行解或者最优解。
习题参考:
递归
递归算法是一种通过函数调用自身来解决问题的方法。它将一个问题分解成一个或多个更小的子问题,并递归地求解这些子问题,直到达到最基本的情况(基例),然后逐步将结果返回给上一级调用。递归算法在处理具有递归性质的问题(即问题可以分解为相似的子问题)时特别有效。
习题参考:
算法优化
剪枝
剪枝是一种优化技术,通常用于搜索算法(如回溯法、递归搜索等),通过在搜索过程中提前终止不必要的计算,从而减少搜索空间,提高算法效率。剪枝可以显著提升算法的性能,特别是在解空间巨大或者有很多不必要的分支的情况下。
实际应用:合法性校验、优先级路径选择、缓存应用。
记忆化搜索
记忆化搜索(Memoization Search)是一种优化技术,主要用于递归算法,通过存储已经计算过的结果来避免重复计算,从而提高效率。这种技术特别适用于存在重叠子问题的场景,比如动态规划(Dynamic Programming)问题。记忆化搜索的关键在于用一个数据结构(通常是哈希表或数组)来保存已经计算过的子问题的结果。