首页 > 编程语言 >数据结构和算法——基本思想

数据结构和算法——基本思想

时间:2024-09-21 17:54:45浏览次数:9  
标签:递归 思想 问题 算法 最优 数据结构 节点 贪心

一.分治法

分治法思想:将原问题分成n个规模较小的而结构与原问题相似的子问题,递归地解这些问题,然后合并其结果就得到原问题的解。

  1. 分解:原问题分为若干个子问题,这些子问题是原问题的规模较小的实例。
  2. 解决:递归地求解各个子问题。若子问题足够小,则直接求解。
  3. 合并:将子问题的解合并成原问题的解。

递归算法通常包含:

①递归地调用该算法本身并传入较小的参数

②中止条件(处理基本情况,基本情况不可以有任何递归周期)

二.动态规划法

动态规划思想:动态规划的思想实质是分治思想和解决冗余。

与分治法类似的是,将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,经分解的子问题往往不是互相独立的,若用分治法来解,有些共同部分(子问题或者子子问题)被重复计算了很多次。

  1. 找出最优解的性质,并刻画其结构特征
  2. 递归地定义最优值
  3. 以以自底向上的方式计算出最优值
  4. 根据计算最优值时记录得信息,构造最优解

三.贪心算法

贪心算法思想:从问题的某一个初始解出发,通过一系列的贪心选择——当前状态下的局部最优选择,逐步逼近给定的目标,尽可能地求的最好的解。基于贪心选择准则,每次得到局部最优的选择,希望利用局部最优得到全局最优解。

因此,找到正确的贪心选择准则是设计贪心算法的关键,并且不同的贪心选择准则可以得到不同的结果。

一般有以下几种贪心选择准则:

  1. 最大价值优先
  2. 最小体积优先
  3. 最大体积优先
  4. 最大单位体积优先

贪心算法不能对所有问题都得到全局最优解,但对许多问题是可行的,如:单源最短路径问题,最小生成树问题等。通常是以自顶向下的方式进行,每次选择后将问题转化为规模更小的子问题。

四.回溯法

回溯法思想:搜索树中某个特定目标节点。从起点出发,以深度优先的法则依次遍历备选解,若备选解不是有效解则舍弃该解并返回上次出现分支的位置继续遍历。

  1. 给定问题有一个约束集合以及目标函数
  2. 可以用状态空间树来表示解空间(①状态空间树的根代表0个选择的状态②深度为1的节点代表第一次选择后的状态......状态空间树上一条从根到叶子的路径代表备选解)
  3. 逐步构建部分备选解
  4. 如果备选解不能成为一个有效的解,则立即放弃该分支
  5. 通常用排除法(剪枝),减少搜索空间

解空间:问题所有解的总和,包括错误解。

可行解:满足约束条件的解,解空间的一个子集。

最优解:使目标函数取极值(极大或极小)的可行解。

五.分支限界法

分支限界法思想:由于回溯法在求最优解的过程中效率不是很高,因此我们可以选择先访问那些有可能得出最优解的节点。分支限界法在访问一个节点时,会生成这个节点所有的子节点,也就是生成所有分支,而界表示通过此节点生成的解所能到达的一个下限或者上限,也就是这些节点。

分支限界的基本流程如下:

  1. 从根节点出发,生成根节点的所有子节点,并生成这些节点的界,这些子节点组成了活跃节点
  2. 在所有活跃节点中,选取一个界最小(或最大)的节点(此节点访问完毕后不再是活跃节点),生成此节点所有的子节点及其界,这些子节点也成为活跃节点
  3. 重复以上步骤,直到没有活跃节点

 

 

标签:递归,思想,问题,算法,最优,数据结构,节点,贪心
From: https://blog.csdn.net/m0_62823517/article/details/142415720

相关文章

  • 【代码随想录Day23】回溯算法Part02
    39.组合总和题目链接/文章讲解:代码随想录视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibiliclassSolution{//存储最终结果的列表List<List<Integer>>result=newArrayList<>();//存储当前路......
  • Redis:内存数据结构存储终极指南
    redis是不断发展的数据管理和存储领域中广泛使用的技术。redis被公认为内存中数据结构存储,它提供了广泛的功能,使其成为从缓存到实时分析等各种应用程序的标准基础。这个综合教程将介绍redis是什么、它的核心功能、用例以及如何开始。什么是redis?redis代表远程字典服务......
  • 【算法竞赛】二叉树和哈夫曼树
    树是非线性数据结构,它能很好地描述数据的层次关系。树这种结构的现实场景很常见,如文件目录、书本的目录就是典型的树形结构。二叉树是最常用的树形结构,特别适合编码,常常将一般的树转换为二叉树来处理。本节介绍二叉树的定义和存储。哈夫曼(Huffman)树是二叉树的一个......
  • 初识数据结构和算法
    说在前面:⭐看到这篇文章的友友你好啊,在学习的路途中欢迎你的私信、留言,交流互动啊,我们一起学习、一起进步呀!⭐目录数据和结构解释含义数据的属性划分数据和算法的关系算法中复杂度时间复杂度空间复杂度数据和结构解释含义......
  • PHP抽奖算法
    一、初始化奖品id奖品的idpid奖品的自定义idtype奖品类型,1、虚拟奖品2、实物奖品3、礼包码待扩充name奖品名称total奖品总数chance获奖概率/抽奖基数10000daynum每日数量限制pay充值限制$prize=[['id'=>1,'pid'=>11,'type'=>1,'name'=>'典藏......
  • c++算法 枚举———百钱白鸡问题
    前言枚举,是一种最基本的算法思想,通过穷举枚举出所有的可能,再加以比较。枚举算法适用于问题规模较小、解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。接下来会介绍两个百钱白......
  • 稳定排序算法
    一、什么是不稳定性算法?具有相同关键字的纪录经过排序后, 相对位置发生改变, 这样的算法是不稳定性算法。一、不稳定排序算法有哪些1、堆排序2、希尔排序3、快速排序4、选择排序口诀:一堆(堆)希尔(希尔)快(快速)选(选择)二、常见排序算法稳定性分析1、堆排序堆的结构是节点i的孩子为2*i......
  • 基于Spark的温布尔登特色赛赛事数据分析预测及算法实现_718p9405
    目录技术栈和环境说明python语言解决的思路具体实现截图框架介绍技术路线操作可行性性能/安全/负载方面python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取技术栈和环境说明结合用户的使用需求,本系统采用运用较为广泛的Python语言,DJAN......
  • 基础算法模板
    P3372【模板】线段树1_linkP3374【模板】树状数组1_linkP3366【模板】最小生成树_linkP4779【模板】单源最短路径(标准版)_link(dijkstra)P3379【模板】最近公共祖先(LCA)_linkP3865【模板】ST表&&RMQ问题_linkP3375【模板】KMP_link......
  • 【数据结构】链表及其代码实现
    之前我们已经学习了顺序表,现在让我们来进行对链表的学习!!!【顺序表详解】......