如何解决任何算法
本文最初发表于jarednielsen.com
1992 年,玛丽·奥利弗出版了第 133 首诗《夏日》,诗的结尾向读者提出了一个问题:
告诉我,你打算如何度过你这狂野而宝贵的一生?
你打算怎么办?你这疯狂而宝贵的一生,难道要一遍又一遍地解决同一个问题吗?或者更糟的是,你还在解决错误的问题?
我们希望更聪明地工作,而不是更努力地工作。
我们该怎么做呢?
幸运的是,有一种老派的解决问题的方法至今仍然适用。它叫做“你永远猜不到……”
如何解决
在《如何解决问题》一书中,乔治·波利亚概述了解决问题的四个步骤:
-
了解问题。
-
制定计划。
-
执行计划。
-
评估结果。
理解问题
如果你是一位优秀的开发人员,你就会意识到,最好的解决方案源于倾听客户讲述他们的故事。许多算法都伪装成故事问题,例如农夫需要把鸭子、玉米和狐狸过河。但是!他一次只能带其中一件东西过河。如果不带,鸭子会吃掉玉米,狐狸会吃掉鸭子。他该如何把所有东西都带过去呢?
故事时间。
也就是用户故事时间。
是的,我知道。
他们很尴尬。
他们感觉像是在工作,不是吗?
但事实是,它们有效!
用户故事的格式为:
AS A < USER OF SOME SORT >
I WANT < TO DO THIS >
SO THAT < MY EXISTENCE IS VALIDATED >
在我们上面的农民例子中:
AS A farmer
I WANT to ferry my duck, fox, and corn across the river
SO THAT we all live happily ever after
将问题重新定义为用户故事,可以很容易地编写验收标准。
验收标准的格式为:
GIVEN < APPLICATION >
WHEN < I DO THIS >
THEN < I EXPECT THE APP TO DO THAT >
在我们上面的农民例子中:
GIVE three items that will eat each other
WHEN I ferry one item across the river
THEN the other two are safe
制定计划
波利亚启发式方法的下一步是制定计划。
又名伪代码。
您编写的是伪代码,不是吗?
编写伪代码就像为设计绘制草图。
这是您的简单概念证明。
这是您的发现阶段、您的用户研究、您的市场验证。
这是你的路线图。
这也是函数的注释。只需在每行中添加 // 即可。
执行计划
表演时间到了!
在理解了所有这些问题并制定了计划之后,是时候动动手指,掸掉键盘上的灰尘,开始写代码了!这部分会很容易,为什么?因为你写的是伪代码!现在你需要做的就是把这些简单的语言翻译成 JavaScript、Python 或(打个寒颤)Java。然后按下 Enter 键……
评估计划
你的计划成功了吗?
如果没有,则返回步骤 1。
如果是的话,你能做得更好吗?
如何用计算思维来解决这个问题
上述步骤是解决问题的基本步骤,可以应用于任何领域。如果你想成为专业人士,你需要融入博格人,学习如何像计算机一样思考。计算思维分为四个主要阶段:
-
分解
-
概括
-
抽象
-
算法
分解
如果说函数组合是组装各种组件(例如变量、控制流和条件)的过程,那么分解则恰恰相反:它将问题分解成更小的部分。分解是整个过程中最简单也是最难的一步,因为有时问题的组成部分显而易见,但有时这些组成部分是自然形成的,或者相互交织的,很难清晰地将它们区分开来。
我们的农民如何分解?
嗯,是的,他制作堆肥。
他也仔细思考了这个问题。
如果只有一件物品,他只需把它扛过河即可。
如果有两件物品,他需要扛着一件过河,然后回来拿第二件物品过河。
如果有三个呢?他仍然需要扛一个过河,但他需要确保剩下的两个不会互相破坏,或者说,不会分解。仔细思考他的物品后,他发现只有一个组合可以安全地留下:狐狸🦊和玉米🌽。鸭子才是问题的关键!🦆他意识到他必须先扛鸭子过河。
当他回来拿第二件物品时,他会选择什么?没关系。两者都可以留下,也不能和鸭子一起留下。
你看出其中的规律了吗?
概括
在分解农民问题时,我们发现了解决方案的一些关键组成部分:
-
条件语句
-
重复
-
逻辑
换句话说,我们认识到了模式。
一个值得习惯性地问自己的问题是:我以前在哪里见过这个或类似的东西?
抽象
一旦我们识别出模式,我们就可以删除细节或形成抽象。
如果不是农民呢?如果是律师呢?他们有三个客户,彼此会互相吞噬,而且他们还得穿过城镇去法院。
或者,如果它是一架将生命形式运送到另一个星球的航天飞机,我们需要找到碳和氧气生产者的正确组合?
它是谁、是什么已经不再重要,重要的是我们可以去掉细节,形成一个概念模型,关注概念之间的关系。
算法
现在我们只需要编写一系列可重复的步骤来解决我们的问题,并像上面一样评估其成功率。
我们以前在哪里见过这个或类似的东西?
🤔
如何解决任何算法
你可以运用波利亚的启发式和计算思维来解决任何算法。就像你的健康或退休一样,学习算法没有捷径。动手实践,熟能生巧。
给自己一个 A。快去买一本《A 代表算法》吧
如果您想了解最新情况,请订阅我的时事通讯《解决方案》。
文章来源:https://dev.to/nielsenjared/how-to-solve-algorithms-2jo9