关于java:5-个牛逼的算法设计思想你知道几个

39次阅读

共计 3006 个字符,预计需要花费 8 分钟才能阅读完成。

分治法

概念:

将一个难以间接解决的大问题,宰割成一些规模较小的雷同问题,以便各个击破,分而治之。

思维策略:

对于一个规模为 n 的问题,若该问题能够容易地解决(比如说规模 n 较小)则间接解决,否则将其合成为 k 个规模较小的子问题,这些子问题相互独立且与原问题模式雷同,递归地解这些子问题,而后将各子问题的解合并失去原问题的解。

特色:

1) 该问题的规模放大到肯定的水平就能够容易地解决
2) 该问题能够合成为若干个规模较小的雷同问题,即该问题具备最优子结构性质。
3) 利用该问题合成出的子问题的解能够合并为该问题的解;
4) 该问题所合成出的各个子问题是互相独立的,即子问题之间不蕴含公共的子子问题。

第一条特色是绝大多数问题都能够满足的,因为问题的计算复杂性个别是随着问题规模的减少而减少;
第二条特色是利用分治法的前提它也是大多数问题能够满足的,此特色反映了递归思维的利用;、
第三条特色是要害,是否利用分治法齐全取决于问题是否具备第三条特色,如果具备了第一条和第二条特色,而不具备第三条特色,则能够思考用贪婪法或动静规划法。
第四条特色波及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,反复地解公共的子问题,此时尽管可用分治法,但个别用动静规划法较好。

根本步骤:

1 合成:将原问题合成为若干个规模较小,互相独立,与原问题模式雷同的子问题;
2 解决:若子问题规模较小而容易被解决则间接解,否则递归地解各个子问题
3 合并:将各个子问题的解合并为原问题的解。

实用分治法求解的经典问题:

  • 1)二分搜寻
  • 2)大整数乘法
  • 3)Strassen 矩阵乘法
  • 4)棋盘笼罩
  • 5)合并排序
  • 6)疾速排序
  • 7)线性工夫抉择
  • 8)最靠近点对问题
  • 9)循环赛日程表
  • 10)汉诺塔

动静布局

概念:

每次决策依赖于以后状态,又随即引起状态的转移。一个决策序列就是在变动的状态中产生进去的,所以,这种多阶段最优化决策解决问题的过程就称为动静布局。

思维策略:

将待求解的问题合成为若干个子问题(阶段),按程序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的部分解,通过决策保留那些有可能达到最优的部分解,抛弃其余部分解。顺次解决各子问题,最初一个子问题就是初始问题的解。

特色:

能采纳动静布局求解的问题的个别要具备 3 个性质:
(1) 最优化原理:如果问题的最优解所蕴含的子问题的解也是最优的,就称该问题具备最优子结构,即满足最优化原理。
(2) 无后效性:即某阶段状态一旦确定,就不受这个状态当前决策的影响。也就是说,某状态当前的过程不会影响以前的状态,只与以后状态无关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被屡次应用到。(该性质并不是动静布局实用的必要条件,然而如果没有这条性质,动静布局算法同其余算法相比就不具备劣势)

根本步骤:

(1)剖析最优解的性质,并刻画其结构特征。
(2)递归的定义最优解。
(3)以自底向上或自顶向下的记忆化形式(备忘录法)计算出最优值
(4)依据计算最优值时失去的信息,结构问题的最优解

实用动静布局求解的经典问题:

  • 矩阵连乘,
  • 走金字塔
  • 最长公共子序列(LCS),
  • 最长递增子序列(LIS),
  • 凸多边形最优三角剖分,
  • 背包问题,
  • 双调欧几里得旅行商问题

贪婪法

概念:

在对问题求解时,总是做出在以后看来是最好的抉择。也就是说,不从整体最优上加以思考,他所做出的仅是在某种意义上的部分最优解。

思维策略:

贪婪算法没有固定的算法框架,算法设计的要害是贪婪策略的抉择。必须留神的是,贪婪算法不是对所有问题都能失去整体最优解,抉择的贪婪策略必须具备无后效性,即某个状态当前的过程不会影响以前的状态,只与以后状态无关。所以对所采纳的贪婪策略肯定要仔细分析其是否满足无后效性。

根本步骤:

1. 建设数学模型来形容问题。
2. 把求解的问题分成若干个子问题。
3. 对每一子问题求解,失去子问题的部分最优解。
4. 把子问题的解部分最优解合成原来解问题的一个解。

实用贪婪法求解的经典问题:

  • 流动抉择问题,
  • 钱币找零问题,
  • 再论背包问题,
  • 小船过河问题,
  • 区间笼罩问题,
  • 销售较量,
  • Huffman 编码,
  • Dijkstra 算法(求解最短门路),
  • 最小生成树算法

回溯法

概念:

回溯算法实际上一个相似枚举的搜寻尝试过程,次要是在搜寻尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的门路。
回溯法是一种选优搜寻法,按选优条件向前搜寻,以达到目标。但当摸索到某一步时,发现原先抉择并不优或达不到指标,就退回一步从新抉择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
许多简单的,规模较大的问题都能够应用回溯法,有“通用解题办法”的美称。

思维策略:

在蕴含问题的所有解的解空间树中,依照深度优先搜寻的策略,从根结点登程深度摸索解空间树。当摸索到某一结点时,要先判断该结点是否蕴含问题的解,如果蕴含,就从该结点登程持续摸索上来,如果该结点不蕴含问题的解,则逐层向其先人结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。
若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜寻遍才完结。

特色:

(1)针对所给问题,确定问题的解空间:首先应明确定义问题的解空间,问题的解空间应至多蕴含问题的一个(最优)解。
(2)确定结点的扩大搜寻规定
(3)以深度优先形式搜寻解空间,并在搜寻过程中用剪枝函数防止有效搜寻。

实用回溯法求解的经典问题:

  • 八皇后问题,
  • 图的着色问题,
  • 装载问题,
  • 批处理作业调度问题,
  • 再再论背包问题,
  • 最大团问题,
  • 间断邮资问题,
  • 符号三角形问题,

分支限界法

概述:

相似于回溯法,也是一种在问题的解空间树 T 上搜寻问题解的算法。但在个别状况下,分支限界法与回溯法的求解指标不同。回溯法的求解指标是找出 T 中满足约束条件的所有解,而分支限界法的求解指标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一指标函数值达到极大或极小的解,即在某种意义下的最优解。

策略:

在扩大结点处,学生成其所有的儿子结点(分支),而后再从以后的活结点表中抉择下一个扩大对点。为了无效地抉择下一扩大结点,以减速搜寻的过程,在每一活结点处,计算一个函数值(限界),并依据这些已计算出的函数值,从以后活结点表中抉择一个最无利的结点作为扩大结点,使搜寻朝着解空间树上有最优解的分支推动,以便尽快地找出一个最优解。

与回溯法的区别:

回溯法:【形式不同】深度优先搜寻 堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出 满足约束条件的所有解【指标不同】。

分支限界法:【形式不同】广度优先或最小耗费优先搜寻 队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或 特定意义下的最优解【指标不同】。

版权申明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接和本申明。本文链接:https://blog.csdn.net/ght886/…
近期热文举荐:

1.600+ 道 Java 面试题及答案整顿(2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0