算法解决哪三类问题排水工程有那三类

算:根据输入的数据经过一系列的计算,获得结果例如:计算一元二次方程的根、计算一些数的平均值。

找:根据输入的数据列举出所有可能的情况,并找出某一種情况例如:找出最大值、找出最短路径。

实现功能:根据输入的数据完成某项既定的任务。例如:实现“撤消”和“重做”

程序設计的第一类问题:算 国际象棋是古印度的一个大臣发现的。国王很喜欢国际象棋于是召见了他,问他要什么大臣说:如果可以的话,陛下就给我一些麦子吧!在棋盘的第一格放一粒麦子第二格放两粒麦子,第三格放四粒麦子……以此类推于是国王就叮咛属下去拿麥子,可是拿来的麦子很快就放完了如果一粒麦子的平均重量在0.02克,请算一下大臣要的这些麦子一共有多重?

“国王的麦子”问题是┅个等比数列求和的问题有两种算法解决哪三类问题体例,其一是让计算机一项一项地累加;其二是使用等比数列求和公式显然后者嘚效率会更高。

对“算”这类问题要充分利用数学工具,简化计算体例从而提高程序效率。

程序设计的第二类问题:找 字符串的查找:


输入:待查找的字符串和需要查找的单词

算法:从待查找字符串的每一个字符开始比对如有完全匹配的,则找到该单词

存储:两个芓符数组,循环控制变量等


在比对what和writer的时候,我们已经知道writer的第二个字母不是w因此下一次比较不该该从r开始,而至少应该从i开始

对“找”这类问题,应该尽可能增加查找的条件减少分支,缩小查找规模这样才能提高程序的效率。在不影响结果的正确性的前提下縮减显而易见的毛病谜底和可以预知的毛病谜底。

程序设计的第三类问题:实现功能 有n个孩子围成一个圈他们按顺时针编号依次为1到n。囿一个整数m现在从第一个孩子开始顺时针数m个孩子,则那个孩子离开这个圈从下一个孩子继续数m个孩子,则他也会离开这个圈如此繼续,直到最后剩下的孩子胜出如果知道孩子的个数n和整数m,请预测一下编号为几多的孩子会胜出


输入:小孩的个数和整数m

输出:最後胜利的孩子编号

算法:利用链表的形式,将表头和表尾相连每个结点暗示一个孩子。每淘汰一个孩子就删除一个结点,直到只有一個结点

存储:参照链表,使用结构类型


在算法解决哪三类问题“实现功能”类的问题时,要采取合适的体例和数据存储体例尽量用矗观的体例来算法解决哪三类问题问题。

在包管结果正确的情况下应尽量选择简洁高效的体例,避免复杂的体例和冗余的操作以免影響程序的运行效率。

}

编者按:本文来自微信公众号莋者 李亮;36氪经授权转载。

人生算法算法解决哪三类问题着三种人生难题:1)问题明确,如何算法解决哪三类问题2)有大概方向,如哬前进3)目标不明确,当下如何做

正如那句谚语「在手里拿着铁锤的人看来,世界就像一颗钉子」现代教育划分学科的做法让受过高等教育的人相信,世界正是用他们学科解释的那样运作着:在只学统计学的人看来世界是各种概率的集合;在只学生物学的人看来,卋界是各种生态系统的集合;而在只学工程学的人看来世界也不过是各种零部件组装起来的罢了。

这样将任何事物都归为某一学科符匼大脑「认知吝啬鬼」的特点,可以极大地降低大脑的认知负荷但认知科学早有研究,这样看待事物会出现很严重的「认知偏差」换呴话说,真实的世界在你眼中变得扭曲了

所以,跨越学科的边界看看别的学科如何思考问题,有助于修正认知偏差更全面地看待事粅。「他山之石可以攻玉」从别处借鉴过来的思想,也许正好可以算法解决哪三类问题你当下的问题和困惑

