数据结构和算法专题---2、算法思想

上文讲到算法的概念、复杂度,本文给大家介绍具体的算法思想,让大家对算法设计理念有个认识,后续再分别介绍各种算法。

算法思想

算法是解决问题的一种思想和方法,其基本思想是将一个复杂问题分解为多个简单的子问题,然后通过一定的逻辑和操作方法将这些子问题的解组合成原问题的解。

分而治之

把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题小到可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换),大数据中的MR,现实中如汉诺塔游戏。

分治法对问题有一定的要求:

  • 该问题缩小到一定程度后,就可以轻松解决
  • 问题具有可拆解性,不是一团无法拆分的乱麻
  • 拆解后的答案具有可合并性。能组装成最终结果
  • 拆解的子问题要相互独立,互相之间不存在或者很少有依赖关系

动态规划

基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他。依次解决各子问题,最后一个子问题就是初始问题的解。

与分治法最大的不同在于,分治法的思想是并发,动态规划的思想是分步。该方法经分解后得到的子问题往往不是互相独立的,其下一个子阶段的求解往往是建立在上一个子阶段的解的基础上。动态规划算法同样有一定的适用性场景要求:

  • 最优化解:拆解后的子阶段具备最优化解,且该最优化解与追踪答案方向一致
  • 流程向前,无后效性:上一阶段的解决方案一旦确定,状态就确定,只会影响下一步,而不会反向影响
  • 阶段关联:上下阶段不是独立的,上一阶段会对下一阶段的行动提供决策性指导。这不是必须的,但是如果具备该特征,动态规划算法的意义才能更大的得到体现

贪心算法

同样对问题要求作出拆解,但是每一步,以当前局部为目标,求得该局部的最优解。那么最终问题解决时,得到完整的最优解。也就是说,在对问题求解时,总是做出在当前看来是最好的选择,而不去从整体最优上加以考虑。从这一角度来讲,该算法具有一定的场景局限性。

  • 要求问题可拆解,并且拆解后每一步的状态无后效性(与动态规划算法类似)
  • 要求问题每一步的局部最优,与整体最优解方向一致。至少会导向正确的主方向。

回溯算法

回溯算法实际上是一个类似枚举的搜索尝试过程,在每一步的问题下,列举可能的解决方式。选择某个方案往深度探究,寻找问题的解,当发现已不满足求解条件,或深度达到一定数量时,就返回,尝试别的路径。回溯法一般适用于比较复杂的,规模较大的问题。有“通用解题法”之称。

  • 问题的解决方案具备可列举性,数量有限
  • 界定回溯点的深度。达到一定程度后,折返

分支限界

与回溯法类似,也是一种在空间上枚举寻找最优解的方式。但是回溯法策略为深度优先。分支法为广度优先。分支法一般找到所有相邻结点,先采取淘汰策略,抛弃不满足约束条件的结点,其余结点加入活结点表。然后从存活表中选择一个结点作为下一个操作对象

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

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

相关文章

全网最新最全的自动化测试教程:python+pytest接口自动化-请求参数格式的确定

我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…

跟我学c++高级篇——动态反射之二动态列表

一、动态生成列表 在上一篇中实现了一个Map映射,其实就是一个表。但那个表有点维护和扩展上的不方便,所以后为又开始用静态展开递归的方式来遍历枚举。其不管是怎么做,都是要得到整个枚举体的信息,然后才能进行处理。 这次使用一…

医院信息化专业人员必备医院业务运作及管理流程知识(详细)

业务流程是一家医院运作的基础,医院所有业务都需要流程加以驱动。熟知医院各项业务,了解医院管理流程,有利于医院工作人员更好地投入自身岗位,提高工作效率。本文整理了常见医院业务运作及管理流程,仅供参考! 【门诊业务】 一、门诊业务的特点: 1.接诊病人多,就诊时…

clang的AST源码分析

clang的AST源码分析 QualType类 重点关注函数&#xff1a; /// Return true if this QualType doesnt point to a type yet.bool isNull() const {return Value.getPointer().isNull();}被RecursiveASTVisitor调用 template <typename Derived> bool RecursiveASTVisi…

Python 接口自动化 —— requests框架

1.前言 Python内置的urllib模块&#xff0c;也可以用于访问网络资源。但是&#xff0c;它用起来比较麻烦&#xff0c;而且&#xff0c;缺少很多实用的高级功能。因此我们使用 requests 模块进行进行接口测试。 requests官方文档资料地址&#xff1a;http://cn.python-request…

记录 | ipad上安装ipa文件

目的&#xff1a;在 ipad 上安装 ipa 文件 首先需要在 mac 端安装 itools pro 下载地址&#xff1a;https://www.thinkskysoft.com/itools/ 然后下载 ipa > 需要有签名的&#xff0c;不然安装不了 然后用数据线连接 ipad 和 mac&#xff0c;应用 -> 安装

C语言——深入理解指针(5)

