对于声明式编程语言,只需要指定需要实现什么而不给出实现细节。过程式编程语言需要指定具体的步骤才能达到想要的结果。例如,SQL 更像是一种声明性语言而不是过程性语言,因为查询操作不需要为查询提供特定步骤。而C、PHP、PERL等都是过程语言的例子。
3.串行或并行或分布式
在讨论算法时,通常认为计算机一次执行一条指令,这就是所谓的串行程序(算法)。并行算法利用计算机体系结构的特点,一次处理多条指令,将原问题分解为多个子问题,分配给多个处理器或线程分别解决。迭代算法通常是可并行的。如果一个并行算法分布在不同的机器上,这种算法称为分布式算法。
4.确定性或不确定性
确定性算法基于预定义的过程解决问题,而非确定性算法在每一步通过一些启发式规则猜测最优解。
5.精确或近似
许多问题不一定有最优解。因此java回溯算法,那些给出最优解的算法称为精确算法。在计算机科学中,对于那些无法提供精确解决方案的问题,通常会给出近似算法。近似算法通常用于解决 NP-hard 问题(详见第 20 章)。
16. 4 按设计方法
除了实现方法,算法还可以按照设计方法进行分类。
1.贪婪
贪心算法将问题分为多个阶段。在每个阶段,选择当前状态的最佳决策,而不考虑对后续决策的影响。这意味着算法在执行过程中会选择一些局部最优解。贪心法假设通过局部最优解可以得到全局最优解。
2.分而治之
分治法通过以下 3 个步骤解决问题:
1)点:将原始问题分成与原始问题相同类型的较小实例的子问题。
2)递归:递归求解子问题。
3)治理:合理组合子问题的解决方案。
示例:合并排序和二分搜索算法。
3.动态编程方法
动态规划 ( , DP) 与备忘录法相结合。动态规划和分治的区别在于分治的子问题之间没有依赖关系,而DP的子问题是重叠的。动态规划通过记忆技术(保存已解决子问题答案的表格)将许多问题的复杂性从指数降低到多项式(O(n2), O(n') 等)。编程和递归是递归调用的备忘录技术,当每个子问题相互独立且没有重复调用时java回溯算法,这种备忘录技术无助于降低复杂度,因此动态规划并不是适合所有问题的一种方法.
4.线性规划法
在线性规划中,输入变量的线性函数在不等式约束下被最大化(或最小化)。许多问题(例如,有向图的最大流)可以采用线性规划方法。
5.(变换和求解)
该方法的思想是将一个复杂的问题转化并求解为一个具有渐近最优解的已知问题。该方法的目标是找到一种约简算法过程式编程语言贪婪法贪婪算法将问题分为多个多个阶段,使得约简算法的复杂度不会更高。例如,在线性表中求中位数的算法是:先对线性表排序,再对排序后的表求中位数。这两个步骤分别称为变换和求解。
16.5 其他分类法1.按研究领域
在计算机科学中,每个领域都有自己的问题,需要高效的算法。例如搜索算法、排序算法、合并算法、数值算法、图算法、字符串算法、几何算法、组合算法、机器学习、加密、并行算法、数据解压算法等。
2.按复杂度
算法根据相对于输入大小的求解时间进行分类。有些算法具有线性时间复杂度 (O(n)),有些算法需要指数时间,有些甚至永不停止。请注意,某些问题可能有多种复杂度不同的解决方案算法。
3.随机算法
一些算法需要随机选择。对于某些问题,最快的求解算法必然涉及随机操作,例如:快速排序。
4.分支与绑定、枚举与回溯
这些方法用于人工智能领域,这里不再赘述。回溯方法见第 2 章。
注意:在接下来的三章中,将分别讨论三种算法设计技术,贪心、分治和动态规划。专注于这三种技术,因为它们比其他技术解决的问题更多。
文章来源:https://blog.csdn.net/xiaoningxueJAVA/article/details/107071075