算法设计与分析——算法思想总结

算法设计与分析

1、分治法

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法所能解决的问题一般具有以下几个特征:
  1) 该问题的规模缩小到一定的程度就可以容易地解决
  2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
  3) 利用该问题分解出的子问题的解可以合并为该问题的解;
  4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

分治法的基本步骤:
分治法在每一层递归上都有三个步骤:
  分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
  解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
  合并:将各个子问题的解合并为原问题的解。

平衡子问题:分治算法中,划分出的子问题的规模应基本一致  
2、动态规划算法:

动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题最优子结构性质的问题。

基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

与分治法区别:动态规划算法与分治法类似,都使用了将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优值的思路,但动态规划不是分治法:关键在于分解出来的各个子问题的性质不同。分治法要求各个子问题是独立的(即不包含公共的子问题),因此一旦递归地求出各个子问题的解后,便可自下而上地将子问题的解合并成原问题的解。如果各子问题是不独立的,那么分治法就要做许多不必要的工作,重复地解公共的子问题。动态规划与分治法的不同之处在于动态规划允许这些子问题不独立(即各子问题可包含公共的子问题),它对每个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算
问题特征:

(1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质

(2)重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

算法步骤:

(1)分析最优值的结构,刻画其结构特征;

(2)递归地定义最优值;

(3)按自底向上或自顶向下记忆化的方式计算最优

(4)根据计算最优值得到的信息构造最优解
3、贪心算法
贪心选择性质的定义
做出当前看来是最好的选择,
根据贪心策略一步步选择最终导致最优解,也就是选择局部最优解,可得整体最优解
(1)原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

(2)特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。

1)贪心选择性质

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。证明的大致过程为:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做了贪心选择后,原问题简化为规模更小的类似子问题。然后用数学归纳法证明通过每一步做贪心选择,最终可得到问题的整体最优解。其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

2)最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

(3)贪心算法与动态规划算法的差异:

动态规划和贪心算法都是一种递推算法,均有最优子结构性质,通过局部最优解来推导全局最优解。两者之间的区别在于:贪心算法中作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留,贪心算法每一步的最优解一定包含上一步的最优解。动态规划算法中全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。

(4)基本思路:

1)建立数学模型来描述问题。
2)把求解的问题分成若干个子问题。
3)对每一子问题求解,得到子问题的局部最优解。
4)把子问题的解局部最优解合成原来解问题的一个解。

贪心算法在该问题的贪心策略不满足贪心选择性质条件时,构造出来的解是近似解

4、回溯法

(1)描述:回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

(2)原理: 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。
(3)问题的解空间
问题的解向量:回溯法希望一个问题的解能够表示成一个n元式(x1,x2,…,xn)的形式。
在这里插入图片描述
在这里插入图片描述
(5)回溯法的基本思想

基本思想:

用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2h(n))或O(h(n)!)内存空间。

解题步骤:

1)针对所给问题,定义问题的解空间;
2)确定易于搜索的解空间结构;
3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

常用剪枝函数:用约束函数在扩展结点处剪去不满足约束的子树;用限界函数剪去得不到最优解的子树

约束函数用于选取满足条件的一个解,而限界函数用于剪除不可能存在的解
5、分支限界法

(1)描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。

所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。
所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。

(2)原理:按照广度优先的原则,一个活结点一旦成为扩展结点(E-结点)R后,算法将依次生成它的全部孩子结点,将那些导致不可行解或导致非最优解的儿子舍弃,其余儿子加入活结点表中。然后,从活结点表中取出一个结点作为当前扩展结点。重复上述结点扩展过程,直至找到问题的解或判定无解为止。

(3)分支限界法与回溯法

1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

(4)常见的分支限界法

1)FIFO分支限界法(队列式分支限界法)

基本思想:按照队列先进先出(FIFO)原则选取下一个活结点为扩展结点。

搜索策略:一开始,根结点是唯一的活结点,根结点入队。从活结点队中取出根结点后,作为当前扩展结点。对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点,……,直到找到一个解或活结点队列为空为止。

2)LC(least cost)分支限界法==(优先队列式分支限界法)==

基本思想:为了加速搜索的进程,应采用有效地方式选择活结点进行扩展。按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。

