您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

算法设计的5种通用方法

时间:2020-08-04 15:33:01  来源:  作者:

从广义上讲,很多算法解决问题的思路是相同的。因此,为了方便,通常按照算法采用的方法和思路来给它们分类。这样给算法分类的一个原因是:如果我们理解了它采用的一般思路我们常常就能够对该算法获得一些深入的了解。在解决一些没有现成算法求解,但与现有问题类似的问题时,我们从中可以得到一些启发和灵感。当然,有些算法有悖于分类原则,而另一些则是多种方法相结合的产物。这一节将介绍一些常用的方法。

1 随机法

算法设计的5种通用方法

 

随机法依赖于随机数的统计特性。一个应用随机法的例子是快速排序。

快速排序按如下方式工作:设想要对一堆作废的支票排序,首先将无序的一整堆分成两部分。其中一堆里使所有的支票号码都小于等于所设定的一个中间值,另一堆里保证所有的支票号码都大于这个中间值。一旦有了这样的两堆支票后,就再以同样的方式对这两堆支票重复刚才的划分过程,直到每一堆里都只有一张支票为止。这个时候所有的支票就都排好序了。

为了获得较高的性能,快速排序依赖于每一次要如何划分支票,我们需要让划分出的两堆支票数量几乎相同。为了实现这一步,理想的方法是在划分支票之前首先找到支票号码的中间值。可是为了确定这个中间值需要遍历所有的支票,因此我们并不打算这么做。作为替代的方法,随机选择一个支票号码作为划分的依据。快速排序的平均性能很不错,因为随机数的正态分布使得划分的结果是相对平衡的。

2 分治法

算法设计的5种通用方法

 

分治法包含3个步骤:分解、求解与合并。在分解阶段,将数据分解为更小、更容易管理的部分。在求解阶段,对每个分解出的部分进行处理。在合并阶段,将每部分处理的结果进行合并。一个分治法的例子是归并排序。

归并排序按照如下方式工作。如前所述,同样假设要排序一堆作废的支票。首先将无序的一整堆分成两半,下一步分别将两堆支票再各自分成两半,一直持续这个步骤直到每一堆中都只有一张支票为止。一旦所有堆中都只有一张支票时,就将其两两合并且保证每一个合并后的新堆都是有序的。一直做两两合并直到重新得到一大堆,此时所有的支票就都已经排好序了。

在所有的分治算法中都有相同的三个步骤。归并排序能以以下方式来描述,首先,在分解阶段将数据划分为两份。接下来,按照递归的方式对分解出的两部分应用归并排序。最后,在合并阶段将两部分合并成一个排好序的集合。

3 动态规划

算法设计的5种通用方法

 

动态规划同分治法类似,都是将较大的问题分解为子问题最后再将结果合并。然而,它们处理问题的方式与子问题之间的关系有关。在分治法中,每一个子问题都是独立的。为此,我们以递归(见第3章)的方式解决每一个子问题,然后将结果与其他子问题的结果合并。在动态规划中,子问题之间并不是独立的。换句话说,子问题之间可能有关联。这类问题采用动态规划法比分治法更合适。因为若用分治法来解决这类问题会多做很多不必要的工作,有些子问题会重复计算多次。尽管动态规划法是一种重要的思想且很多算法都利用了这种思想,但本书介绍的算法中都没有使用到它。

4 贪心法

算法设计的5种通用方法

 

贪心法在求解问题时总能够做出在当前的最佳选择。换句话说,不是从整体最优上考虑,而仅仅是在某种意义上的局部最优解。遗憾的是,当前的最优解长远来看却未必是最优的。因此,贪心法并不会一直产生最优结果。然而,在某些方面来说,贪心法确是最佳选择。一个采用贪心法的例子是霍夫曼编码(见第14章),这是一个数据压缩算法。

霍夫曼编码中最重要的部分是构建一棵霍夫曼树(又称最优二叉树)。为了构建一棵霍夫曼树,从它的叶子节点自底向上处理。将每个要压缩的符号和它们在数据中出现的次数(频率)一起作为二叉树的根节点保存。接下来,选择两棵拥有最小频率值的根节点作为左右子树节点,构造一棵新的二叉树,且保证新的二叉树根节点的频率值为左右子树节点的频率值之和。然后重复这个步骤,直到得到唯一的一棵树,这就是最终的霍夫曼树。霍夫曼树的根节点包含数据中符号的总数,叶子节点包含原始的符号以及它们出现的频率。霍夫曼编码是一种贪心算法,因为每次它都会挑选出当前最合适的两棵树来合并。

5 近似法

算法设计的5种通用方法

 

并不计算出最优解,相反,它只计算出“足够好”的解。通常利用近似法解决那些计算成本很高又因为其本身十分有价值而不愿放弃的问题。推销员问题(见第16章)是一个通常会用近似法去解决的问题。

设想一位推销员需要设计一条去往好几个城市工作的路线。推销员问题的目的是找到最短的可能路径,以便推销员能够在回到出发点前恰好每座城市都只去过一次。由于推销员问题可能存在一种最优的策略,但计算的代价很高,因此可以采用启发式的方法得到一个近似解。当最优策略行不通时,启发式的方法是我们能够接受的一种比最优策略稍逊一些的策略。

推销员问题可以用图表的方式来描绘。把推销员必须前往的城市在格子中用点标记出来。然后按照如下启发式的方法来寻找这些点之间的最短路径。从推销员出发的位置开始只有一个点,将这个点涂黑。所有其他的点在加入路线图之前都是白色的,当它们加入时也同样涂黑。接下来,对于每一个还没有加入到路线图中的点v,计算最后一个加入到路线图中的点u和v之间的距离。通过这种方法,选择离u最近的那个点,将其涂黑并加入路线图中。重复这个过程直到所有的点都已经涂黑。最后,再次将出发点加入路线图使其闭合,这样就完成了整个路线图。



Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Tags: 算法  点击:(1)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  Tags: 算法  点击:(7)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 算法  点击:(16)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  Tags: 算法  点击:(24)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  Tags: 算法  点击:(32)  评论:(0)  加入收藏
随着注册制的加速推进,新股越来越多,截止到今天A股上市公司的总数高达4500余家,A股一直就是重融资,轻投资的市场,而上市公司发行可转债这种再融资的(圈钱方式)是最能让普通投资者接...【详细内容】
2021-11-05  Tags: 算法  点击:(97)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  Tags: 算法  点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  Tags: 算法  点击:(36)  评论:(0)  加入收藏
每个人都有过这样的经历:打开手机准备回消息或打电话,一看到微信图标右上方的小红点,于是忍不住先打开微信;看完微信,不知不觉又被另一个App牵引,直到关闭手机屏幕才发现自己早已...【详细内容】
2021-11-03  Tags: 算法  点击:(30)  评论:(0)  加入收藏
文丨互联网怪盗团在互联网行业,尤其是在投资人心目中,往往存在一种“算法迷信”或曰“技术迷信”:某公司的广告变现做得好,一定是因为有算法;某公司的云计算业务开展的好,也是因为...【详细内容】
2021-11-03  Tags: 算法  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条