我如何提高使用算法,数据结构的技能并学会在实践中使用所有这些技巧



译者的话:今天,我们正在为您发布Fabian Terh的文章 。 本文将对新手程序员很有用。

我是一名自学成才的程序员,这篇文章反映了我在算法和数据结构等领域的个人经验和技能; 此外,我还讨论了解决问题的方法(顺便说一句,第二种方法比第一种方法差一些)。

Skillbox建议:为期两年的实践课程“我是PRO Web开发人员”

我们提醒您: 对于所有“ Habr”读者来说,使用“ Habr”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

问题:您了解理论,但实践困难


不久前,我遇到了一个问题,可以描述为“我不知道我不知道的事情”-我们可以好奇。 事实是,我非常了解理论。 我知道列表是如何工作的,什么是单独的操作,什么是抽象数据类型,等等。

但是问题是我不知道在实践中哪些信息对我有用,而且我也不知道某些任务可能缺少什么。 因此,当我需要解决一些问题时,这对我来说很困难。

可能会遇到的任务类型

一个有关数据结构的问题的示例:描述如何将节点插入链表并指定时间复杂度。

这是一个关于算法的问题:在旋转排序的数组中找到一个元素并确定时间复杂度。

最后,最后一个问题的 “级别”比先前的级别更高,要求描述一种解决问题的方法,并列出实现该问题的要求。

在工作过程中,您可能只需要这个,即 解决方案的说明。 在竞争性编程中,通常需要提供工作代码而不明确指定任何数据结构或算法。 换句话说,期望您能够使用在每种情况下均最佳的数据结构和算法,以尽可能有效地解决问题。

我该如何提高自己的技能?


就个人而言,我为此使用了三种资源:HackerRank,LeetCode和Kattis。 它们彼此相似,尤其是前两个相似,但不完全相同。

我将解决问题所需的技能分为三类:

  • 数据结构知识;
  • 算法知识;
  • 应用数据结构和算法的能力。

前两个类别是基本类别,它们位于最底层。 第三类是上等阶级。

数据结构知识

HackerRank是我最喜欢的地方。 它有一个专门介绍数据结构的部分,其中可以按类型过滤信息,包括树,链接列表,数组等。

HackerRank解决的问题主要与使用数据结构有关:

  • 数组:旋转数组并执行其他操作。
  • 链接列表:反转,循环检测。
  • 树:节点交换,BST验证。

您可能已经知道这是怎么回事。 资源提交的问题不能直接用于解决问题。 但是需要他们了解基本知识,这对我而言非常重要。

HackerRank没有通用的“解决方案模型”,尽管在讨论部分中有许多技巧,窍门,甚至是工作代码的片段。 所有这些对我很有帮助。

算法知识

尽管LeetCode离我更近,但HackerRank的算法部分。 在我看来,在第二种资源上,要解决的问题列表更加广泛,并且有解释和提示。

最好从100个最常见的问题开始(本节为LeetCode)。 有些对我非常有用:

  • 帐户合并;
  • 最大的连续增加子序列;
  • 在旋转排序数组中搜索。

与数据结构相关的问题不同,这里的重点是如何做某事。 例如,合并帐户的问题主要与标准UFDS算法的使用有关。 旋转排序数组中的搜索问题是二进制搜索中的旋转。 有时候,有可能找到定性的新方法来解决问题,例如,解决子序列持续不断增长的问题的“滑动窗口”方法。

能够应用数据结构和算法

好吧,我已经在Kattis资源的帮助下提升了这项技能。 有大量已解决问题的档案库,这些档案库收集了来自各种来源的数据,包括来自世界各地的程序员的竞争。

不幸的是,卡蒂斯(Kattis)没有论坛,而且案件是私人案件,不是普通案件。 因此,在他的帮助下我无法解决一些问题。

但是,资源可以帮助许多程序员。 我本人并没有花太多时间研究它。

其他资源


Geeksforgeeks是另一个用于学习算法和数据结构的宝贵资源。 我喜欢它提供多种语言的片段的事实,包括C ++,Java和Python。 您可以毫无问题地使用它们。

当然,还有来自YouTube的优秀Google。

结论


实际上,最主要的是编写代码,从事调试,研究其他开发人员的代码,这将帮助您快速处理当前的任务。 解决问题是困难的,但是随着每一次尝试,每一个解决的问题,您都会越来越好。


Source: https://habr.com/ru/post/zh-CN435778/


All Articles