搜索策略:对每一活结点计算一个优先级(某些信息的函数值),并根据这些优先级;从当前活结点表中优先选择一个优先级最高(最有利)的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。再从活结点表中下一个优先级别最高的结点为当前扩展结点,……,直到找到一个解或活结点队列为空为止。

补充:
1.在对问题的解空间进行搜索时,
分支限界法中的一个活结点最多有一次机会成为活结点
回溯法中的一个结点会有多次机会成为活结点

数值化随机算法
利用了概率的性质计算近似值得到的随机算法

舍伍德算法
得到的解不一定正确,但总会得到一个解

拉斯维加斯算法
有时能得到解,有时得不到解,但得到的解一定正确
运行时以一定的概率得到正确的解

线性时间选择问题和快速排序利用了舍伍德算法

N后问题使用了拉斯维加斯算法

P问题是指能够在多项式时间内解决的问题,这意味着计算机能够在有限时间内完成计算。
NP问题是指我们能够在多项式时间内验证一个解的问题。

对于一个问题,如果我们能够在多项式时间内解决,那么我们肯定也能在多项式时间内验证某个猜测是否为这个问题的一个解,因此P问题也属于NP问题,或者说P问题是NP问题的一个子集。

NP完全问题也简称为NPC问题,NPC问题是NP问题中最难的一类问题,
NPC问题是NP难问题的一个子集。

在这里插入图片描述
用于计算时间复杂度的方法:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pearson相关系数_Pearson(皮尔逊)相关系数

由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数。相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度。如果有两个变量:X、Y,最终计算出的相关系数的含义可以有如下理解:(1)、…

聊一聊ABP vNext的模块化系统

官网:https://abp.io/开源:https://github.com/abpframework/abp EasyAbp:https://easyabp.io/Abp 模块:https://abp.io/packages模块化系统ABP vNext 的世界观在 Abp vNext 框架里面,模块系统是整个框架的基石&#x…

双离合档把上按钮作用_英特尔展示双屏幕概念笔记本:带有双铰链

本文转自:IT之家作者:嗜橙近日,英特尔在位于圣克拉拉总部深处的一个半秘密实验室里,公布了配备两个屏幕的概念笔记本电脑。在近日的台北电脑展上,华硕发布了双屏笔记本;不久之后,英特尔也公布了…

浏览器眼中的0

0作为一个特殊的符号,经常会跟浏览器打交道,在不同的场景下,0代表的意思不尽相同,因此浏览器眼中的0不一定就是符合人们感官上的认识,那究竟浏览器会怎么对待它呢,今天我们就来探究一下各种场景中0的含义及…

剑指offer——01二维数组中的查找.

