找回密码
 立即注册
查看: 1521|回复: 20

如何系统地学习算法?

[复制链接]
发表于 2021-7-4 09:35 | 显示全部楼层 |阅读模式
如何系统地学习算法?
发表于 2021-7-4 09:40 | 显示全部楼层
王国维先生在《人间词话》中写道:古今之成大事业、大学问者,必经过三种境界:“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境也。“众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”此第三境也。算法的学习之道也是如此。
一、夯实基础

在最初的阶段,算法世界的大门刚刚打开,这个时候迷茫是正常的,解决迷茫的要诀在于少想多做,勇往直前。怀着一颗"千磨万击还坚韧,任尔东西南北风"的恒心,爬上算法的高楼,做到"望尽天涯路"。

从一个算法萌新入门,第一步便在于打牢根基。推荐阅读书籍:

1.《算法第 4 版》- Robert Sedgewick
适合初学者入门

2.《大话数据结构》- 程杰
3.《算法图解》- Aditya Bhargava
《大话数据结构》和《算法图解》这两本书的特点是有趣、易理解,也非常适合初学者。

4.《数据结构和算法分析- C 语言描述》- Mark Allen Weiss
需要有一定 C 语言基础


进阶
1.《编程珠玑》- Jon Bentley
本书探讨了程序设计人员面对一系列的实际问题以及解决问题的措施(解决方案的代码以 C/C++ 语言编写)。书中选取了许多具有典型意义的复杂编程和算法问题,并阐述和总结了许多独特精妙的设计原则、思考和解决问题的方法以及实用的程序设计技巧。
2.《算法导论》- Cormen,T.H.
《算法导论》的特点是全面,它是一本算法的百科全书,着重在于开阔算法视野,适合有一定算法基础后再去学习。

入门阶段是看一些天赋的,花费时间因人而异,大约在 3~6 月之间,将上述提到的书籍选择其中一本看完基本就能入门了。在这个阶段中,需要了解几类常用的算法:
1. 常用的数据结构:数组、字符串、链表、树(如二叉树)等
2. 常用的算法:分治、贪心、穷举、动态规划、回溯、二分算法、深度优先搜索等
可搭配力扣的题目进行练习

其中,暴力枚举、贪心算法容易理解,可以很快上手。数论相关的算法需要用到一些数学技巧,包括位运算、幂函数、求模等等性质。二分算法和深度优先搜索算法相对有些技巧性,好在他们都有固定的模板。另外,不得不提的是,深度优先搜索算法的思想非常重要,而且深度优先搜索是动态规划、分治和回溯的基础,需要重点掌握。
在此过程中,可以辅以力扣(LeetCode)中的简单题目,它们往往都代表了一类经典算法,如:

70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

动态规划 算法的经典题目,通过此题目可以了解状态、边界条件、状态转移方程等基本概念。

112. 路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

深度优先算法 的入门题目,递归实现和迭代实现都不难,可以学习到深度优先算法的层层嵌套搜索、找到答案或到达边界停止的基本解题思路。

35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

二分算法 的典型题目,使用二分算法的解题模板可以轻松解决,二分算法的算法思想清晰明确,一通百通。

169. 求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于  n/2  的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。


分治算法 的简单题目,如果我们知道数组左边一半和右边一半的众数,我们就可以用线性时间知道全局的众数是哪个。这道题妙就妙在可以有多种解题方式,让初学者至少可以写出暴力枚举算法 AC 题目,然后再逐步深入,优化算法。

944. 删列造序
给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。
选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符。 所余下的字符串行从上往下读形成列。
假设,我们选择了一组删除索引 D,那么在执行删除操作之后,A 中所剩余的每一列都必须是 非降序 排列的,然后请你返回 D.length 的最小可能值。

这是一道 贪心算法 的简单题目,贪心算法理解简单,上手容易,适合作为初学者掌握的第一个算法。

时间充裕的同学可以按照下图进行系统性地学习:
二、融会贯通


学习算法理论如同阅读了一本武功秘籍,然而仅仅掌握理论是不够的,接下来就要进入到实际练习阶段。

实战练习非常重要,不经过实战练习,理论仅仅是纸上谈兵。比如,不经过大量练习,永远不会知道二分算法是多么容易出现死循环。一个边界条件控制不好,程序就会显示无情的"Time Limit Exceeded"。在 20 分钟的调试后,或许仅仅是将 while (left <= right) 改为了 while (left < right) 。程序员说到底也是手艺人,这一个字符的改动,正是"台上一分钟,台下十年功"的体现,需要在大量的练习中才能理解两者之间的不同作用。

再比如,动态规划算法中,递归的函数就像是《盗梦空间》中的"梦中梦",一层套一层,又渐次展开,很难整体把控。在不断的练习后,才会知道,动态规划算法的重点是抓住动态转移方程,只处理两个状态之间的过渡和边界条件,慢慢"大事化小,小事化了"。


这一阶段花费的时间将会很长很长,伴随着不断地摔倒、爬起,你会对每类算法逐渐融会贯通。好在这一阶段是不看天赋只看勤奋的,每次从坑里爬起,都是献给成长的一份力量。
推荐的进阶书籍有《编程珠玑》,本书探讨了程序设计人员面对一系列的实际问题以及解决问题的措施(解决方案的代码以 C/C++ 语言编写)。书中选取了许多具有典型意义的复杂编程和算法问题,并阐述和总结了许多独特精妙的设计原则、思考和解决问题的方法以及实用的程序设计技巧。

在这个阶段,可以尝试练习力扣上的中等题目,中等题目基本上也只会使用一种算法,加上一些特殊的限制,好比让你在学习了直拳的理论后衍生出左勾拳和右勾拳。推荐练习题目有:

1048. 最长字符串链
给出一个单词列表,其中每个单词都由小写英文字母组成。
如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 word2 的前身。例如,"abc" 是 "abac" 的前身。
词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此类推。
从给定单词列表 words 中选择单词组成词链,返回词链的最长可能长度。

分析题目可知,要求出答案必须遍历所有可能的词链,动态规划算法在其中起备忘录的作用,用于记录已经算过的答案,减少计算次数。

47. 全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
这道题是 46. 全排列 的加强版,全排列 I 的题目是:给定一个 没有重复 数字的序列,返回其所有可能的全排列。使用深度优先搜索算法即可解决。本题在其基础上加强了难度,有两种方法可解。第一种方法最简单,直接用全排列 I 的答案去重即可,第二种方法是先将数组排序,全排列时遇到重复数字则跳过,这样的剪枝优化可以减少遍历次数,提高算法效率。

40. 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
深度优先搜索算法衍生出来的回溯算法,同样用到 47 题的剪枝优化思想:相同数字只允许递归第一个。

89. 格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。
动态规划 算法的实际应用之一。

79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
深度优先搜索的中级应用,使用单独数组标记已使用过的元素,这也是 DFS 中较为常见的做法,难点在于将标记数组复原的时机,需要反复练习,熟练掌握。
当你把每一类算法的中等题目刷起来得心应手时,不妨开始尝试困难题目的练习。困难题目总是融合两种或两种以上算法,或是加深难度的经典算法,如二维甚至三维动态规划。练习困难题目好比同时用上左勾拳和扫堂腿,不仅让思维酣畅淋漓,在每次 AC 之后还会带来无与伦比的成就感。推荐练习题目有:

679. 24 点游戏
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。
只有 4 张牌,且只能执行 4 种操作。即使所有运算符都不进行交换,最多也只有 12 * 6 * 2 * 4 * 4 * 4 = 9216 种可能性,这使得我们可以尝试所有这些可能,如果用深度优先搜索算法则需要费一番功夫。

124. 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
首先,考虑实现一个简化的函数:计算每个节点及其子树对路径和的最大贡献。再考虑第二点:最大路径不一定包括根节点。这意味着我们在每一步都检查哪种选择更好:是继续当前路径或者以当前节点作为最高节点计算新的路径。

410. 分割数组的最大值
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
二分算法和贪心算法的综合练习,仔细分析可知其单调关系:数组和的最大值越小,分组数越大。并且数组和的范围是可以确定的。根据此特性,可以将题目转换为:当子数组的和最大为 maxSum 时,至少需要分多少组,能否在最多 m 组的限制范围内完成分割。在每次分割时,采用贪心策略,尽可能多的放置元素,直到一组放不下,再另起一组。如果满足分割条件,记录当前值,利用二分法,缩小子数组总和。否则扩大子数组总和,直到找到最佳答案。

三、推陈出新


事实上,大量程序员停留在第二重境界就无法再进一步。当提到某一类算法时,你可以说:"我知道"、"我会用"、"踩过坑",但能说出"我完全理解其思想"、甚至"我能想办法改进"的人却很少很少。这一步仿佛武学中的攻守之道,当你掌握到这一层,便可不再拘泥于一刀一剑、一招一式,如金书中所说:飞花摘叶皆可伤人、草木竹石均可为剑。

开创算法的过程是艰难又孤独的。每一个经典算法的诞生都伴随着"一将功成万骨枯"。比如现在我们在很多语言中都可以直接调用Collection.sot()实现快速排序,而在快速排序算法出现之前,曾有一段时间仅有冒泡、选择、插入三种排序算法。直到1959年,希尔提出"希尔排序"算法,或许现在知道此算法的人已经很少了。但它是首个突破了复杂度的排序算法,它的基本算法思想如下:
选择一个增量序列t1,t2,…,tk,其中 ti > tj, tk = 1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
动图演示如下:


希尔排序算法较为晦涩难懂,而且并不是最优的排序算法,现在已经被后来的快速排序算法给淘汰了。然而不可否认希尔对排序算法的演进具有开创性贡献,在攀越算法高峰的路上,每一步都走得战战兢兢,我们只有铭记这些伟大的引路人,以此激励自己不断前行。

算法世界不尽完美。不仅有经典算法在前奠基,后起之秀遗传算法、深度学习算法也熠熠生辉。算法世界还有许多"所罗门王的宝藏",一直静静地守候在"灯火阑珊处",等待着人们去发掘。



四、学习方法



我给大家整理了一个学习计划,可以保存下图进行学习:


现在网上有很多资源、博客、论坛可供我们更方便地学习知识片段。然而这种类似兵来将挡、水来土掩般的学习方法虽然有用,却并不特别的好。这里推荐大家在网上寻找一些系统的学习教程,以帮助自己由浅入深,一路成长。


五、真题演练

力扣将  Top Interview Questions 里比较新的题目按照类别进行了整理,以供大家按模块练习。

模拟


    134. 加油站146. LRU缓存机制202. 快乐数289. 生命游戏371. 两整数之和412. Fizz Buzz
数组


    152. 乘积最大子序列169. 求众数189. 旋转数组217. 存在重复元素283. 移动零384. 打乱数组350. 两个数组的交集 II334. 递增的三元子序列240. 搜索二维矩阵 II238. 除自身以外数组的乘积
链表


    138. 复制带随机指针的链表141. 环形链表148. 排序链表160. 相交链表206. 反转链表234. 回文链表237. 删除链表中的节点328. 奇偶链表



    155. 最小栈215. 数组中的第K个最大元素295. 数据流的中位数378. 有序矩阵中第K小的元素347. 前K个高频元素



    150. 逆波兰表达式求值227. 基本计算器 II341. 扁平化嵌套列表迭代器
哈希 / Map


    171. Excel表列序号454. 四数相加 II380. 常数时间插入、删除和获取随机元素
队列


    239. 滑动窗口最大值



    230. 二叉搜索树中第K小的元素236. 二叉树的最近公共祖先297. 二叉树的序列化与反序列化
线段树


    218. 天际线问题
排序


    179. 最大数324. 摆动排序 II
二分检索


    162. 寻找峰值287. 寻找重复数315. 计算右侧小于当前元素的个数
滑动窗口


    395. 至少有K个重复字符的最长子串
动态规划


    124. 二叉树中的最大路径和128. 最长连续序列198. 打家劫舍279. 完全平方数300. 最长上升子序列322. 零钱兑换329. 矩阵中的最长递增路径
图论


    127. 单词接龙200. 岛屿的个数207. 课程表210. 课程表 II
数学 & 位运算


    136. 只出现一次的数字149. 直线上最多的点数166. 分数到小数172. 阶乘后的零190. 颠倒二进制位191. 位1的个数204. 计数质数268. 缺失数字326. 3的幂
字符串


    125. 验证回文串131. 分割回文串139. 单词拆分140. 单词拆分 II208. 实现 Trie (前缀树)212. 单词搜索 II242. 有效的字母异位词387. 字符串中的第一个唯一字符344. 反转字符串

力扣君特别为大家总结了“高频算法面试题汇总”卡片,在力扣探索频就可以找到,希望对各位即将面试或者学习算法的程序员小伙伴有帮助。
探索算法面试题汇总 - 力扣 (LeetCode)<hr/>欢迎各位知友关注力扣官方微信公众号:「LeetCode力扣」,更多关于程序员面试、技术干货的内容等你来啃!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 09:44 | 显示全部楼层
02.09.2020 更新一波这篇文章,对大家应该能有些帮助:
LeetCode按照怎样的顺序来刷题比较好?按照分类来刷,每个分类的题目,解法类似,这样就用一个思路解一类题目了:
Grokking the Coding Interview: Patterns for Coding Questions - Learn Interactivelywww.educative.io

这个课程将算法题目(类似LeetCode上面的算法和数据结构题目)进行了模式分类,每个类型模式,提供了经典的题目。
如果想买订阅Subscriptions)的小伙伴,则可以用ZHIHUEDU-10(必须一模一样输入)的coupon code来获取额外九的优惠按年和按月均适用


他家最最出名的还是这门Grokking the System Design Interview, 但凡提到准备系统设计,这门课都上入门必推的:
Grokking the System Design Interview - Learn Interactivelywww.educative.io以及OOD: Grokking the Object Oriented Design Interview
Grokking the Object Oriented Design Interview - Learn Interactivelywww.educative.io

<hr/>既然要系统地学,那自然是要看书,上课,和练习相结合。三管齐下,缺一不可!
所以我从三个方面来讲一下。先是书籍推荐,再是网课,最后是练习平台。
<hr/>先来看书籍有哪些?

书挺多,但经典的也就那么几本,而且我建议选定一本之后,看多遍。而不是看好几本书,每一本走马观花。
其实抛开数据结构谈算法,都是耍流氓,所以我会推荐算法和数据结构的书。
首先是算法算法和数据结构是计算机学习的基石。无论你学习计算机的任何方向,没有扎实的算法和数据结构,肯定学习起来就捉襟见肘了
我自己非常喜欢的普林斯顿算法红宝书 第四版,这本书是普林斯顿超级大神教授Robert Sedgewick的神作,该书还有配套的MOOC课程,以后有时间再写网课了。该书是特别棒的算法和数据结构的教程,全书提供Java的实现,而且大部分内容也放在了本书的配套网站上:https://algs4.cs.princeton.edu/home/ 本书的优点是会把算法详细的过程掰开揉碎地讲明白了。书里面有大量的配图,更不说配套网站上的ppt,简直就是艺术。一句话,1万分推荐。就一个缺点,没有讲动态规划(DP),所以我在下面也推荐一些涉及到DP的书籍。你认真读此书的话,会发现很多大公司的面试题就来自它的习题里面。
还有另外一本算法神作就是算法设计手册了。这一本则是把算法分类了,还提供了特别多适用的算法应用场景,让读者知其然,并知其所以然。这本书的数和图部分,还有递归回溯,是特别多人拍手称赞的地方,值得认真看三遍。这本书就讲了第一本里面遗憾缺失的DP。总之,这两本都是超级强推。
提到算法,肯定会提到算法圣经之算法导论,这本书是算法百科全书,优点是全,缺点是太全太厚,数学太多了。是很好的参考书,但不适合短期突击学习。感兴趣的读者可以挑战一下。
接下来的两本,可以当做是算法的课外读物,写得浅显易懂。刚开始学算法的小伙伴,可以先从他们着手,第一本其实是合集,叫Algorithms Illuminated分三个部分:基础,图算法和数据结构,贪心算法和DP。该合集页数比较短,但是看完之后,对算法的理解肯定会加深不少。
第二本就是图解算法了,语言风趣,有比较多的插图。入门很合适。
最后一本算法书,名字就叫算法,作者还提供免费的教程,我个人觉得对面试帮助很大。因为里面讲解算法的思路,有点以题目为导向的感觉,其中递归和DP部分,让我有醍醐灌顶之感。
第二部分是数据结构,这里就推荐三本书,一本是Java,一本是Python。Java的就是鼎鼎大名的CS61B的课程推荐教程:Data Structures and Algorithms in Java。Python的也是一本畅销书:Problem Solving with Algorithms and Data Structures。
还有就是中文的《大话数据结构》,数据结构中文入门读物的不二选择。
提到的书籍有:
算法红宝书:
算法导论:
算法设计手册:
大话数据结构:
<a data-draft-node="block" data-draft-type="mcn-link-card" data-mcn-id="1195672271908458496"><hr/>再来看网络课程。

算法课程强推三门。
Again,选一个好好多学两遍,别都想学,没那么多时间,贪多嚼不烂。
网络课程的话,则是十二分强推UCB的CS61B。他们家的计算机系的CS61A,B,C课,简直制霸各种课程推荐列表。
    CS61B的官网在这里:https://inst.eecs.berkeley.edu/~cs61b/fa19/
2. MIT的算法课,教程用的算法导论,也是强推的网课:https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb
3. 然后就是红宝书的网课以及配套官网:
https://algs4.cs.princeton.edu/lectures/
https://www.youtube.com/watch?v=1QZDe28peZk&list=PLRdD1c6QbAqJn0606RlOR6T3yUqFWKwmX
<hr/>最后是练习平台。

光学不练,算法是学不会的。
所以推荐一些好的刷算法和数据结构平台,当然也是为了找工作面试做准备咯。
    LeetCode。
这是现在刷题找工作最热门的网站了。
但LeetCode现在题目也太多了,一共1200+了。全刷完没必要,也不高效,所以推荐看下面的回答:
大家都是如何刷 LeetCode 的?刷完LeetCode是什么水平,能拿到什么水平的 offer ?<hr/>2. Educative
Educative: Interactive Courses for Software Developers<hr/>3. LintCode。这个网站上面的solution功能很好。
其他的网站还有很多,但我觉得刷题和看书一样,选定一个就好,剩下的就是多刷题,多总结。
量变才能质变,但别盲目追求数量。


以上。
发表于 2021-7-4 09:49 | 显示全部楼层
常言道「算法才是编程的灵魂」,不管是 Java,python,还是 PHP,都跨不过算法这个门槛。
算法确实不好学,但算法也是真必要。盐选君为大家整理了一系列经典的算法书籍,让你既能 get「冒泡排序」,也能「手撸红黑树」!
经典必看
示例丰富,图文并茂,这是一本像小说一样的算法入门书。
无论你是专业程序员,还是编程爱好者,亦或是需要重温算法的计算机专业学生,这本书都是你不二的选择。
算法领域的经典参考书,包含了经过几十年演化而成的算法核心知识体系。书中讲解了多种算法和数据结构,让你能够在各种计算机环境下实现、调试并应用它们。
进阶必需
JavaScript 是当下最流行的编程语言,它的应用范围非常广泛,不仅用于前端开发,也被应用到服务器和数据库环境中。
想学习实现常用的 JavaScript 数据结构和算法?你需要的这里都有。
面试必备
这里有超过 100 道机器算法工程师的面试题目和解答,其中大部分源于 Hulu 算法研究岗位的真实场景。
在人工智能技术如火如荼的时代,这本书或许可以帮你前进一步。
一「网」打尽程序员面试笔试过程中的各类算法类真题,近 3 年来 IT 企业面试笔试算法高频题目大集合。
这是一份不可多得的求职宝典,快来一键解锁:
<a data-draft-node="block" data-draft-type="km-sku-card" data-sku-id="Ebook-119635327-0">哇哦~赶紧跟着盐选君学习起来吧,没有困难的工作,只有勇敢的「编程人」!
使用 App 查看完整内容目前,该付费内容的完整版仅支持在 App 中查看
App 内查看
发表于 2021-7-4 09:50 | 显示全部楼层
曾经因为看不懂数据结构和算法,而一度怀疑是自己太笨,实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步,希望以下分享能为初学者排忧解难。
我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。
不管是不是科班出身,每一个程序员都应该花时间了解和学习计算机科学相关的基础知识,因为所有关于如何编程的底层逻辑和原理都在那里了。
这里有4本手册,全网累积下载100w次,几乎程序员人手一套,包含数据结构与算法、操作系统、计算机组成原理、计算机网络等硬核基础知识,图文+实战案例,平时开发+搞定面试,帮你快速建立对计算机科学的大局观,夯实计算机基本功,瞬间起飞~
全网累计下载100w+次,瞬间让你起飞的计算机基础知识切记:学习资料在于精,不在于多,多反而不是好事,作为一名程序员,大家的学习时间都太宝贵了,我们要把80%时间投入在最有价值20%的学习内容上,具体内容可以看上面这篇资料贴。
还记得大学里每次考前老师都要划重点吗?今天,我就给你专门划划数据结构与算法的学习重点,再告诉你一些我总结的学习小窍门。相信有了这些之后,你学起来就会有的放矢、事半功倍了。
什么是数据结构?什么是算法?

大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。
虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。
那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。
从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。
那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢?
这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。
比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。
现在你对数据结构与算法是不是有了比较清晰的理解了呢?有了这些储备,下面我们来看看,究竟该怎么学数据结构与算法。
看到数据结构和算法里的“算法”两个字,很多人就会联想到“数学”,觉得算法会涉及到很多深奥的数学知识。那我数学基础不是很好,学起来会不会很吃力啊?
数据结构和算法课程确实会涉及一些数学方面的推理、证明,尤其是在分析某个算法的时间、空间复杂度的时候,但是这个你完全不需要担心。
学习的重点在什么地方?

提到数据结构和算法,很多人就很头疼,因为这里面的内容实在是太多了。这里,我就帮你梳理一下,应该先学什么,后学什么。你可以对照看看,你属于哪个阶段,然后有针对地进行学习。
想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。
这个概念究竟有多重要呢?可以这么说,它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。
数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招!
所以,复杂度分析这个内容,你也一定要花大力气来啃,必须要拿下,并且要搞得非常熟练。否则,后面的数据结构和算法也很难学好。
搞定复杂度分析,下面就要进入数据结构与算法的正文内容了。
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。
但是,作为初学者,或者一个非算法工程师来说,你并不需要掌握图里面的所有知识点。很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。我还是那句话,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。
所以,结合我自己的学习心得,还有这些年的面试、开发经验,我总结了20个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这20个知识点就足够了。
这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
与此同时,为了帮助大家学习算法,准备了一份学习资料,获取方式:关注我的公众号
「代码丸子」,回复“算法”即可弹出领取地址。对于新手来说很适用。
这份资料一共包含4个部分:
在学习数据结构和算法的过程中,你也要注意,不要只是死记硬背,不要为了学习而学习,而是要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。对于每一种数据结构或算法,我都会从这几个方面进行详细讲解。只要你掌握了《数据结构与算法之美》每节课里讲的内容,就能在开发中灵活应用。
学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。
一些可以让你事半功倍的学习技巧

前面我给你划了学习的重点,作为一个过来人,现在我就给你分享一下,学习的一些技巧。掌握了这些技巧,可以让你化被动为主动,学起来更加轻松,更加有动力!
边学边练,适度刷题
“边学边练”这一招非常有用。建议你每周花1~2个小时的时间,集中把这周的三节内容涉及的数据结构和算法,全都自己写出来,用代码实现一遍。这样一定会比单纯地看或者听的效果要好很多!
有面试需求的同学,可能会问了,那我还要不要去刷题呢?
我个人的观点是可以“适度”刷题,但一定不要浪费太多时间在刷题上。我们学习的目的还是掌握,然后应用。除非你要面试Google、Facebook这样的公司,它们的算法题目非常非常难,必须大量刷题,才能在短期内提升应试正确率。如果是应对国内公司的技术面试,即便是BAT这样的公司,你只要彻底掌握这个专栏的内容,就足以应对。
多问、多思考、多互动
学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。但是,离开大学之后,既没有同学也没有老师,这个条件就比较难具备了。
打怪升级学习法
学习的过程中,我们碰到最大的问题就是,坚持不下来。是的,很多基础课程学起来都非常枯燥。为此,我自己总结了一套“打怪升级学习法”。
游戏你肯定玩过吧?为什么很多看起来非常简单又没有乐趣的游戏,你会玩得不亦乐乎呢?这是因为,当你努力打到一定级别之后,每天看着自己的经验值、战斗力在慢慢提高,那种每天都在一点一点成长的成就感就不由自主地产生了。
知识需要沉淀,不要想试图一下子掌握所有
在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。
这些内容是我根据平时的学习和工作、面试经验积累,精心筛选出来的。只要掌握这些内容,应付日常的面试、工作,基本不会有问题。
以上内容出自近60000+程序员的算法课堂《数据结构与算法之美》,这个专栏是市面上唯一一门真正适用于工程师的专栏,专栏中列举大量实际软件开发中的场景,给你展示如何利用数据结构和算法解决真实的问题。整个专栏会涵盖100 多个算法真实项目场景案例,更难得的是它跟市面上晦涩的算法书籍不同的是,还手绘了一些清晰易懂的详解图(总共有 300 多张)。
                                          手绘图—出自《数据结构与算法之美》
专栏已经更新完毕,72 篇文章,27 万字,这个专栏作者并非只是单纯地把某个知识点讲清楚,而是结合作者的理解、实践和经验来讲解,我相信它是一个跟所有国内、国外经典书籍都不一样的专栏,一个可以长期影响一些人的专栏。
这个专栏不会像《算法导论》那样,里面有非常复杂的数学证明和推理。作者会由浅入深,从概念到应用,一点一点给你解释清楚。你只要有高中数学水平,就完全可以学习。
当然,当然希望你最好有些编程基础,如果有项目经验就更好了。这样给你讲数据结构和算法如何提高效率、如何节省存储空间,你就会有很直观的感受。因为,对于每个概念和实现过程,作者都会从实际场景出发,不仅教你“是什么”,还会教你“为什么”,并且告诉你遇到同类型问题应该“怎么做”。
强烈推荐这个专栏给想攻克算法的同学,它改变了无数对算法恐惧的同学,我整理了一些专栏的评价给大家参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 09:51 | 显示全部楼层
学习算法,切记不要一上来就开始啃《算法导论》,毕竟这本书并不适合新手学习,如果你之前的算法基础比较薄弱,只会一直陷在“拿起来又放下”的循环里。
可以怎么入门呢?建议还是看书+实战,实战当然也不是说要去肝ACM或者是topcoder什么的,基本上来我们LintCode刷刷题也就够了。
如何学习算法?
算法,其实可以分为三种。算法、面试算法、竞赛算法。
    算法
也就是算法本身,推荐一些书籍。
1.入门系列:
《算法图解》:“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂
《大话数据结构》:把理论讲得有趣不枯燥;每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。
2.教科书系列:
《数据结构与算法分析》:很多大学都拿它当作教材,非常系统、全面、严谨,适合掌握了至少一门编程语言的同学。
作者也很贴心,这本书有三种语言的版本:《数据结构与算法分析 : C 语言描述》《数据结构与算法分析 : C++ 描述》《数据结构与算法分析 : Java 语言描述》。
3.进阶之旅:
《算法导论》:有了一定基础之后,就可以开始啃这本大部头了。
5.扩展阅读:
《算法之美》:算法科普,从生活中的各种问题说起:租房、谈恋爱、老虎机、拍电影、面试、买彩票、各种排序、找停车位、寻找新药、临床试验、奥巴马拉赞助、预估电影票房等等,非常生活化,可以作为补充阅读。
《算法帝国》:同样是科普类书籍,并无涉及算法的原理与实现细节,也可以作为补充阅读。
6.殿堂级
《计算机程序设计艺术》:包含很多卷,深度、广度、系统性、全面性是其他所有数据结构和算法书籍都所无法相比。可以当做一种挑战~
图源网络,侵删
    面试算法
要说最快掌握面试算法的捷径,还是脚踏实地着多动手去刷题,多刷题。
当然,在LintCode开始刷题,首先你也也得具备一定的基础,这些基础包括:
算法部分
二分搜索 Binary Search
分治 Divide Conquer
宽度优先搜索 Breadth First Search
深度优先搜索 Depth First Search
回溯法 Backtracking
双指针 Two Pointers
动态规划 Dynamic Programming
扫描线 Scan-line algorithm
快排 Quick Sort数据结构部分
栈 Stack
队列 Queue
链表 Linked List
数组 Array
哈希表 Hash Table
二叉树 Binary Tree  
堆 Heap
并查集 Union Find
字典树 Trie
对算法题来说有两大法宝,“拿到题选什么算法”和“如何实现这个算法”,后者会更容易一些,所以可以先从实现算法开始练起(LintCode的分类阶梯训练)。
然后当一些标准算法数据结构都不陌生后,再去训练新题,尝试用各种算法解决各种不同的问题。

