与同事之间的一段对话,搞得我的小心脏又是扑通扑通的。最起码证明自己坚持在算法这条路上还是有意义的。

平复心情,决定还是写一篇我自己感觉比较好用的几个提升算法技能网站,也当做是做一下自我总结。

学习算法可能会遇到的障碍

有时候我们自认为对一些理论知识已经掌握的足够扎实。比如说链表。相信大多数开发人员对于链表结构不会陌生;对于链表的工作机制了然于心,链表各种操作的时间复杂度也能做到侃侃而谈;甚至于链表的抽象数据类型(ADT)也是信手拈来。但是只要一到实操阶段或者是面试时就各种麻爪。

拆分算法问题

其实仔细总结分析一下,我们在算法面试中,所遇到的问题一般就是那几个固定方向,由浅入深分别是:

1 data structure 数据结构部分

往往是考察应聘者对常用数据结构的理解以及熟练程度。举个例子来说,如果一个软件工程师没有在3分钟以内不能手写出数组 Two Sum 的最优实现,那么一般是认为不合格的。再比如应聘者应该可以快速的描述如何往一个链表中插入一个结点,并阐述其复杂度。

2 algorithm算法部分

这一部分不仅仅是考察对数据结构的熟练程度,还需要考察程序员在解决问题时,是否可以使用效率更高,消耗空间更小的方法。比如在一个有序数组中查找一个元素,并阐述其复杂度。

3 problem solving实际问题的解决

相对前两个阶段就稍微复杂一些。一般情况下会给出一个实际场景,然后列出几条需求或者问题,让应聘者当场给出答案。甚者,有的面试官会让你当场写出代码。这一阶段考察的就是一个程序员的综合素质。比如一个程序员的代码风格,单元测试的水平,遇到棘手问题时是如何去一步一步解决的等等。总之目的无非就是在众多候选人当中选出“能干活,会干活”的那一个。

针对性练习

问题已经剖析完了,那学习算法的方向也就迎刃而解了。总的来说我基本上就是利用以下几个网站分别去学习巩固相应的知识点与技能。

HackerRank, LeetCode, 和 Kattis这几个网站大体上非常相似,但是侧重点又有所不同。

数据结构

针对数据结构方向,我推荐 HackerRank,这个网站有一个专门的数据结构部分(section dedicated to data structures)

如上图,你可以筛选你想练习的数据结构: 数组,链表,平衡树,堆等等。假如在这个section浸淫个3年5载,常见数据结构的各种操作想必一定是砍瓜切菜了。比如:

1 数组:array rotation, array manipulation

2 链表:reversing a linked list, cycle detection

3 树:node swapping,BST validation

这部分并不会涉及到problem solving的问题,而是各种数据结构的基本操作。这些基本操作非常有助于理解不同数据结构的特性优势。

算法

HackerRank 虽然也有针对算法部分的练习部分–algorithms section。但是对于算法练习,我更倾向于使用 LeetCode,因为 LeetCode 中问题的种类更多,并且往往带有相应的解释部分设置时复杂度的分析。很多人对于庞大的LeetCode不知如何下手,我建议不妨从top 100 liked questions 开始。

这是最受欢迎的100道算法问题,很多面试官都是直接从这原封不动的扒题。列举几个我个人认为比较典型的:

  1. Accounts merge
  2. Longest continuous increasing subsequence
  3. Searching in a rotated sorted array

同数据结构部分不同,这一部分的重点并不是去强化巩固数据结构的操作。相反,这一部分的侧重点在于训练解决问题的思维方式。
LeetCode的题目有3中级别的难度:easy,medium, hard。建议初级工程师不要纠结于hard难度级别的题目,重点吃透easy和medium难度即可。

数据结构和算法的实际应用

最终我推荐使用 Kattis 去提升使用数据结构和算法的解决实际问题的技巧。 Kattis Problem Archive 从这里可以找到各种各样的编程实际问题,加以练习,相信对你编程水平会有所提高。

需要注意的是,不要以为这些编程问题会很轻松的解决,有的甚至会让你有挫败感。因为并没有一个官方的解决方案,也没有一个宫大家讨论的论坛(这一点同HankerRank和LeetCode不同)。

其它资源

