首页 > 编程语言 >对算法的一些理解

对算法的一些理解

时间:2023-06-25 21:44:57浏览次数:38  
标签:问题 算法 理解 搜索 穷举 一些 最优 贪心

主要的算法思路有这几个:

1、穷举

2、动态规划

3、分治

4、贪心

5、回溯

6、分支限界

这些算法思路之间是有区别和联系的。但是,很多文章没有把他们的区别和联系讲出来,这里尝试梳理一下。

穷举是最朴素、最原始的思路。穷举就是把所有的可能一个一个列举出来,逐个分析后,再合并分析后的结果。

但是,如果一个问题包含的可能太多,穷举就会需要大量时间来做计算和大量空间来保存运算数据。而计算机的算力和存储是有限的,所以需要改进穷举思路。

怎么改进呢?对问题进行研究,找到他的特性,根据这些特性,1)直接排除掉一些计算 2)需要多次计算的,把计算结果保存下来 3)todo

根据问题特性和改进思路的不同,把改进思路归为这几类:分治、分支限界、回溯、动态规划、贪心。

 

分治法:

  • 该问题的规模缩小到一定的程度就可以容易地解决。
  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质,利用该问题分解出的子问题的解可以合并为该问题的解。
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。(如果各子问题是不独立的,则分治法要重复地解公共的子问题,也就做了许多不必要的工作。此时虽然也可用分治法,但一般用 动态规划 较好。)

回溯法是比动态规划法更加一般的算法,如n皇后,子集和数问题。。回溯算法相当于穷举搜索,穷举所有情况,然后得到最优解。时间复杂度非常高,指数级的,只能解决小规模数据问题。对于大规模数据,执行效率就相当低。

动态规划法是一种方法,注意和算法的区别。如多段图问题,备忘录方法,弗洛伊德算法,最长公共子序列问题

贪心法是动态规划法的特例,如0-1背包,最小代价生成树(prim算法和cruskal算法),huffman算法,以及地杰斯特拉算法。

首先,这些方法所要解决的问题,一般都是决策问题。而贪心法一般是来求解最优问题的,而且他们其实都是在对问题的状态空间树进行搜索,在这个状态空间树中搜索最佳的路径以便求出最优策略。而贪心法是从上到下只进行深度搜索的,也就是说它是一口气走到黑的,一口气吃成胖子的,它的代价取决于子问题的数目,也就是树的高度,每次在当前问题的状态上作出的选择都是1,也就是说,它其实是不进行广度搜索的,这也造成了它的一个缺点:它得出的解不一定是最优解,很有可能是近似最优解。而动态规划法在最优子结构的前提下,从状态空间树的叶子节点开始向上进行搜索,并且在每一步都根据叶子节点的当前问题的状况作出选择,从而作出最优决策,所以她的代价就是子问题的个数和可选择的数目,所以它求出的解一定是最优解。回溯法是从上到下进行深度搜索,如果深度搜索没有进行到底而不满足决策函数了,那么不好意思,请回去,然后再从最近的可以岔开的地方选择另一条路,继续之前的深度搜索,如果搜索到底,那么再通过for循环进行广度搜索。所以它也是深度搜索和广度搜索并行的。求出的解也一定是最优解,通常目标是找到问题的所有可行解;分支限界法主要利用广度优先搜索策略,通常目标是尽快找到一个满足问题约束条件的解

 

《算法之道》对三种算法进行了归纳总结,如下表所示:

 

标准分治

动态规划

贪心算法

适用类型

通用问题

优化问题

优化问题

子问题结构

每个子问题不同

很多子问题重复(不独立)

只有一个子问题

最优子结构

不需要

必须满足

必须满足

子问题数

全部子问题都要解决

全部子问题都要解决

只要解决一个子问题

子问题在最优解里

全部

部分

部分

选择与求解次序

先选择后解决子问题

先解决子问题后选择

先选择后解决子问题

标签:问题,算法,理解,搜索,穷举,一些,最优,贪心
From: https://www.cnblogs.com/feimingdi/p/17503941.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (47)-- 算法导论6.1 5题
    五、一个已排好序的数组是一个最小堆吗?文心一言:一个已排好序的数组不一定是一个最小堆。最小堆是一种特殊的二叉树,它满足以下性质:对于任意节点x,其父节点y的值都小于等于x的值。而一个已排好序的数组只是一个有序数组,它满足任意的元素都是按从小到大的顺序排列的,但并不一定满......
  • 文心一言 VS 讯飞星火 VS chatgpt (47)-- 算法导论6.1 5题
    五、一个已排好序的数组是一个最小堆吗?文心一言:一个已排好序的数组不一定是一个最小堆。最小堆是一种特殊的二叉树,它满足以下性质:对于任意节点x,其父节点y的值都小于等于x的值。而一个已排好序的数组只是一个有序数组,它满足任意的元素都是按从小到大的顺序排列的,但并不一定......
  • 24.贪心算法.
    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:课程开始时间结束时间美术9:0010:00英语9:3010:30......
  • 深入理解神经网络之逻辑回归
    本文摘自《深入理解神经网络:从逻辑回归到CNN》......
  • 3.数据结构与算法复习--线性表
    线性表的定义和特点线性表是具有相同特性的数据元素的一个有限序列(a1,a2,..ai-1,ai,ai+1,...an)a1:线性起点ai-1为ai的直接前驱,ai+1为ai的直接后驱an为线性终点,当n=0时称为空表线性表同一线性表中的元素必定具有相同特性,数据元素间的关系时线性关系线性表的逻辑特征是:......
  • C#使用webview2来获取网页响应的一些内容
    想要获取webview2和网页之间的响应内容,需要在CoreWebView2InitializationCompleted事件中重写一下WebResourceResponseReceivedAsync事件,如下privatevoidwebView2_CoreWebView2InitializationCompleted(objectsender,CoreWebView2InitializationCompletedEventArgse)......
  • 园子的商业化努力:今晚8点有一场直播《大模型训练数据的一些事》
    今晚8点有一场直播《大模型训练数据的一些事》,直播介绍详见行行AI人才直播第2期:八友科技创始人梁斌博士《大模型训练数据的一些事》。欢迎大家加下面的企业微信(行行人才小秘书)到时观看直播:注:即使没有时间看直播,也可以加企业微信,在直播后可以获取回放视频地址。园子最近推出的......
  • 基于多算法融合的啸叫抑制方案总结
    前记 在对讲和本地扩音领域,啸叫抑制是一个无法绕过去的话题。怎么抑制啸叫是一个非常棘手的问题。笔者及团队在这个方向研究了好久。终于取得了一些阶段性的进展。这里做一下梳理。 心路历程 刚开始想依靠单纯的算法去解决。做了很多仿真,发现都不是很理想。不是抑制太狠了......
  • 怎么理解设备上云和设备稼动率?
    如今,在技术日新月异地发展过程中,设备上云和设备稼动率变得越来越重要。由于这些技术的迅速发展,许多人可能不理解这些术语具体是什么以及它们对业务有什么影响。在这篇文章中,我们将针对这两个关键概念进行全面的介绍,以帮助您更好地理解。什么是设备上云设备上云(Device-to-Cloud)是将......
  • 【算法】罗马数字与整型数字转换,数值范围1-4000
    编写两个函数,将罗马数字与整数值进行转换。每个函数将测试多个罗马数字值。现代罗马数字是通过从最左边的数字开始分别表示每个数字,并跳过任何值为零的数字来书写的。在罗马数字1990中,表示为:1000=M,900=CM,90=XC;从而产生MCMXC。2008被写成2000=MM,8=VIII;或MMVIII。1666年,每一个罗马......