当然,针对面试准备,也有一些书:
《剑指 Offer》:几乎包含所有常见的、经典的面试题,是应对面试的必读书籍
《编程之美》:适合准备面试FLAG大厂时候用来刷题
ps:这两本书都可以配合在LintCode上刷题

    竞赛算法
算法学习最好由浅入深,先了解算法思维,再去理解实际应用;
当逐步全面的掌握相关知识体系,有一定实践经验后,可以去参加一些竞赛提升自己的算法能力。
竞赛算法是比较锻炼人的,对于竞赛来说,每道题对输入参数和样本量的要求都非常明确,包括对空间的限制和运行时间的限制也规定的非常明确。每一个竞赛选手都非常熟练怎么根据这些提前给好的限制,反推出自己需要实现一个什么样复杂度的解法才能通过。所以对思维和逻辑上的锻炼是非常有效的。

献上一些面试常考算法类型和经典题,愉快地刷起来吧~

数学
尾部的零
斐波纳契数列
x的平方根
大整数乘法
骰子求和
最多有多少个点在一条直线上
超级丑数

比特位操作
将整数A转换为B更新二进制位
二进制表示
O(1)时间检测2的幂次
二进制中有多少个1

动态规划
编辑距离正则表达式匹配
交叉字符串
乘积最大子序列
二叉树中的最大路径和
不同的路径
通配符匹配


滑动窗口的中位数数据流中位数
最高频的K个单词
接雨水
堆化
排序矩阵中的从小到大第k个数

二叉树
二叉树中序遍历二叉树的序列化和反序列化
子树
最近公共祖先
二叉树的层次遍历
将二叉树拆成链表
在二叉查找树中插入节点

二分法
经典二分查找问题二分查找
两数组的交
区间最小数
寻找旋转排序数组中的最小值
搜索排序区间
寻找峰值

分治法
快速幂两个排序数组的中位数
合并K个排序链表

哈希表
变形词子串哈希函数
短网址
复制带随机指针的链表
最小子串覆盖

矩阵
搜索二维矩阵旋转图像
岛屿的个数
螺旋矩阵

宽度优先搜索
克隆图被围绕的区域
拓扑排序
单词接龙

链表
实现一个链表的反转链表求和 II
删除链表中的元素
LRU缓存策略
合并两个排序链表
两个链表的交叉
翻转链表 II
复制带随机指针的链表
带环链表

枚举法
统计数字名人确认
最长连续上升子序列
最大子数组差
最长公共前缀

排序
快排摆动排序
最大间距
最接近零的子数组和
最大数
四数之和
数组划分
第K大元素
排颜色

深度优先搜索
N皇后问题图是否是树
带重复元素的排列
分割回文串

数组
数组划分逆序对
合并区间
搜索旋转排序数组
最大子数组
删除排序数组中的重复数字
第二大的数组
先递增后递减数组中的最大值
两数和 - 输入的数据是有序的
两个排序数组的中位数
在大数组中查找
颜色分类
合并排序数组
无序数组K小元素
中位数
奇偶分割数组

贪心
主元素寻找缺失的数
买卖股票最佳时机
加油站
删除数字
落单的数
最大子数组差

线段树
线段树查询线段树的构造
线段树的修改
区间求和
统计比给定整数小的数的个数


带最小值操作的栈用栈实现队列
有效的括号序列
简化路径

整数
反转整数将整数A转换为B
整数排序

字符串处理
罗马数字转整数回文数
乱序字符串
有效回文串
翻转字符串
最长无重复字符的子串
字符串压缩
比较字符串编辑距离II

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 09:52 | 显示全部楼层
上学时候傻,为了校招,看了不下于五本算法书,加上LeetCode,刷了大半年。
总共一两千道题啊……不刷怕考到……忘了刷,刷了忘……毛都快掉没了……
现在工作近十年,辗转几个大厂,由当年的应试者变成了出题人,才知道,完全不必这么辛苦。
任何事情都遵循28原则,我们只要把握住那20%,就能拿到80分!
凡事都讲究性价比!
省下来的时间,谈个女朋友,它不香么???!!!
这里把我这些年的出题经验告诉大家,希望大家知道哪些是重点,应该怎么学数据结构和算法
直接上干货,我花了两天的时间做了一张图,涵盖数据结构和算法书籍中都会讲到的知识点。并给出了常用算法的平均时间复杂度,对于必须要学的内容前面加了星标


这里面涉及到了近二十种数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;超四十种常见算法思想:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
需要高清无水印思维导图源文件的小伙伴,可以点击这里获取:
算法导图及推荐学习资料下载长文预警,以下内容涵盖了十几年来学习算法的心得,总结出来供大家参与。如果看完这篇文章,还学不好算法,尽管来骂我。

收藏是点赞的五倍啊,原创不易,小伙伴们双击屏幕点个赞支持下吧,手动叩谢了。

文章写了很久,我相信它一定能帮到你,也希望大家能给我个赞,以示鼓励,谢谢

目录:
    数据结构与算法的区别数据结构怎么学怎么学习算法算法太难懂?那是你不知道这些模拟网站
一、数据结构与算法的区别

很多同学搞不明白,数据结构与算法有什么区别,甚至有些同学以为数据结构中就包含了算法。
其实,是字面意思就能知道个大概,数据结构主要讲解数据的组织形式,换句话说,我就是我们要怎样把这些数据存储起来,所以有列表、堆、栈、树、图,这是数据结构的重点。
算法,则注重的是思想,比如列表里的元素怎么排序、怎么在当前的存储结构中找到最大的数和最小的数?等等,说白了就是解决现实中问题的思想。所以才会有分治思想、贪心思想、动态规划这些经典算法。
二、数据结构怎么学

关于数据结构,我想说的是,它是这四大件中最简单、最基础的一个。离开了数据结构,几乎任何的程序都会失效,所以在讨论数据结构的时候,常常要把算法也连带着说一说。
要单纯地掌握常见的数据结构,就如同拆解一个个精妙的仪器件一样有趣和简单。正因为数据结构这个东西在程序中的作用,和仪器部件特别相像,不同的数据结构有着不同的特性,因此要想学好数据结构,图解是必备武器!
这里强推中国大学上,浙江大学的开设的《数据结构》课程,涵盖了常用的数据结构和算法。
数据结构_浙江大学_中国大学MOOC(慕课)辅以教材参考书,强推《大话数据结构》,光看封面你就知道这本书的风格了
没错,这就是大名鼎鼎的《大话设计模式》的作者出的,绝对顶。
三、怎么学习算法

算法课常常和数据结构课放在一起,在有些高校中,会存在“数据结构与算法”和“算法设计与分析”这样的两门课。
学习算法的套路很简单,多看、多写、多上机,既然是思想的集合,看得多了,自然无师自通。
至于刷题,很多同学都知道要刷LeetCode。
LeetCode题库:(2123题)
题库 - 力扣 (LeetCode)总共两千多道题,而且有些题,非常难,就算每天10题,也至少刷半年。这显然不适合绝大部分同学。
所以,我们要找到最核心、最重要的题集,即可
比如,如果时间紧张,可以先刷《程序员面试宝典》里的题目,总共109题。
《程序员面试宝典》刷完以后,有时间,可以再刷《剑指offfer》的题目,共75题。
《剑指offer》因为这两本书,都是面向面试的高频题汇总,自然有很多题目是重合的。这也正能说明这两本书的重要性。
如果专攻面试的话,还有两本不错的书推荐:
《编程珠玑》这本书的豆瓣评分非常高,有 9 分。
这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。
《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。
当然,我也有一本谷歌师兄总结的高频面试算法习题集,包含了常见的数据结构和算法汇总,无论是排版还是内容,都是非常棒。
所有这些书,我都为大家找到并下载好了,需要的小伙伴可以直接领取。这回得帮我点赞了吧
算法导图及推荐书籍资料下载四、算法太难懂?那是你不知道有这些模拟网站

算法的难点在于,根本没办法在脑子里抽象出它的步骤啊
对于做个几何题都费劲的男孩子来说,那更是要了他的亲命了。
今天,我就给大家推荐几个算法可视化的网站。
没错,就是写了代码以后,可以看见他们是怎么一步步求出结果的。
1、https://visualgo.net/en
目前网站支持中文,印尼文,日文等多语言版本。
最关键的是,它几乎包含了所有算法!!!!
在搜索选项中你可以根据关键词查找到你想要的算法。
点进去一个具体的算法之后,会有两种方式的可视化呈现方式,一种是电子讲座模式,一种是示例模式。其中示例模式是以动画方式呈现,你可以控制动画的快进与倒退,电子讲座模式是以知识点讲解模式呈现,你可以手动控制页面的进度。两种方式都可以帮助你演示每个步骤的过程代码。
接下来我们演示一下冒泡排序的执行过程,如下图所示:
另外,你还可以创建一组自定义的数,然后让动画显示“你的算法”。
除此之外,还支持在线测试哟~
2、Algorithm Visualizer
在Algorithm Visualizer,大家可以很清楚的看到算法运行的整个过程,很直观,便于大家学习。
大家可以很清楚的看到,网站分为三部分,最左边是算法目录,大家可以选择自己感兴趣的算法,目前已经包括了很多算法了,比如二叉树、图、排序算法、动态规划等等经典算法 。中间区域主要是算法演示以及运行log。右侧是代码以及算法运行按钮。
我们用它来演示一下冒泡排序的执行过程,如下图所示:
同时它是开源的,目前有35K个star,足以可见该项目的欢迎程度,这里推荐给要学习算法的各位。
https://github.com/algorithm-visualizer/algorithm-visualizer
3、Data Structure Visualization
目前已经有很多常用的数据结构与算法的可视化,如:常见的数组、链表、队列、二叉搜索树、红黑树、各种排序等,如下图所示:
比如,我们用它来模拟一个二叉搜索树,如下图所示:
我们再用它来演示一下快速排序算法,如下图所示:
把这些内容学会,算法应该说是非常牢固了,无论是校招还是工作,都已经非常够用了。
但程序员的人生不是只有算法的学习,我们还有校招、面试、青春饭等等的困惑,我把我这些年的所知所得,整理成了一本书,开源到github上了。相信会对大家很有帮助,大家可以去看.
目前还在持续更新,欢迎大家star。
地址:https://github.com/harvic/FightingCoder
好了,这篇就到这了,希望大家毕业都能找到好工作。
我是 @启舰 ,原创不易,帮我点个赞吧。



本人所有文章皆为原创,著作权归@启舰 所有,未经授权,转载必究

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 09:57 | 显示全部楼层
精练那些最经典最常考的算法题型(套路), 比如: DFS深度优先搜索, BFS广度优先搜索,二分查找, 拓扑排序, 分治, 动态规划。
很多题可以用多种套路来解。比如很多Binary Tree问题既可以用DFS来解, 也可以用分治法来解。比如很多Graph问题既可以用DFS来解, 也可以用BFS来解。多刷经典题可以帮你在大脑中建立从“题”到“套路”的映射,以及从"套路"到"代码模板"的映射。通过精练, 把两个映射连起来, 就可以达到"看到一道题, 快速写出bug-free代码"的状态。
如何精练?推荐一个组合: AlgoExpert + LeetCode。AlgoExpert负责"师傅引进门", 适合那些刚刚起步学算法的同学。LeetCode更像是"修行靠个人", 适合那些有一定基础想要进一步强化训练的同学。
下面分别介绍一下。
AlgoExpert最大特色是精讲精练。视频讲解150道高频经典算法题,覆盖所有重要题型,精讲每种数据结构。每道题都提供9种编程语言版本的答案。它也有完整编码环境,可以自己写代码跑测试看结果。所有的题都按照算法套路来分类,更方便你分类算法思路、总结算法模板。把这150道经典题练好,你的算法水平会被拉高到一个不错的水平。
LeetCode的题库有上千道题。最大的价值是热门公司的高频题库。面试前对着目标公司的高频题精刷, 事半功倍。使用它的高频题库需要付费。要在美国找工作的同学可以订阅LeetCode Premium, 获取美国各个大厂的题库。要在国内找工作的同学可以订阅力扣Plus(近似于LeetCode Premium中国版), 获取中国各个大厂的题库。
AlgoExpert的网址是 https://algoexpert.io/schelley 使用折扣码schelley可获得折扣。
LeetCode Premium的折扣链接(省15%)是 https://sourl.cn/YuKLKz
力扣Plus的折扣链接(省15%)是 https://sourl.cn/pRFdDr  
关注我 - YouTube/B站/头条: SchelleyYuki
发表于 2021-7-4 09:58 | 显示全部楼层
万丈高楼平地起,要系统学习算法还得从基础开始。
    首先学习一门语言。例如 C/C++/Java/python,初学者学 C++、python比较普遍。学数据结构。数据结构书有很多,但是有些教材晦涩难懂,建议看图解多、通俗易懂的书。学算法。不要一上手就看《算法导论》,大量例子证明会让你崩溃。找本适合初学者快速掌握的算法入门书。
接下来,将高级程序员陈小玉老师总结的学习诀窍分享给题主,希望对你有所帮助。
分享人:陈小玉(副教授、高级程序员、畅销书《趣学算法》《趣学数据结构》作者)
01  为什么要学数据结构?

遇到一个实际问题的时候,需要解决两个事情:
(1) 如何将数据存储在计算机中;
(2) 用什么方法策略解决问题。
前者是数据结构,后者是算法。
只有数据结构没有算法,相当于只把数据存储到计算机中而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。
数据是一切能输入到计算机的信息的总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有效地存储在计算机中。算法是指对特定问题求解步骤的一种描述,说白了就是解决问题的方法策略。
数据结构和算法不依赖语言,什么语言无所谓。但是如果上机实现的话,就要使用计算机语言。
遇到一个实际问题,充分利用所学的数据结构的知识,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现,这就是N.Wirth 教授所说的:
    数据结构+ 算法=程序
计算机专业的本科生都开设数据结构课程,因为它是计算机学科的知识结构核心和技术体系的基石。
研究生考试也是必考科目,随着科学技术的飞速发展,数据结构的基础性地位不仅没有动摇,反而由于近年来算法工程师的高薪火爆,而得到了业内空前的重视。
很多人觉得基本的数据结构及操作已经在高级语言(如 C++、JAVA 语言中)中封装,栈、队列、排序、优先队列等都可以直接调用库函数,学会怎么调用就好了,干嘛要重复造轮子?
02  学习数据结构有什么用处?

学习数据有效存储的方法

很多学生在学习数据结构时,问我要不要把单链表插入删除代码背下来?要不合上书就不会写了。我非常诧异,为什么要背?理工科技术知识很少需要记忆的,是用的!学习知识不是死记硬背,更重要的是学习处理问题的方法。
同一个问题,如何有效地存储数据,不同的数据结构产生什么样的算法复杂性,有没有更好的存储方法提高算法的效率?
例如,用顺序表查找需要O(n)的时间复杂度,用平衡树查找需要 O(logn)的时间复杂度。这是什么概念呢?就像你有 10 个亿,一觉醒来,兜里只剩下 30 块!
处理具有复杂关系的数据

现实中很多具有复杂关系的数据,无法通过简单的库函数调用实现。专业认证中特别强调培养学生解决复杂工程问题的能力,什么是复杂工程问题?
就是需要综合运用多个知识技术解决的问题。如同现在很多芯片高度集成,完全不需要芯片内部如何,直接使用就行了。
但是,如果在现实中遇到一个复杂问题,一个芯片只能完成其中一个功能,难道要连接十几块芯片来解决这一个问题?
你在搞圣诞树嘛?一个树枝挂个小礼物,叮叮当当的乱响。这显然是不合适的,我们需要的是完成该复杂问题的一个芯片,因此需要运用所学的数据结构知识,高效处理具有复杂关系的数据。
通过学习数据结构,更加准确、深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓
03  数据结构的学习秘籍

▲ 会数据结构的基本操作
这是最基础的要求,学会各种数据结构的基本操作,取值、查找、插入、删除等。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。
初学时,要想理解数据结构,一定要学会画图,通过画图形象表达,更能体会其中的数据结构关系。因此,初学阶段学习利器:画图,理解,画图
▲ 会利用数据结构,解决实际问题
在掌握了书上的基本操作之后,就可以尝试利用数据结构解决一些实际问题了,先学经典应用问题的解决方法,体会数据结构的使用方法,然后再做题,独立设计数据结构解决问题。
要想熟练应用就必须做大量的题,从做题中体会其中的方法。最好进行专项练习,比如线性表问题,二叉树问题,图问题,该阶段学习利器:做题,反思,做题
▲ 熟练使用和改进数据结构,优化算法
这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。它需要在学习算法的过程中慢慢修炼。
在学习算法的同时,逐步熟练应用、改进,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法
该阶段已经在数据结构之上,通过在测试系统上刷各种算法题,体会利用数据结构改进优化算法。该阶段学习利器:刷题,总结,刷题
刷题网站
    打比赛:HDU、POJ、Vjudge、Code Forces找工作:LeetCode
04  算法为什么那么难?

再来谈谈学习算法。
很多人感叹:算法为什么那么难!首先,算法本身具有一定的复杂性,但还有一个原因:讲的太烂!算法的教与学有两个困难:
我们学习了那些经典的算法,在惊叹它们奇思妙想的同时,难免疑虑重重:这么牛,怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。
但这对菜鸟来说,简直比登天还难,很可能花费很多时间也无法搞清楚。这条路对大多数人来说,是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?看似学会了,其实两手空空。遇到一个新问题,仍然无从下手。
可这偏偏又是极重要的,无论做研究还是实际工作,一个计算机专业人士最重要的能力,就是解决问题——解决那些不断从实际应用中冒出来的新问题。
算法作为一门学问,有两条几乎平行的线索。
一个是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等等。
另一个是算法策略:贪心、分治、动态规划、线性规划、搜索等等。
这两条线索是相互独立的:同一个数据对象上有不同的问题,例如单源最短路径和最优二叉树,就可以用到不同的算法策略,如贪心和动态规划;而同一个算法策略,例如排序和整数乘法,也会用到不同的数据结构。它们之间是多对多的关系。
两条线索交织在一起,该如何表述?
我们早已习惯《数据结构》中讲数据结构,《算法设计与分析》里面讲算法策略。各说各的,讲算法设计时就假设你已经对数据结构了如指掌,还没有哪一本算法书很好的解决这两个困难,传统的算法书,大多注重内容的收录,但却忽视思维过程的展示,因此我们学习了经典的算法,却费解于算法设计的过程。
遇到一个实际问题,通过问题分析,选择使用什么样的算法策略,基于这种算法策略选择什么样的数据结构,有时算法策略和数据结构的选择并不是唯一的,不同的算法策略和数据结构设计的算法,其复杂性是不同的。
而很多书就是灌输式的讲一个实例,一下子就选择了一个认定是最优的算法策略,告诉你就这样干,不谈数据结构,然后分析算法复杂性,就结束了。
原则上讲算法策略就讲算法策略,不依赖任何程序设计语言和数据结构,但对很多学生来讲,尤其是语言没学好,数据结构也不熟练的同学,只讲算法策略,如同空中楼阁。自己用算法解决实际问题,一头雾水。
这也是我为什么要写《趣学算法》这本书,来弥补目前学习资料的缺陷。这本书的讲解是从问题出发,根据实际问题进行分析,选择合适的算法策略,并分析为什么采用这种算法策略,然后选择什么数据结构,不同的数据结构复杂性会有什么区别,巧妙地将数据结构和算法策略拧成了一条线。
通过大量实例,充分展现算法设计的思维过程,让学生充分体会遇到一个问题,如何分析,使用什么算法策略,采用什么数据结构,算法的复杂性如何?是否有优化的可能?
05  算法学习秘籍

知识在于积累,学习需要耐力。学习就像挖金矿,或许一开始毫无头绪,一头雾水,但转个角度,换换工具,时间久了总会找到一个缝隙。成功就是你比别人多走了一段路,或许恰恰是那么一小步。
第一个建议:多角度,对比学习

学习算法,可以先阅读一本简单的入门书,然后综合几本书横向多角度看,例如学习动态规划,拿几本算法书,把动态规划这章找出来,比较学习,多角度对比分析更清晰,或许你会恍然大悟,噢,原来如此简单。
或许有同学说我哪有那么多钱买那么多书,只要你想学习,没有什么可以阻挡!你可以图书馆借,也可以联系你的老师,每学期上课前,我都会告诉学生,如果你想学习却没钱买书,我可以提供帮助。想一想,你真的没有办法?
第二个建议:大视野,不求甚解

经常有学生为了一个公式推导,或几句代码抛锚,甚至停滞数日,然后淹没在无尽的挫败感中,把自己弄得垂头丧气。公式可以不懂,代码可以不会。你不必投入大量精力试图推导书上的每一个公式,也不必探究语法或技术细节。
学算法就是学算法本身,首先是算法思想,解题思路,然后是算法实现,算法思想的背后可能有高深的数学模型,复杂的公式推导,你理解了当然玄妙,不懂就拉倒。
算法实现可以用任何语言,所以不必纠结是 C,C++,Java,Python,更不必管严格的语法规则,除非你要上机调试。
建议还是先领会算法,写伪代码,在大脑中调试吧,如果没有良好的编程经验,一开始就上机或许更让你崩溃。遇到不懂的部分,浏览一下或跳过去,读完了还不明白再翻翻别的书,
总有一天,你会发现,“蓦然回首,那人却在灯火阑珊处”。
第三个建议:多交流,见贤思齐

