1

算法死活记不住?大神告诉你秘诀:内化它的逻辑

 2 years ago
source link: https://developer.51cto.com/article/715819.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

算法死活记不住?大神告诉你秘诀:内化它的逻辑-51CTO.COM

算法死活记不住?大神告诉你秘诀:内化它的逻辑
作者:新智元 2022-08-08 08:48:14
我记得算法的主要部分,如果我在理解上遇到问题,我会将它们放入伪代码并根据需要修复我对算法的理解。​

​有网友诉说了自己的苦恼——

我曾经非常擅长用不同的语言写代码,可是在一年后,我就完全忘记了如何用这些语言写代码。

现在我正在尝试学习 Lua,我能看懂每一行的意思,但是到了要写出来的时候就不知道该怎么做了。

针对ta的苦恼,网友大神们纷纷给出建议。

你是说循环、变量之类的语法吗?

还是说排序、搜索、递归?这两种情况,我只有一些基本的想法,剩下的由google完成。我不记得代码,只记得我需要什么。

图片

没错,就是这个方法。

知道你需要在这里使用循环比记住循环语法更重要。

一旦你知道你需要使用什么,你就可以根据需要把语法google出来。

显然有些东西你应该记住语法,比如如何创建一个函数,如何创建不同类型的变量,如何将输出放到屏幕上......

不过随着它变得越来越复杂,只要理解这个概念,再google出来就行了。

你是指如何记住怎么写编程语言的,比如Lua、Python 或 C++ 之类的吗?

通常,就是通过写代码来记住,一段时间不写,就会忘了,然后你就需要重新去学习它们。

图片 

我做的网页设计/编程越多,我就越喜欢用「直线」方法。

只需选择你需要学习的下一个东西,并在你们之间画出最直、最快的线,然后去学习这个东西。弄清楚这一点,然后继续下一步。你需要学习的只是能让你完成任务的极少数特定的东西。你不需要成为一个完美的全栈开发人员,事实上,你可以将整个过程分解为大概10到20个核心步骤,假设它不是非常复杂的话。

我确实会阅读和研究了除此之外的编程语言,因为它们确实有助于在你的工具包中添加更多东西,并且用不同的方法来填充你的记忆,但是当涉及到实际的执行, 直线方法可能会让你快1000倍。

在条件允许的情况下,就要做减法。如果一个平台/后端主机很复杂,你需要5个小时才能弄清楚如何做最简单的事情,而这本应该用几分钟就完成,那就退后一步,看看你是否可以以某种方式简化它。

你是否需要学习3种不同的编程语言并观看4小时的视频才能完成实际上非常简单的任务?或者你能不能找到一些简单的服务器来存储你的简易数据库——它的使用和集成如此简单,以至于白痴都能很快找到它?我们并不会因为从A点到B点采取最耗时、最复杂的路线而赢得额外积分。​

我靠的是练习、谷歌和同事:)

我记住得很少,只记得帮助我找到答案的那一点面包屑。如果有好办法,请指点我一下。

我在面试时最喜欢听到的答案是——

「值得记住的东西都加了书签,其他的东西我现在很容易找到;我不需要所有的答案,但我很擅长找到它们。」

我在很多算法网站上的排名都很高。在我看来,从记忆的角度理解算法是行不通的。你需要内化它的逻辑。想想其他你知道该怎么做的事,你可能可以写下它的每一步,但你做的时候不会特意去想。比如做黄油吐司。想象一下,你有一个按钮式烤面包机。你得先烤面包,然后再涂黄油。顺序不只是你记住的东西,它是有意义的。如果你先涂上黄油,它就会滴入烤面包机底部的加热元件中。烤吐司就是一种算法。是的,你记得这些步骤,但是每个步骤和这项步骤的顺序背后都是有原因的。将此应用于您的数据结构和算法。学习简单算法背后的原理,以构建理解面试问题所需的基础知识。闪存卡式的记忆术将花费你大量的时间,而且几乎没有任何回报。

我知道算法,因为它们是解决问题的广泛技术。

每当我搞不清特定语言的确切语法时,我都会google,然后阅读文档。

Linters 和编译器错误消息通常也很有帮助。​

在过去的十年里,我已经建立了一个我称之为「个人备忘单」的笔记合集,其中包括我需要反复查找的所有内容。

开始,我用它查找rsync命令、Postgres转储/导入命令、nginx配置等,但现在我只有去查那种一两年才用到一次的晦涩内容时才会用到它。

我想说,我现在已经记住了这些东西的一半了。但是当我学习一种新的语言或概念时,拥有备忘单是关键的一步。重新找到你记忆中的SO帖子或博客文章的过程实在是太太太麻烦了。

如果你是指代码的语法,那么没有必要记住它。上网查一下就行了,很容易。

如果你指的是实际的算法(一段代码是一个算法的实现),那就不要把注意力集中在「记住它」上,要试着去分析和理解它,就像它是某种神秘的公式一样。

我说的「理解」,不是指 「能够说出每一行的作用」,而是「能够说出它为什么是这样,以及它的原理是什么」。

一旦你了解了它是如何运转的,你甚至不必记住如何去做——因为你将拥有重现它所需的所有推理能力。

如果你在维护别人的代码时,可能会发现有些代码非常晦涩,并且涉及很多间接调用和/或副作用。在这种情况下,只需问问自己该代码的输入和输出是什么。只有在你需要重构一个东西时,才需要更深入的研究。

图片

老实说,我记得以前项目的一些部分,但我并没有太费力,相反,我更关心算法的高级轮廓,比如合并排序:将一个数组拆分为2个数组,然后将这些数组拆分为另外2个数组,直到数组大小降至1,然后按顺序合并数组。

或者快速排序:选择一个枢轴,遍历数组交换值,如果它们位于枢轴的错误一侧,则大于或小于枢轴,然后对枢轴的每一侧重复执行此操作,直到每个值都是枢轴。

我记得算法的主要部分,如果我在理解上遇到问题,我会将它们放入伪代码并根据需要修复我对算法的理解。​


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK