一文教你提高算法和数据结构技能

如果你想在算法和数据结构上做得更好,你首先需要做的就是建立一个坚实的基础。这个基础可以通过多种方式学习,通过大学的计算机科学课程,或者参加一些编程训练营,当然,你也可以从书本、视频或者在线课程中学习。但首先,你需要对以下主题有一个基本的了解:

数据结构 了解数组、链表、二叉树、散列表、图表、堆栈、队列、堆和其他基本数据结构。

数学和逻辑 如果你想在算法上表现出色,你需要从几个不同的领域了解一些数学概念。学习集合论,有限状态机(finite-state machine),正则表达式,矩阵乘法,位运算(bitwise operation),解线性方程,重要的组合学概念,如排列,组合,鸽巢原理。

计算机体系结构 学习数据如何在计算机中表示,数字逻辑设计的基础,布尔代数,计算机运算,浮点表示,缓存设计。试着学习一些关于C语言和Assembly编程的知识。

一旦你觉得你对上面列出的大多数概念有了很好的理解,就该开始进入算法部分了。这里列出了一些理解重要算法方面的资源和建议。

从算法设计手册中获取的页面内容

  • 算法设计手册:https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202

大O符号&运行时间

学习大O符号是什么,以及如何分析算法的运行时间。你可以看看“Introduction to Algorithms”这本书。

  • 本书关于函数增长的章节:http://www.cs.dartmouth.edu/~ac/Teach/CS19-Winter06/SlidesAndNotes/CLRS-3.1.pdf

下面的链接中列出了一些教授算法的在线课程:

  • 地址:https://github.com/tayllan/awesome-algorithms#online-courses

通过你自己实现一些算法 首先,你要自己实现几个重要的算法,然后学习它们的运行时间。下面是一些例子:

  • 二分法检索
  • 欧几里德算法
  • 深度和广度优先搜索
  • Dijkstra的最短路径算法
  • 二叉树遍历
  • 插入排序、归并排序、快速排序
  • 最小堆和最大堆

学习算法的书籍

  • 《算法设计手册》:https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202
  • 《算法导论》:https://en.wikipedia.org/wiki/Introduction_to_Algorithms,这是一本涵盖很多有用信息的经典著作。
  • 《编程面试的因素》:https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836,包含了许多挑战和代码解决方案,它们将在你准备面试的过程中提供帮助。

挑战 在诸如Coderbyte和HackerRank这样的网站上编写简单的代码,然后进行更高级的算法,这样你就可以从其他程序员那里学习到一些解决方案。

  • Coderbyte地址:https://coderbyte.com/
  • HackerRank地址:https://www.hackerrank.com/

1. 一个交互式的python算法网站:http://interactivepython.org/runestone/static/pythonds/index.html

2. 10个2017年最受欢迎的编码挑战网站:https://medium.freecodecamp.org/the-10-most-popular-coding-challenge-websites-of-2016-fb8a5672d22f

3. 对于初学者来说,5个最难的代码挑战:https://medium.com/coderbyte/the-5-hardest-code-challenges-for-beginners-e410da4474b

算法解释和面试会遇到的问题 你可以在GeeksforGeeks上阅读尽可能多的算法说明和代码示例。这是一个关于图形算法例子的好贴子。

  • GeeksforGeeks地址:http://www.geeksforgeeks.org/

看看在CareerCup中发布的一些面试问题,试着了解其他用户是如何解决这些问题的。

  • CareerCup地址:https://www.careercup.com/

除了编码挑战网站,试着解决你在网上找到的常见的编码面试问题,这有一个列举出问题的表单。地址如下:

  • https://techiedelight.quora.com/500-Data-Structures-and-Algorithms-practice-problems-and-their-solutions?srid=dV6r

动态规划(Dynamic Programming) 这是一个非常重要的概念,如果你想要在算法上做得更好,你需要理解它,这就是我将这个主题与其他部分分离的原因。维基百科的描述是:

“一种解决复杂问题的方法,将其分解成更简单的子问题集合,解决每一个子问题,并存储它们的解决方案。下一次同样的子问题发生时,我们不再重新计算它的解决方案,而是简单地查找先前计算的解决方案,从而节省了计算时间。”