与同学,朋友,教师或其他编程爱好者们一起学习和讨论问题,是取得进步最有效的办法,也是分享知识和快乐的途径。
加入论坛,加入交流群,会了解其它人在做什么,怎么做,遇到问题可以请教高手,带来醍醐灌顶的喜悦;也可以应助菜鸟,使你暗自得意,信心倍增。论坛和群也会分享大量的学习资料和视频,还有不定期的培训讲座,读书交流会,你会发现,你不是一个人在战斗!
第四个建议:勤实战,越挫越勇

实践是检验一切真理的标准。古人云:“学以致用”,“师夷长技以制夷”。请不要急切期盼“实际的”例子,更不要看不起小实例,“不积跬步,无以至千里”。
大规模的成功商业案例所采用的算法,人工情感,无人驾驶,不是我们目前要解决的问题。
看清楚脚下的路,比仰望天空更实际,多做一些实战练习,更好地体会算法的本质,在错误中不断成长,越挫越勇,终究会成参天大树。
06 如何打开算法和数据结构这两扇门?

推荐两本入门书 :《趣学算法》&《趣学数据结构》
《趣学算法》,作者:陈小玉
六大推荐理由:

▲ 实例丰富,通俗易懂。从有趣的故事引入算法,从简单到复杂,使读者从实例中体会算法设计思想。实例讲解通俗易懂,让读者获得最大程度的启发,锻炼分析问题和解决问题的能力。
▲ 完美图解,简单有趣。结合大量完美绘图,对算法进行分解剖析,使复杂难懂的问题变得简单有趣,给读者带来巨大的阅读乐趣,使读者在阅读中不知不觉地学到算法知识,体会算法的本质。
▲ 深入浅出,透析本质。采用伪代码描述算法,既简洁易懂,又能抓住本质,算法思想描述及注释使代码更加通俗易懂。对算法设计初衷和算法复杂性的分析全面细致,既有逐步得出结论的推导过程,又有直观的绘图展示。
▲ 实战演练,循序渐进。每一个算法讲解清楚后,进行实战演练,使读者在实战中体会算法,增强自信,从而提高读者独立思考和动手实践的能力。丰富的练习题和思考题用于及时检验读者对所学知识掌的握情况,为读者从小问题出发到逐步解决大型复杂性问题奠定了基础。
▲ 算法解析,优化拓展。每一个实例都进行了详细的算法解析,分析算法的时间复杂度和空间复杂度,并对其优化拓展进一步讨论,提出了改进算法,并进行伪码讲解和实战演练,最后分析优化算法的复杂度进行对比。使读者在学习算法的基础上更上一个阶梯,对算法优化有更清晰的认识。
▲ 网络资源,技术支持。网络提供本书所有范例程序的源代码、练习题以及答案解析,这些源代码可以自由修改编译,以符合读者的需要。本书提供源代码执行、调试说明书,对读者存在的问题提供技术支持。
《趣学数据结构》,作者:陈小玉
三大推荐理由:

▲ 完美图解+ 丰富实例,复杂问题简单化
为基本操作配以图解,用数据结构解决生活中的实际问题,学习过程更加轻松有趣。
▲ 原理分析+ 实战演练,真正地学以致用
通俗化讲解基础知识,在实战中体会数据结构的设计和操作,锻炼独立思考的能力。
▲ 配套代码+ 在线答疑,为学习保驾护航
提供书中的范例程序源代码、练习题以及答案解析,并在博客和 QQ 群中答疑解惑。
以上。
内容来源:异步图书,有删改。
========
点赞、收藏、关注@人民邮电出版社一键三连,感恩有你~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 10:01 | 显示全部楼层
想要系统学习算法,那自然是一手理论、一手实践,两手都要抓,两手都要硬
理论部分,看书是必不可少的。你在网上看了别人写得一大堆算法分析文章,可能不如在经典书籍上翻几页。
从算法入门到进阶,每个阶段找到适合的经典书籍来看,有助于循序渐进夯实算法理论基础,又不会因为晦涩难懂而劝退自己。这里推荐几部公认的算法好书:
算法入门
《算法图解》:“像小说一样有趣的算法入门书”,图文并茂,适合零基础入门科普。
《大话数据结构》:以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。
面试必备
《剑指offer》:国内程序员求职应该没有没听说过的吧。
《编程之美》&《Cracking the Coding Interview》:这两本书的算法题要比《剑指offer》要难一些,比较适合国外求职的同学。
其中《剑指offer》和《编程之美》在LintCode上也有对应的算法题ladder供大家练习。
算法进阶
《算法 第4版》:豆瓣9.4,人称“算法红宝书”,懂的都懂。要说缺点的话就是没有讲动态规划。
《算法导论》:新手容易被劝退,有一定基础后再看,会有不一样的收获。
挑战自我
《计算机程序设计艺术》:真正的大部头,总共7卷。深度、广度、系统性、全面性是其他算法和数据结构书籍所不能比的。如果想要在算法领域深入钻研,不妨挑战一下这部书。
算法实践

看书的同时,也不要忘记多动手自己实现各种算法和数据结构。看懂书上的内容是一回事,能自己写出代码并实现又是另一回事了。
这时候就可以在LintCode上刷题,选择对应的算法或数据结构tag,可以练习相应的算法题,从易到难,循序 渐进地刷。
另外针对算法面试,结合九章算法的学习刷题路线,我们整理了面试高频考到的算法与数据结构,大家有需要自取~
算法部分包括:复杂度理论基础,双指针算法、排序算法、二分法、宽度优先搜索、递归、遍历、分治、深度优先搜索、记忆化搜索、动态规划。
数据结构包括:栈、队列、链表、数组、哈希表、二叉树、堆、并查集、字典树。
掌握这些算法和数据结构,基本可以应付90%以上的面试算法题。至于如何学习?除了算法书外,我还推荐来LintCode刷题,这里送上各种算法的常考题和经典题,搭配《九章算法班》食用更佳~
双指针算法
最长无重复字符的子串
装最多水的容器
接雨水
有效回文串
带环链表 II
排序算法
摆动排序
构造队列
Nuts 和 Bolts 的问题
第k大元素
无序数组K小元素
逆序对
区间和的个数
二分法
寻找旋转排序数组中的最小值
搜索旋转排序数组
对x开根
两个整数相除
寻找峰值
宽度优先搜索
单词接龙
岛屿的个数
二叉树的层次遍历
克隆图
二叉树的锯齿形层次遍历
二叉树的右视图
递归
生成括号
格雷编码
平衡二叉树
电话号码的字母组合
全排列
二叉树中的最大路径和
遍历
买卖股票的最佳时机 III
最大子数组 II
二叉树的层次遍历
二叉树的前序遍历
二叉树的后序遍历
二叉树的所有路径
二叉树的层次遍历 II
分治法
两个排序数组的中位数
合并k个排序链表
平衡二叉树
二叉树中的最大路径和
验证二叉查找树
深度优先搜索
二叉树的最小深度
插入五
克隆图
单词接龙 II
分割回文串
N皇后问题

动态规划
最大的假期天数
爬楼梯关注问题
正则表达式匹配
打劫房屋
单词拆分 I
乘积最大子序列
解码方法关注问题
编辑距离
最后在九章算法班的首节直播分享中,将会送出算法面试精选100题,刷题100道胜过别人刷300道,有兴趣的同学可以来看看!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 04:35 , Processed in 0.102044 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表