常见的算法思想(分治、动态规划、贪心算法、回溯法等)

《数据结构与算法》一书中讲到的几种常见的算法思想包括:递归和分治、动态规划、贪心算法、回溯法、分支限界法、概率算法、线性规划、NP完全性理论。我们平常所见的一般都是前5种,这里简单介绍。

分治法

把一个大规模问题划分成几个子问题,对每一个子问题采用同样的处理方法,求出各子问题的解答,再把这些子问题的解答组合成整个问题的解答。子问题相互独立。

动态规划

当整个问题的解答无法由少数几个子问题的解答组合得出,而依赖于大量子问题的解答,并且子问题的解答又需要反复利用多次时,系统地列表记录各个子问题的解答,据此求出整个问题的解答。记录在表、子问题不相互独立、最优子结构、重叠子问题。

贪心算法

在算法的每一步骤,都采取当前看来可行的或最优的策略。这是一种最直接的方法,只有在一些特殊情况下,贪婪法才能求出问题的解答。对于录求最优解的问题、贪婪法通常只能求出近似解。

回溯法

为了寻求问题的解答,有时需要在所有的可能性(称为候选对象)中进行系统的搜索,例如在寻求最优解的问题中,就常碰到这种情况。这时,须把各种候选对象组织成一棵树,每个树叶对应着一个候选对象,于是每个内部顶点就表示若干个候选对象(即在此顶点下面的树叶)。回溯法是从树根开始按深度优先搜索的原则向下搜索,即沿着一个方向尽量向下搜索,直到发现此方向上不可能存在解答时,就退到上一个顶点,沿另一个方向进行同样的工作。回溯法一般用来求解所有满足约束条件的解。通常为了加速,和分支截断法配合使用。分叉截断法也是从树根开始向下搜索,不同的是,分叉截断法常常利用一个适当选取的评估函数,来决定应该从哪一点开始下一步搜索(分叉),以及哪一点下方不可能存在解答,从而这点的下方不必进行搜索(截断)。评估函数选得好,就会很快地找到解答,选得不好,就可能找不到解答或者找到的不是最优解(有时它可以作为最优解的一个近似解)。

分支限界法

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。

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

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

相关文章

织梦教程

/************************************************************************************************************************************************** 织梦 文件说明 很详细 http://bbs.admin5.com/thread-1952932-1-1.html /****************************************…

TinyXML:一个优秀的C++ XML解析器

2019独角兽企业重金招聘Python工程师标准>>> 读取和设置xml配置文件是最常用的操作,试用了几个C的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源…

《C++标准程序库》学习笔记5 — 第七章

1.(P252) 迭代器的分类及其能力:input迭代器只能读取元素一次。如果复制input迭代器,并使原迭代器和新产生副本都向前读取,可能会遍历到不同的值。output迭代器类似。 2.(P258) C不允许修改任何基本类型(包括指针)的暂…

Android无线调试——抛开USB数据线

开发Android的朋友都知道,真机调试需要把手机与PC相连,然后把应用部署到真机上进行安装和调试。长长的USB线显得很麻烦,而且如果需要USB接口与其他设备连接的话显得很不方便。今天介绍一种不通过USB线就可以进行真机调试的方法。首先让手机与…

C中不能直接比较两个double类型

在比较float 和double类型的时候,因为float/double精度的问题,比如1.000000001可能和1.0000000000001相等,不应该直接使用a>b等类似的方式进行比较,而是采用 两个数做差取绝对值然后跟指定的精度进行比较 ,便可得出…

C#基础——C#入门

教材是C#入门经典(第四版)。 PC:Thinkpad sl410 OS:Win7 Ultimate SDE:VS 2010 Ultimate 1.2 什么是C#? C#是从C、C语言演化而来,Microsoft专门为使用.Net平台而创建的语言,读作C sharp。运行在.Net CRL环境上的应用程…

VS2017动态链接库(.dll)的生成与使用

这里以VS2017为例子,讲解一下动态链接库(.dll)的生成与使用。 一、动态链接库(.dll)的生成 1、打开:“文件”-“新建”-“项目” 2、打开:“已安装”-“模板”-“Visual C”-“Win32”-“Win3…

让Windows7 x64 IIS7支持32位应用程序

我的os是Win7 64位,因为开发的一个应用程序使用了非dot net 的32 位的dll。 经常出现无法装载****.dll的问题。 下面的命令让IIS 7支持32位的应用程序: cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin…

c#中用声音提示报警(转)

using System; using System.Runtime.InteropServices; 调用 Interaction.Beep(); 使用MessageBeep(unit uType):需添加 using System.Runtime.InteropServices; public const int MB_ICONEXCLAMATION 48; [DllImport("user32.dll")] public static extern bool M…

android3.2以上切屏禁止onCreate()

一般切屏禁止onCreate()方法需要将activity加上属性: android:configChanges”orientation|keyboardHidden” 但是在3.2以上就不起作用了,需要加上screenSize(也只有3.2以上才有这个选项): android:configC…

typedef用法总结

1、用途一:定义一种类型的别名,可以用作同时声明指针型的多个对象。 比如对于char* pa, pb,初学者往往错误地认为定义了两个字符型指针,但是它只声明了一个指向字符变量的指针和一个字符变量; 而 typedef char* PCH…

Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面通过…

Mysql安装后在服务里找不到和服务启动不起来的解决方法

一,在安装完Mysql数据库后,发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下:开启命令行,按照如下步骤即可; 1.进入到mysql的安装包,在bin里执行:mysqld.exe -install …

WINFORM如何只弹出一个子窗体

public partial class Form1:Form{ Form2 fnull; public Form1() { InitializeComponent(); } private void Form1_Click(object sender, EventArg e) { if(fnull||f.IsDisposed) //注意先判断null,再判断IsDisposed,…

“指向指针的指针”的应用场景

结合以下博文来看。 值传递与地址传递的区别_天糊土的博客-CSDN博客 二维数组数和指针操作的理解_天糊土的博客-CSDN博客 “指针1”的理解_天糊土的博客-CSDN博客 多重指针操作_天糊土的博客-CSDN博客_多重指针 二重指针的应用场景 (1)用指针的指针指向指…

su root 和su - root 的区别

前几天,在一次项目中,犯了一个很低级的错误,但是没弄明白是什么问题。情况是这样的,我们在做灾备,重启系统化,以root用户权限,通过 su oracle ,进去后,oracle的rac 无法正…

弹出框

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>AlertBox 弹出层&#xff08;信息提示框&#xff09;效果&l…

一些Base64编码/解码及数据压缩/解压方面的知识

一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeDecode组件,以及RjMime单元. 在这里主要想讲讲如何才能获得最好的编码/解码性能,EncdDecd提供了EncodeStream/DecodeSt…

easyUI 绑定右键菜单在数据行上显示

easyUI的显示数据的div都有一个样式,如下图 所有的表格都有一个datagrid-cell的样式那么这个时候我们就可以利用jquery来做时间的绑定了 下面是主要的js代码: /*绑定右键*/$(".datagrid-cell").live(contextmenu,function(e){//显示快捷菜单$(#mm).menu(show, {left:…

值传递与地址传递的区别

以下内容源于网络资源的学习与整理&#xff0c;欢迎交流。 总结 值传递&#xff0c;只是把原参的复制品传给形参&#xff0c;在子函数中修改这个形参&#xff0c;不会改变主函数中的原参。 地址传递&#xff0c;由于形参和原参表示同一个内容&#xff0c;在子函数中修改形参&a…