如何解决任何算法

2025-05-28

如何解决任何算法

本文最初发表于jarednielsen.com

1992 年,玛丽·奥利弗出版了第 133 首诗《夏日》,诗的结尾向读者提出了一个问题:

告诉我,你打算如何度过你这狂野而宝贵的一生?

你打算怎么办?你这疯狂而宝贵的一生,难道要一遍又一遍地解决同一个问题吗?或者更糟的是,你还在解决错误的问题?

我们希望更聪明地工作,而不是更努力地工作。

我们该怎么做呢?

幸运的是,有一种老派的解决问题的方法至今仍然适用。它叫做“你永远猜不到……”

如何解决

《如何解决问题》一书中,乔治·波利亚概述了解决问题的四个步骤:

  1. 了解问题。

  2. 制定计划。

  3. 执行计划。

  4. 评估结果。

理解问题

如果你是一位优秀的开发人员,你就会意识到,最好的解决方案源于倾听客户讲述他们的故事。许多算法都伪装成故事问题,例如农夫需要把鸭子、玉米和狐狸过河。但是!他一次只能带其中一件东西过河。如果不带,鸭子会吃掉玉米,狐狸会吃掉鸭子。他该如何把所有东西都带过去呢?

故事时间。

也就是用户故事时间。

是的,我知道。

他们很尴尬。

他们感觉像是在工作,不是吗?

但事实是,它们有效

用户故事的格式为:

AS A < USER OF SOME SORT >
I WANT < TO DO THIS >
SO THAT < MY EXISTENCE IS VALIDATED >
Enter fullscreen mode Exit fullscreen mode

在我们上面的农民例子中:

AS A farmer
I WANT to ferry my duck, fox, and corn across the river
SO THAT we all live happily ever after
Enter fullscreen mode Exit fullscreen mode

将问题重新定义为用户故事,可以很容易地编写验收标准。

验收标准的格式为:

GIVEN < APPLICATION >
WHEN < I DO THIS >
THEN < I EXPECT THE APP TO DO THAT >
Enter fullscreen mode Exit fullscreen mode

在我们上面的农民例子中:

GIVE three items that will eat each other
WHEN I ferry one item across the river
THEN the other two are safe
Enter fullscreen mode Exit fullscreen mode

制定计划

波利亚启发式方法的下一步是制定计划。

又名伪代码。

您编写的是伪代码,不是吗?

编写伪代码就像为设计绘制草图。

这是您的简单概念证明。

这是您的发现阶段、您的用户研究、您的市场验证。

这是你的路线图。

这也是函数的注释。只需在每行中添加 // 即可。

执行计划

表演时间到了!

在理解了所有这些问题并制定了计划之后,是时候动动手指,掸掉键盘上的灰尘,开始写代码了!这部分会很容易,为什么?因为你写的是伪代码!现在你需要做的就是把这些简单的语言翻译成 JavaScript、Python 或(打个寒颤)Java。然后按下 Enter 键……

评估计划

你的计划成功了吗?

如果没有,则返回步骤 1。

如果是的话,你能做得更好吗?

如何用计算思维来解决这个问题

上述步骤是解决问题的基本步骤,可以应用于任何领域。如果你想成为专业人士,你需要融入博格人,学习如何像计算机一样思考。计算思维分为四个主要阶段:

  • 分解

  • 概括

  • 抽象

  • 算法

分解

如果说函数组合是组装各种组件(例如变量、控制流和条件)的过程,那么分解则恰恰相反:它将问题分解成更小的部分。分解是整个过程中最简单也是最难的一步,因为有时问题的组成部分显而易见,但有时这些组成部分是自然形成的,或者相互交织的,很难清晰地将它们区分开来。

我们的农民如何分解?

嗯,是的,他制作堆肥。

他也仔细思考了这个问题。

如果只有一件物品,他只需把它扛过河即可。

如果有两件物品,他需要扛着一件过河,然后回来拿第二件物品过河。

如果有三个呢?他仍然需要扛一个过河,但他需要确保剩下的两个不会互相破坏,或者说,不会分解。仔细思考他的物品后,他发现只有一个组合可以安全地留下:狐狸🦊和玉米🌽。鸭子才是问题的关键!🦆他意识到他必须先扛鸭子过河。

当他回来拿第二件物品时,他会选择什么?没关系。两者都可以留下,也不能和鸭子一起留下。

你看出其中的规律了吗?

概括

在分解农民问题时,我们发现了解决方案的一些关键组成部分:

  • 条件语句

  • 重复

  • 逻辑

换句话说,我们认识到了模式

一个值得习惯性地问自己的问题是:我以前在哪里见过这个或类似的东西?

抽象

一旦我们识别出模式,我们就可以删除细节或形成抽象。

如果不是农民呢?如果是律师呢?他们有三个客户,彼此会互相吞噬,而且他们还得穿过城镇去法院。

或者,如果它是一架将生命形式运送到另一个星球的航天飞机,我们需要找到碳和氧气生产者的正确组合?

它是谁、是什么已经不再重要,重要的是我们可以去掉细节,形成一个概念模型,关注概念之间的关系。

算法

现在我们只需要编写一系列可重复的步骤来解决我们的问题,并像上面一样评估其成功率。

我们以前在哪里见过这个或类似的东西?

🤔

如何解决任何算法

你可以运用波利亚的启发式和计算思维来解决任何算法。就像你的健康或退休一样,学习算法没有捷径。动手实践,熟能生巧。

给自己一个 A。快去买一本《A 代表算法》吧

如果您想了解最新情况,请订阅我的时事通讯《解决方案》

文章来源:https://dev.to/nielsenjared/how-to-solve-algorithms-2jo9
PREV
早上早起:怎么做?为什么?我的睡眠时间表简介:为什么要早起?🎊重头戏来了🎊 如何早起?
NEXT
我的 Git 别名