class Solution { public:bool Find(int target, vector<vector<int> > array) {int m array.size();//得到该二维数组的行数if(m0) return false;//如果行数为0则直接退出int n array[0].size();//得到该二维数组的列数if(n0) return false;//如果列数为0则直接退…

GraphQL:验证与授权

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余&#xff0c;也让 API 更容易地随着时间推移而演进&#xff0c…

python 创建目录_第二天:Python中目录及文件操作

Python创建目录使用os模块mkdir创建一级目录&#xff0c;但不会创建父级目录#创建test目录&#xff0c;成功 import os os.mkdir(E:test)##若无父级目录python,则创建test目录失败 import os os.mkdir(E:pythontest)makedirs可创建父级目录import os os.makedirs(E:pythontest)…

计算机科普小知识——U盘格式化

在格式化U盘的时候我们需要选择文件系统类型&#xff0c;分别有FAT32&#xff08;默认&#xff09;&#xff0c;NTFS和exFAT这三种格式 常见格式一&#xff1a;FAT32 FAT32是windows传统的文件格式&#xff0c;对每个分区只有4GB的容量&#xff0c;是任何一种usb存储设备都会预…

.NET 5干货来袭 嘉宾李杨桂素伟

Azure Show大家好&#xff0c;欢迎来到Azure Show第八期&#xff0c;好久不见&#xff01;因为工作的原因有两个月没和大家见面&#xff0c;但12月Azure Show回归&#xff0c;会有更多大家感兴趣的话题&#xff0c;也有更多嘉宾与大家见面。除了这一期&#xff0c;在12月我们还…

setnx和expire合成一条指令_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...

从接触 Python 时起&#xff0c;我就觉得 Python 的元组解包&#xff08;unpacking&#xff09;挺有意思&#xff0c;非常简洁好用。最显而易见的例子就是多重赋值&#xff0c;即在一条语句中同时给多个变量赋值&#xff1a;>>> x, y 1, 2 >>> print(x, y) …

计算机科普小知识——Win7系统32位与64位的区别,该如何选择?

Win7系统32位与64位的区别 首先我们要知道32位和64位指的是什么。其实这是根据CPU内的寄存器字长来确定的&#xff0c;计算机内部数据都是二进制来呈现的&#xff0c;32位的计算机CPU一次最多能处理32位的二进制数据&#xff0c;而64位的计算机CPU一次最多能处理64位的二进制数…

你知道这个C#开发跨平台APP的样例介绍开源项目吗?

站长英文太差就不翻译了&#xff0c;大家看效果图&#xff0c;都是使用Xamarin.Forms开发的开源移动App介绍&#xff0c;感兴趣的可以访问Github和Gitee仓库看看&#xff0c;下载对应的App项目研究。Github&#xff1a;https://github.com/jsuarezruiz/xamarin-forms-goodlooki…

mybatis plus 批量保存_mybatis源码分析

原理图&#xff1a;Configuration解析&#xff1a;Configuration表示配置&#xff0c;该对象中维护了很多mybatis的配置参数&#xff1b;大致可分为四部分&#xff1a;1.环境变量Environment 2.配置参数&#xff1b;3.缓存集合&#xff1b;4.插件及其他1.1环境变量EnvironmentE…

判断领导是在压榨你,还是在培养你?就看这5点!别被骗了!

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第102篇原创文章前文写了职场PUA的文章&#xff0c;有读者问洋哥&#xff1a;我的领导有点像PUA&#xff0c;但又总是说要培养我&#xff0c;怎么破&#xff1f;读者问的问题并不是个案&#xff0c;前不久一个哥们挺郁…

java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)

用JFrame时&#xff0c;设置背景颜色需使用JFrame.getContentPane().setBackground(Color.red) Container conthis.getContentPane();//得到内容窗格 con.setBackground(Color.blue); 而使用Frame时则可以直接使用setBackground(Color.red)&#xff0c;且需要设置窗体默认关闭事…

揭秘软件开发的达摩克利斯之剑

↑ ???? 万字长文不想看&#xff0c;那就听一听叭 ↑为什么你的程序总是出现 bug&#xff1f;凭什么让改 bug 占据了你大部分的时间&#xff1f;看完本文&#xff0c;保证你能设计出更稳定的程序&#xff0c;摆脱 bug 的缠绕&#xff0c;做项目更安心&#xff01;记得我在学…

java使用教程——组件及事件处理——菜单(添加图标)

菜单条JMenuBar 菜单JMenu 菜单项JMenuItem menuFruit.addSeparator(); //在菜单添加分隔线 public class Example9_2 {public static void main(String args[]) {WindowMenu winnew WindowMenu("带菜单的窗口",20,30,600,290);} }C:/Users/86156/OneDrive/图片/水…

java使用教程——组件及事件处理——常用组件与布局

常用组件&#xff1a; 1.JTextField(文本框) 允许用户在文本框中输入单行文本 2.JTextArea(文本区) 允许用户文本区中输入多行文本 3.JLabel(标签) 标签为用户提供信息 4.JButton(按钮) 允许用户单击按钮 5.JCheckBox(复选框) 为用户提供多种选择 6.JComboBox(下拉列表&#xf…

数据库大战,AWS又将目标瞄准了微软SQL Server

喜欢就关注我们吧&#xff01;文|白开水AWS 宣布了一种新的数据库产品 — 用于 Aurora PostgreSQL 的 Babelfish。该产品旨在效仿 Microsoft 的 SQL Server&#xff0c;并吸引 SQL Server 用户迁移到 AWS 云平台。图片来源&#xff1a;techcrunchAWS 首席执行官 Andy Jassy 在 …

惊!Kubernetes 将弃用 Docker,开发者们怎么办?

喜欢就关注我们吧&#xff01;文|大东BE近日&#xff0c;Kubernetes 官方发布公告&#xff0c;宣布自 v1.20 起放弃对 Docker 的支持&#xff0c;届时用户将收到 Docker 弃用警告&#xff0c;并需要改用其他容器运行时。但 Docker 作为容器镜像构建工具的作用将不受影响&#x…