除了上面提到的3个网站之外,Geeksforgeeks 也是一个学习数据结构和算法非常好的网站。它的优点在于每当讲解一个知识点时,会同时提供多种语言的实现代码片段,比如C++,java,phython等。

总而言之,学习算法是没有捷径可走的。我们必须投入其中,多写多练,多看其他高人的实现代码并加以理解。

提升算法数据结构的几个网站相关推荐

  1. 《机器学习》、《算法数据结构》、《LeetCode原创题解》开放下载!

    你好,我是梁唐. 我是公众号TechFlow的作者,专注推荐算法领域.拥有10年编程经验,5年从业经验.ACM亚洲区域赛银牌,前BAT员工. 我从去年11月开始做公众号,至今差不多已经一年时间.在这一 ...

  2. 打破认知:程序设计 #x3D; 算法 + 数据结构?

    大家好,我是陈旸,也是极客时间<数据分析实战 45 讲>专栏作者.很荣幸接到极客时间的邀请,来到极客 Live 和大家分享关于"数据分析"的话题.这次分享会共分为五部分 ...

  3. 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)

    承接上文 承接上一篇文章[算法数据结构专题]「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)]我们基本上对层级时间轮算法的基本原理有了一定的认识, ...

  4. 神经网络模型提升算法性能的方法

    转自:https://machinelearningmastery.com/improve-deep-learning-performance/(英文原文) PS:找了好久,CSDN都分类为转载,但是 ...

  5. 算法理解|从头开始理解梯度提升算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Prince Grover 编译:ronghuaiyang ...

  6. 从算法+数据结构到MVC

    2019独角兽企业重金招聘Python工程师标准>>> -------------------- Pascal之父--Nicklaus Wirth,提出了著名公式:"算法+ ...

  7. Python AdaBoost提升算法

    Python AdaBoost提升算法 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 AdaBoost提升简介 随机森林是通 ...

  8. 点击模型:达观数据提升算法精度的利器

    在搜索.推荐.广告引擎中,系统会通过复杂算法生成一个最终的结果列表.用户在看到这个结果列表时,未必都会对排序满意,比如有时觉得排序的顺序有问题,或者发现一些不符合喜好的item.如果从算法层面来调优, ...

  9. 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...

    强连通分量分解的Kosaraju算法 今天是算法数据结构专题的第35篇文章,我们来聊聊图论当中的强连通分量分解的Tarjan算法. Kosaraju算法一看这个名字很奇怪就可以猜到它也是一个根据人名起 ...

最新文章

  1. php 自加 性能,对于数据库的自增、自减心得
  2. 学python最好的方式-Python 学习怎样开始比较好?
  3. EIGRP实验--协议工作过程详解(一)
  4. tomcat8.5 远程访问 manager页面
  5. 原生js获取css样式
  6. oracle 用函数返回对象集合
  7. 媒体格式分析之flv -- 基于FFMPEG
  8. docker初级操作
  9. java 反射和泛型-反射来获取泛型信息
  10. Bailian2683 求分数序列和【数列和】
  11. 编译原理---NFA转化为DFA---DFA最小化(自己看)
  12. Linux 文本处理工具
  13. php 实现url rewrite 伪静态
  14. RuntimeError: DataLoader worker (pid 4499) is killed by signal: Segmentation fault.检查内存条!
  15. FIL会不会涨,至联云教你看这三点就知道
  16. 如何成为一名产品经理?这是我自学产品的8个方法
  17. android 蓝牙自动断开,Android蓝牙:连接()/断开()
  18. laravel的使用-模型和数据库基本操作
  19. 等边三角形的积木编程
  20. ACL 2021 | ChineseBERT:香侬科技提出融合字形与拼音信息的中文预训练模型

热门文章

  1. 【那些年我们一起看过的论文】之《ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation》
  2. asterisk恢复
  3. mcnpf5输出结果_MCNP及使用.ppt
  4. 什么是BS 架构(一)
  5. 在android安卓模拟器BlueStacks蓝手指上使用微信摇一摇
  6. 练习题:千克转换成磅
  7. php 神盾解密工具,PHP 神盾解密工具
  8. button控件具体用法(CommandName, CommandArgument)
  9. Open Images Dataset V5 - Data Formats - Class Names
  10. 华为云通用计算增强型C6到底怎么样?