基于这样的出发点,这篇攵章想和你探讨一下计算机科学中的核心——算法谈谈从算法的视角来看,如何算法解决哪三类问题人生的种种难题

看到「算法」这個词,你是不是一下子紧张了起来以为本篇文章要罗列一大堆代码或者数学公式呢?你大可放心本篇不会涉及具体的代码或者数学公式。虽然计算机科学和数学的从业者必须要学会如何用代码和数学公式来表示算法——那是精确描述算法的语言但对于普通读者来说,悝解算法的思想换个角度看待这个世界,就是一个很好的开端如果你看完之后,对算法产生了兴趣想要进一步了解,这时再去接触那些独特的语言也不迟

算法其实无处不在。比如说如何安排一次出行的行程你如何安排一天的时间分配?你如何选择职业的发展方向实现「弯道超车」?……这些其实都是算法。

在计算机科学领域算法是用来描述一种有限、确定、有效的并适合用计算机程序来实現的算法解决哪三类问题问题的方法。泛化一些来说算法其实指的是在一定情况下可以实际算法解决哪三类问题问题的方法。比如说伱以交通和住宿的费用来确定旅行的行程,那么价格的排序就是旅行的算法什么时候有特价机票,哪个地方住宿便宜这些因素决定了伱如何旅行。又比如你用任务的重要和紧急程度来安排一天的时间,那么对于任务重要和紧急程度的排序就是当天处理事务的算法。洏对于以「弯道超车」为职业发展目标的人而言你从事不同职业在一定时间内发展速率的排序,就是它的算法

「最小价格」「最重要」「最紧急」「最快速度」……你会发现,无论是哪种算法(当然排序算法仅仅是算法中的一小部分),其本质都是在限定范围内寻求「最」

也许你听过数学家高斯的那个故事。当别的同学还在逐一计算从 1 加到 100 的时候高斯另辟蹊径,以乘法代替加法最先算出 5050。此时乘法是一种实现目标时间最短的算法。从现实世界来看Google 搜索引擎打败其他商业搜索引擎,正是因为 Google 的 PageRank 算法可以给用户提供最精准的搜索结果

所以,用算法来思考人生本质上就是寻找在有限的时间内哪种方法可以最快且行之有效地算法解决哪三类问题当下问题。单位時间内算法解决哪三类问题的问题越多你的人生也便拥有更大的可能性。所以人生算法只有一个目标——寻求「最」而这一点,经过數十年的发展在计算机领域里面有一些公认的经典算法,他们可以很有效地算法解决哪三类问题一些问题

这里,就和你介绍三个关于「最」的算法

最能算法解决哪三类问题确定问题的算法——分治法

MIT 的 认知科学家 Josh 证明,人类最佳的抽象知识结构是树形结构麦肯锡的金字塔原理也是按照树形结构来拆解问题,算法解决哪三类问题问题而在计算机领域也有类似的结构,它被称作分治法(divide and conquer)

分治,顾洺思义分而治之。即将无法着手算法解决哪三类问题的大问题首先拆分成一系列规模较小的相同或相似的问题然后逐个算法解决哪三類问题小问题。通过算法解决哪三类问题完每个小问题来算法解决哪三类问题整体的大问题这就是分而治之。分治法产生的子问题与原始问题相同只是规模减小,反复使用分治方法可以使得子问题的规模不断减小,直到能够被直接求解为止

什么样的问题可以采用这種思路来求解呢?比如 NBA 季后赛的赛程就符合这样的思路

如图,征战 NBA 季后赛的球队总共有 16 支如何在 16 支球队里面选出最优的那一个?如何矗接让 16 支球队两两比赛然后计算最优,那这个问题的复杂程度会大大增加所以为了降低复杂程度,减小难度赛制将这些球队划分为東部和西部两个赛区,而在赛区里面又进一步拆分,最终确定了比赛的队伍

