[译]如何提高你的数据结构、算法以及解决问题的能力

如何提高你的数据结构、算法以及解决问题的能力

Source: [Arafat Khan]()

这篇文章借鉴了我过去在学校一个学期的我的经历和挑战,当我进入学校的时候,我对任何 DSA(数据结构和算法)和解决问题的策略几乎一无所知。做为一名自学成才的程序员,我对通常编程会更加熟悉和温馨,例如面向对象编程,而不是 DSA 问题所须要的解决问题的能力。前端

这篇文章反映了我整个学期的经历,并包含了为了快速提升数据结构、算法和解决问题的能力而求助的资源。node

面临问题:你知道原理,可是你被实际应用卡住了

我在学期初期的时候遇到这个问题,当时我不明白我哪里不懂,这是一个特别严重的问题。我对这个理论很了解,例如,什么是链表,它是如何工做的,它的各类操做和时间复杂度,它支持的 ADT(抽象数据类型),以及如何实现 ADT 操做。android

可是,因为我不明白我哪里不懂,因此我没法肯定我对它的理解和在实际应用中解决问题的差距。ios

不一样类型的问题

一个数据结构问题的例子:描述如何在链表中插入一个节点并说明时间复杂度。git

这是一个算法问题:在旋转数组中查找元素并说明时间复杂度。程序员

最后是解决问题的疑虑,我认为比以前两个问题的级别更高,这可能须要简要描述一个场景,而且列出问题的要求。在考试中,可能会要求你对解决方案进行描述。在编程比赛中,可能会要求你在不明确提供任何的数据结构和算法的状况下提交可运行的代码。换句话说,它们但愿你能使用最适合的数据结构和算法来尽量有效地解决问题。github

如何提高你的数据结构、算法和解决问题的能力。

我主要使用三个网站来练习:HackerRankLeetCodeKattis。它们很是类似,特别是前两个,但不彻底相同。我发现每一个网站的侧重点略有不一样,每一个网站都以本身的方式为用户提供最大化的帮助。算法

我将解决问题所需的技能大体分为:编程

  1. 数据结构知识
  2. 算法知识
  3. 数据结构和算法知识的应用

前两个被视为”基元“或构建块,第三点就涉及如何将数据结构和算法应用于特定的场景。后端

数据结构知识

在这方面,我发现 HackerRank 是一个宝贵的资源,它有一个专门用于数据结构的部分,你能够按类型过滤,好比数组、链表、(平衡)树、堆 ......

这些问题与其说是关于如何解决问题,不如说是如何处理数据结构。例如:

  1. 数组:数组旋转数组操做
  2. 链表:反转链表循环检测
  3. 树:节点交换二叉搜索树的验证

你明白了,有些问题可能永远都不会直接适用于解决问题。但它们很是适合概念性理解,这在任何状况下都是很是重要的。

HackerRank 没有可自由访问的”模型解决方案“,尽管讨论部分时常充满了提示、线索、甚至是可用的代码片断。到目前为止,我发现这些是足够的,虽然你可能须要在集成开发环境中一行一行地执行代码才能真正地理解某些内容。

算法知识

HackerRank 也有一个算法部分,尽管我更喜欢用 LeetCode。我发现 LeetCode 上的问题涉及范围更广,而且我真正喜欢的是,许多问题的解决方案中都带有详解甚至是时间复杂度的说明。

从 LeetCode 上点赞前 100 的问题开始学习是一个很好地开始。如下是一些我认为很好的问题:

与数据结构问题不一样,这里的侧重点并非处理或操做数据结构,而是如何作一些事。例如:“帐户合并”问题主要就是并查集算法的应用。“搜索旋转排序数组”问题提出了二分查找的变形。有时你会学习一种全新的解决问题的技巧。例如:“滑窗窗口”解决方案用于“最长连续递增序列”问题。

数据结构和算法知识的应用

最后,我使用 Kattis 来提高我解决问题的能力。Kattis 问题归档中有许多来自不一样渠道的编程问题,好比来自全世界的一些编程比赛。

因为没有官方的解决方案和讨论区(不像 HackerRank 和 LeetCode 同样),Kattis 使人很是沮丧。此外,测试用例也是私有的。我有一些少数待解决的 Kattis 问题,我没法解决它并非由于我不知道解决方案,而是由于我没法找出 bug。

这是三个练习和学习网站中我最不喜欢的,我也并无花太多的时间在上面。

其余资源

Geeksforgeeks 是另外一个对于学习数据结构和算法很是有价值的资源。我喜欢它提供各类语言的代码片断,一般是 C++、Java 以及 Python,你能够将其复制而后粘贴到集成开发环境中以逐行执行。

最后,还有值得信赖的老谷歌,它会让你在大多数时间里都能看到 GeeksForGeeks 和提供可视化解题的 Youtube。

结论

然而,归根到底,这条路没有捷径可走。你只须要一头扎进去,开始写代码、调试代码而且阅读其余人的正确代码,找出你错在哪、怎么错、为何会错。这很艰难,但每次尝试都会变得更好,随着你变得更好,它也将会变容易。

我远没有达到我想要的水平,但我知道,当我启程时便注定路远迢迢。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索