91download.com supports a wide range of platforms, including YouTube, Facebook, Twitter, TikTok, Instagram, Dailymotion, Reddit, Bilibili, Douyin, Xiaohongshu and Zhihu, etc. Click the download button below to parse and download the current video
当我们面对一个需要猜测三字母单词的游戏时,你可能会如何策略性地解决呢?是简单地按照字母表顺序逐一尝试,还是另有高招?
想象一下,如果你正在玩这样一个单词游戏:你只需要猜测由三个字母组成的单词。你会采用什么策略来找出所有的单词呢?一种方法可能是按字母表顺序猜测,从A开始,然后是B、C,以此类推,直到找到完整的单词。
然而,我们是否可以更聪明一些?为什么不按照字母在英语中出现的频率顺序来猜测呢?这两种方法最终都能找到正确的答案,但它们都不是特别聪明或高效。这些解决方案每次都做同样的事情。
这些解决方案没有考虑到利用新信息来指导下一步的操作。比如,如果单词的最后一个字母是E,我们应该如何利用这个信息?为此,我们需要一种新的控制流称为选择(selection)。在我们程序的控流中,我们已经看到了顺序执行,其中一个步骤紧跟另一个步骤。
选择允许我们的控制流分支。我们提出一个是非问题,然后根据这个问题的答案,我们选择继续沿着哪个分支前进,完全跳过另一个分支。
在我们的单词游戏中,我们可能会先猜测字母E,然后暂停下来考虑我们可用的信息,并根据这些信息决定下一步该怎么做。我们将使用控制流图来模拟所有可能的路径。这里我们问一个问题:单词中是否有E?如果答案是否定的,我们想要继续寻找元音,所以我们会猜测A。如果答案是肯定的,那么下一个最佳猜测取决于这个E是单词的第一个、第二个还是第三个字母。
这个过程比我们最初的两个过程要复杂得多,但我们可以清楚地看到,这个过程更有可能在更少的猜测中找到正确的单词。在计算机科学中,我们刚刚讨论的所有这些过程被称为算法。算法只是一个可重复的过程,用于完成特定任务。
作为程序员,我们在开始编写代码之前,通常会花费大部分时间来设计、评估和迭代我们的算法。在编程中,对于一个问题总是有多个解决方案。为了评估哪个算法最适合特定用例,我们会考虑三个特性:正确性(算法是否完成任务)、效率(完成任务需要多长时间)和可读性(过程有多复杂,别人理解起来有多难)。
通常没有一个客观的最好解决方案。这取决于你如何评估这些权衡。例如,如果我设计一个搜索算法,当有人搜索“学习音乐”时,我返回的是一些非常激烈的德国低音播放列表,那么我的算法的正确性可能就有点偏离了目标。如果有人搜索一个非常普通的词“the”,而我的数据库中有1000万首歌,那么找到所有包含“the”这个词的歌曲可能需要很长时间,这使我的算法效率不高。
在这种情况下,我可能会选择牺牲一些正确性以获得效率。例如,我可能只选择最常见的20首歌,而不是寻找所有包含“the”的歌曲。如果我设计一个路线查找算法,技术上从A点到B点最快的方式可能是经过20个不同的弯道,根据红绿灯的变化改变方向,这种方法虽然正确且高效,但可读性不佳。如果告诉你的朋友这样的路线,他们可能无法理解。
也许还有另一种选择,比如走一条没有弯道的背路,速度限制稍低,但更容易阅读。如果效率的权衡很小,比如这条路需要10分钟,而另一条路只需要8分钟,那么也许这条路是更好的选择。
在设计具有顺序和选择的算法时,我们应该始终牢记这些权衡。这把我们带到了下一步:将我们的选择算法翻译成代码。在接下来的内容中,我们将探讨如何将理论转化为实践,以及如何在实际编程中实现这些算法。
Share on Twitter Share on Facebook