这样将大问题「16 支球队里面哪支最好」拆解为较小的问题「西部球队里面哪支最好?」然后反复应用分治,再拆解为「勇士和开拓者哪支球队更好」,就是分治法

你可以发现,用分治法算法解决哪三类问题问题有三个步骤:

1、将问题逐步拆解直到最后拆解为若干个可以算法解决哪三类问题的小问题,每个小问题和大问题類似;(「从 16 支球队里面选最优」->「从 8 支球队里面选最优」->「从 2 支球队里面选最优」)

2、逐一算法解决哪三类问题这些小问题;(每两支浗队进行一场比赛)

3、将这些小问题的解答合并最终获得原始大问题的解答。(「16 进 8」->「8 进 4」->「半决赛」->「决赛」)

应用分治法一般絀于两个目的:一是通过分解问题,使无法着手算法解决哪三类问题的大问题变成容易算法解决哪三类问题的小问题;二是通过减小问题嘚规模降低算法解决哪三类问题问题的复杂度(或计算量)。

而且应用分治法也需要有前提,即问题是明确的你知道问题应该如何算法解决哪三类问题,或者问题如何被拆解到可以算法解决哪三类问题的程度比如,类似「如何在行业内成为 TOP 级别的人才」就属于这样嘚问题首先,达成目标所需要技能和能力你大致是清楚的如何掌握和拥有该种技能和能力的路径也是清晰的,这时你需要做的就是鼡分治的算法,去逐一算法解决哪三类问题每个小问题最终合并起来,算法解决哪三类问题整个的大问题

探寻最短算法解决哪三类问題路径的算法——动态规划

对于确定性的,知道如何算法解决哪三类问题但因为规模庞大或者特别复杂而难以算法解决哪三类问题的问題,适合使用分治法但人生有时的难点在于,算法解决哪三类问题问题的方法并非是确定的

比如你想要算法解决哪三类问题的问题是——如何实现财务自由。对于这样的问题目标是清晰的,即「被动收入 ≥ 主动收入」但实现的路径却是多种多样。比如你既可以选择通过理财投资复利增长的方法实现,也可以通过创造出可以盈利的产品来实现又或者,你选择投资学习期待学习带来主业上的进步,继而带来薪资上的增长

当然,你可以采用分治的方法去逐个尝试比如先创造不同的产品,然后再尝试不同的理财和投资最终通过種种方法的组合,最终达成目标然而,这样的做法不仅会花费大量的时间而且在任何一个领域都是浅尝辄止,难以深入最终的结果,可能是流于表面反而难以达到目标。那么该怎么做呢你可以借鉴算法里面动态规划的思想来看待这件事。

动态规划(dynamic programming)是算法解决哪三类问题多阶段决策问题常用的最优化理论该理论由美国数学家 Bellman 等人在 1957 年提出,用于研究多阶段决策过程的优化问题

这个方法简单來说,就是在当前状态下想要进入下一阶段,什么样的选择是最优的而且随着状态的变化,路径也会随之发生改变比如当你处在没囿积蓄的状态时,通过业绩的增长来获得收入的增长是一个不错的选择;而当你有了一定的积蓄职业发展也随之稳定的时候,如何使用積蓄和业余时间决定了怎样进入下一个阶段

和分治法一样,动态规划算法解决哪三类问题复杂问题的思路也是对问题进行分解通过算法解决哪三类问题了一个个子问题,进而算法解决哪三类问题整个问题但和分治法不一样的是,动态规划不是按照「小问题和大问题相姒」这样的思路去拆分的而是按照阶段划分的。

比如在实现财务自由这件事情里,你可以这样划分阶段:第一阶段算法解决哪三类問题温饱问题;第二阶段有一些储蓄,考虑储蓄如何使用的问题;第三阶段如何进一步扩大储蓄或者资产……这样,就将一整个问题拆汾成了一个个阶段

动态规划方法的原理就是把多阶段问题转化为一系列的单阶段问题,然后利用各个阶段之间的递推关系逐个确定每個阶段的最优化决策,最终堆叠出多阶段决策的最优化决策结果

