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

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

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

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

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

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

但是,由于我不明白我哪里不懂,所以我无法确定我对它的理解和在实际应用中解决问题的差距。

不同类型的问题

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

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

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

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

我主要使用三个网站来练习: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。

结论

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

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

1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法的实现机制,开阔编程思路,提高优化程序的能力
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页