目录 1. sizeof和strlen的对比 1.1 sizeof 1.2 strlen 1.3 sizeof和strlen 的对比 2. 数据和指针题解析 2.1 一维数组 2.2 字符数组 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2,6 2.3 二维数组 3. 指针运算题解析 3.1 例1 3.2 例2 3.3 例3 3.4 例4 3.5 例5 3.6 例…

OpenCV介绍及安装

目录 1.OpenCV简介 2.OpenCV安装 3.检查OpenCV是否安装成功 4.OpenCV模块 5.学习技巧 1.OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个基于开源发行的跨平台计算机视觉库&#xff0c;主要用于图像处理、计算机视觉和机器学习等领域…

干货|水表基础知识大全

第一部分 水表基础知识 第一节 水表的作用 水表:是用来记录流经自来水管道中水量的一种计量器具,也称为计量器具。 1、水表的发展简史 1825年英国的克路斯发明了真正具有仪表特征的平衡罐式水表以来&#xff0c;水表的发展已有近二百年的历史。期间&#xff0c;水表的结构…

Day13——泛型

1.泛型 1.1 介绍 所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值或参数的类型。这个类型参数将在使用时&#xff08;例如&#xff0c;继承或实现这个接口、创建对象或调用方法时&#xff09;确定&#xff08;即传入…

你知道 n 进制如何转化为 m 进制吗?

更好的阅读体验&#xff0c;请点击 进制转换 | YinKais Blog 程序介绍&#xff1a;n 进制数转换器 这个简单的C程序是一个 n 进制数转换器&#xff0c;可以将一个给定的 n 进制数按照用户指定的进制进行转换。用户需要提供三个输入&#xff1a;原始进制&#xff0c;待转换的数…

目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

文章目录 前言1.IOU_Loss&#xff08;Intersection over Union Loss&#xff09;2.GIOU_Loss&#xff08;Generalized Intersection over Union Loss&#xff09;3.DIOU_Loss&#xff08;Distance Intersection over Union Loss&#xff09;4.CIOU_Loss&#xff08;Complete In…

行云创新:与德国汽车业交流Catena-X数据空间技术有感

近日&#xff0c;行云创新CEO马洪喜先生受深圳高新投、Plug&Play邀请参加Catena-X技术研讨交流会&#xff0c;与西门子全球汽车生态系统总监Claus CREMERS&#xff0c;大众汽车全球数字化生产及流程负责人Frank GOELLER&#xff0c;宝马全球数字化政策负责人Sebastian SCHL…

Gensim训练中文词向量实战

引言 实现文本匹配模型时经常需要预训练好的中文词/字向量&#xff0c;今天通过gensim和中文维基百科数据训练一个中文字向量。 安装相关包 首先要安装所需的几个包&#xff1a; zhconv 1.4.3 gensim 4.3.2由于中文维基百科是繁体字&#xff0c;需要用zhconv转换为简体&…

【国际会议】2024年材料科学与机械应用发展国际会议(ICMSMAD 2024)

2024年材料科学与机械应用发展国际会议(ICMSMAD 2024) 2024 International Conference on Materials Science and Mechanical Application Development(ICMSMAD 2024) 一、【会议简介】 ​2024年材料科学与机械应用发展国际会议(ICMSMAD 2024)即将在美丽的中国成都盛大召开。这…

贪心法之柠檬水找零

题目: 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。 顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。 你必须给每个顾客正确找零&am…

使用gdb调试正在运行的程序

写一个一秒打印一个数的c程序&#xff0c;并编译运行。 #include<unistd.h> #include<stdio.h> int main(int argc,char **argv){int i0;while(1){sleep(1);i;printf("%d\n",i);}return 0; }vim loop.c gcc loop.c -o loop ./loop 查看该进程的进程号。…

《数据库系统概论》学习笔记——王珊 萨师煊

第一章 绪论 一、数据库系统概述 1.数据库的4个基本概念 &#xff08;1&#xff09;数据 描述事物的符号记录称为数据 &#xff08;2&#xff09;数据库 存放数据的仓库 &#xff08;3&#xff09;数据库管理系统 主要功能&#xff1a; &#xff08;1&#xff09;数据定…

APP逆向工具环境安装

环境安装及配置&#xff1a; 1.JDK安装及配置链接&#xff1a;https://pan.baidu.com/s/146I4vDJdz8YeR0OEqLS8xw 提取码&#xff1a;7h00 2.SDK环境配置链接&#xff1a;https://pan.baidu.com/s/1A8rwqyw8Nn7p93Axqpll3A 提取码&#xff1a;cwv43.NDK环境配置链接&#xff1…

【Spark基础】-- 理解 Spark shuffle

目录 前言 1、什么是 Spark shuffle? 2、Spark 的三种 shuffle 实现 3、参考 前言 以前,Spark 有3种不同类型的 shuffle 实现。每种实现方式都有他们自己的优缺点。在我们理解 Spark shuffle 之前,需要先熟悉 Spark 的 execution model 和一些基础概念,如:MapReduce、…