在我的几次编程面试中,我遇到了动态编程的问题。我还遇到过一些问题,需要在诸如LeetCode、Google Code Jam之类的挑战网站上使用动态编程解决方案,以及在Google Foo Bar上遇到的一个DP解决方案的几种挑战。

  • LeetCode地址:https://leetcode.com/problems/longest-palindromic-subsequence/description/
  • Google Code Jam地址:https://code.google.com/codejam/contest/10224486/dashboard
  • Google Foo Bar地址:http://www.geeksforgeeks.org/google-foo-bar-challenge/

TopCoder上也有一个很好的教程:“动态编程——从新手到高手。”上面有很多相同结构和模式的DP问题,如果你每天解决3个DP问题,持续2个星期左右,过一段时间你就能很轻松地发现和解决一个DP问题。

  • 教程地址:https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/

算法问题中的高级资源(可选)

  • Erik Demaine的“高级数据结构”课程:http://courses.csail.mit.edu/6.851/fall17/lectures/
  • Erik Demaine的“算法下界:快乐地进行难度证明”:http://courses.csail.mit.edu/6.890/fall14/lectures/
  • AlgoWiki:一个致力于竞争编程的wiki百科:https://github.com/AlgoWiki/AlgoWiki
  • 开放数据结构:对序列、队列、优先队列、无序字典、有序字典和图形的数据结构的实现和分析:http://opendatastructures.org/

我希望你喜欢这份资源列表。你可以在Coderbyte上自由地练习编码,并在上面发表任何你认为有用的资源。

  • Coderbyte地址:https://coderbyte.com/

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序人生 阅读快乐

C语言程序设计_现代方法

时至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经和最初的时候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强...

932
来自专栏钱塘大数据

一文总结学习 Python 的 14 张思维导图

大数据时代,数据是智能世界的土壤,发达的数据文明孕育于此之上。但大数据只是一种资源,它告知信息但不解释,只有学会深耕这片土地,真正挖掘到深埋土壤之下的数据金矿,...

4588
来自专栏Java技术栈

Google的面试题长啥样?看完被吊打!

作为一名Google的工程师和面试官,今天是我第二次发文分享科技公司面试建议了。这里先声明:本文仅代表我个人的观察、意见和建议。请勿当作来自Google或Alp...

1174
来自专栏CDA数据分析师

R语言的好与坏丨讲座中字视频丨附讲座PDF

R是一种用于分析数据的领域特定语言。为什么数据分析需要自己的领域特定语言(DSL) ? R语言擅长些什么,不擅长什么?开发人员该如何利用R语言的优势并减轻其弱点...

2479
来自专栏Crossin的编程教室

编程新手:看懂很多示例,却依然写不好一个程序

最近在和学员的沟通中,发现不少初学者面临这样一个问题:了解了一些基本的语法,看得懂书上的示例,但是面临一个新的编程问题时,依然感到无从下手。究其原因,主要是两个...

2775
来自专栏web前端教室

JS原型,a和b是不是失散多年的兄弟?

面试题这种东西真的是反人类的设计,我觉得它的最大的作用就是用来打击我的信心。每当我觉得自己js水平还可以,的时候,它就会在不经意间跳出来,给我一耳光。例如这个,...

2028
来自专栏软件技术

格智学院:面向对象设计模式?

  偷懒一下,请大家移步,直接参考文章《写了这么多年代码,你真的了解SOLID吗?》,记得回来呦~

1042
来自专栏技术小黑屋

Java程序员必读的9本书

本文列出的9本书在Java程序员界都是被认为很棒的书。当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java。这个问题也就表明...

972
来自专栏PHP在线

如何学好数据结构和算法

数据结构和算法是计算机科学中最重要的课程,作为一名Google的软件工程师,我经常看到一些求职者或刚毕业的学生,他们对于数据结构和算法的学习是远远不够的。这不是...

3276
来自专栏编程心路

从王者荣耀看设计模式-策略模式(java版)

曾经我也是一名玩农药的大学生,但现在已经弃了,别问我为什么(被坑爹队友坑的哭。。。)。而今天我们来把让农药变荣耀,我们来从王者荣耀中看设计模式的策略模式。

1015

扫码关注云+社区