动态规划中,前一个阶段的结果影响着现阶段的决定比如你在一个行業已经深耕了 10 年,获得很好的成就那么当你向着下一个阶段进发的时候,就不得不考虑原来的积累需要将上一个阶段的结果作为这一個阶段的起点来考量。

这就是动态规划视角下的人生当前的决策受到之前决策的影响,下个阶段的决策也会因为这次决策而发生改变運用动态规划的思路,就是在这条决策链里面实时调整从当下出发,求得每个阶段最优的那个解

最能算法解决哪三类问题目标不清晰嘚算法——贪婪选择

动态规划划分了阶段,在每个阶段根据可选项进行最优化的选择然而它是基于一个三有前提——有目标,有阶段囿路径。

比如追求财务自由的过程中,你知道自己的目标(被动收入≥主动收入)也知道自己所处的阶段(各种收入的多寡),还知噵实现的路径(创造作品或者理财投资)你要做的是根据整体的目标,选择每个阶段最优的行动

然而现实生活中还有很多问题,并非這么理想比如某个阶段的选择过多,又比如整体的目标不甚清晰当下人工智能的发展,符合这一现状

当下人工智能发展火热,人人嘟知道人工智能会越来越强大但人人都不知道它什么时候可以到下一个阶段,又或者进入下一个阶段的路径实在太多不知从何着手。

這个时候不妨采用算法中贪婪选择的思路来看待这个问题。

贪婪法(greedy algorithm)是寻找最优解问题的常用方法这种方法模式一般将求解过程分荿若干个步骤,在每个步骤都应用贪心原则选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果吔是最好或最优的解贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况

同样昰寻求当下最优的算法解决哪三类问题方案,贪婪选择和动态优化的区别在于动态优化着眼于所有阶段,而贪婪仅仅关注当下最优

这僦好比是去吃自助餐晚宴,采用动态规划的人会这样思考:在不影响晚上睡眠、消化、或者体重大幅增重的情况下我如何吃到总价值最夶的美食?而贪婪呢就是我们通常意义上的「扶墙进、扶墙出」,不管后续在当下情况下能吃下多少就吃下多少。

采用贪婪选择毫无疑问是一种短视行为但作为计算机常用算法,它自然有着独到之处即不用去计算每一种可能性,然后再得出一个最优解而是节省大量计算资源,专注于当下也就是俗称的「摸着石头过河」。

在这种情况下每一次行动或者选择,都是在河水中寻找下一块石头下一塊石头,就是我们的最优选择这个时候,我们不管整体的过河路径也不考虑整体的过河时间,只要找到下一块石头那么我们就知道峩们在前进。

回到前面的人工智能面对这样的新生事物,我们只能总结过往向未来探索。我们不知道它的下一个阶段是什么也不知噵有什么具体的路径可以达到那个阶段。我们做的只能是贪婪选择,寻找一块又一块的石头以期待最终过河。

当然大多数情况下,甴于选择策略的「短视」整体的路线看起来是一个曲折的过程,而最终的目标可能也和我们真正想要的目标想去甚远,但是在没有更恏的情况下贪婪选择可以得到近似最优解——毕竟,还是过河了不是吗

人生算法,算法解决哪三类问题着三种人生难题:1)问题明确如何算法解决哪三类问题?2)有大概方向如何前进?3)目标不明确当下如何做?

对应这三种状态算法给出了三种算法解决哪三类問题方案:分治、动态规划、贪婪选择。希望你可以从中获得启发

然而,无论是被验证多少次的算法也仅仅是算法,是一种思考的方法而真正的人生,还是要我们自己一步步走下去不断根据当前的情况进行动态优化,贪婪地寻找当下最好的方案最终分而治之,算法解决哪三类问题人生的大问题■

}

我要回帖

更多关于 算法解决哪三类问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信