Skip to content

Commit

Permalink
算法
Browse files Browse the repository at this point in the history
  • Loading branch information
itwanger committed Apr 2, 2022
1 parent 0b907fd commit 5ddaa0d
Show file tree
Hide file tree
Showing 21 changed files with 284 additions and 17 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
* [操作系统学习路线(建议收藏:+1:](docs/xuexiluxian/os.md)
* [前端学习路线(建议收藏:+1:](docs/xuexiluxian/qianduan.md)
* [蓝桥杯学习路线(建议收藏:+1:](docs/xuexiluxian/lanqiaobei.md)
* [算法和数据结构学习路线(建议收藏:+1:](docs/xuexiluxian/algorithm.md)

# Java核心

Expand Down
11 changes: 0 additions & 11 deletions _sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,13 @@
* [辅助工具/轮子](README.md?id=辅助工具)
* [安全篇](README.md?id=安全篇)
* [分布式](README.md?id=分布式)
* [Elasticsearch](README.md?id=Elasticsearch)
* [ZooKeeper](README.md?id=ZooKeeper)
* [高性能](README.md?id=高性能)
* [消息队列](README.md?id=消息队列)
* [高可用](README.md?id=高可用)
* [数据库](README.md?id=数据库)
* [MySQL](README.md?id=MySQL)
* [Redis](README.md?id=Redis)
* [MongoDB](README.md?id=MongoDB)
* [计算机基础](README.md?id=计算机基础)
* [数据结构](README.md?id=数据结构)
* [前端](README.md?id=前端)
* [求职面试](README.md?id=求职面试)
* [面试题集合](README.md?id=面试题集合)
* [背诵版八股文](README.md?id=背诵版八股文)
Expand All @@ -51,10 +46,4 @@
* [联系作者](README.md?id=联系作者)
* [心路历程](README.md?id=心路历程)
* [联系方式](README.md?id=联系方式)
* [技术交流群](README.md?id=技术交流群)
* [原创公众号](README.md?id=原创公众号)
* [star趋势图](README.md?id=star趋势图)
* [友情链接](README.md?id=友情链接)
* [捐赠鼓励](README.md?id=捐赠鼓励)
* [参与贡献](README.md?id=参与贡献)

2 changes: 1 addition & 1 deletion docs/.vuepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export default defineHopeConfig({
"link",
{
rel: "stylesheet",
href: "//at.alicdn.com/t/font_3180624_bw25nf7s0pb.css",
href: "//at.alicdn.com/t/font_3180624_j8m9er1ryod.css",
},
],
],
Expand Down
5 changes: 5 additions & 0 deletions docs/.vuepress/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ export const sidebarConfig = defineSidebarConfig({
link: "lanqiaobei.md",
icon: "lanqiao-logo",
},
{
text: "算法和数据结构学习路线",
link: "algorithm.md",
icon: "algorithm",
},
],
// 必须放在最后面
"/": [
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ actions:

## 推荐阅读

- [CS 学习指南👉](/xuexiluxian/) : 一份涵盖 Java、C 语言、C++、Python、Go、前端、操作系统、蓝桥杯的全方位 CS 学习路线!清晰且有效!
- [CS 学习指南👉](/xuexiluxian/) : 一份涵盖 Java、C 语言、C++、Python、Go、前端、操作系统、蓝桥杯、算法和数据结构的全方位 CS 学习路线!清晰且有效!
- [Java程序员常读书单📚,附下载地址](https://gitee.com/itwanger/JavaBooks) : 助力Java 程序员构建最强知识体系,涵盖Java、设计模式、数据库、数据结构与算法、大数据、架构等等,再也不用辛苦去找下载地址了。
- [编程喵喵🐱实战项目学习教程](https://github.com/itwanger/codingmore-learning) :codingmore(Spring Boot+Vue 的前后端分离项目,一款值得一试的开源知识库学习网站)的学习教程,需要项目经验的 Java 开发者必备!
- [优质文章精选集📗](download/nicearticle.md) :精选一些 Java 程序员应该读一读的优质文章,帮你少走一些弯路!
Expand Down
5 changes: 5 additions & 0 deletions docs/download/history.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# 网络日志

### 2022年04月02日

- [杨锅锅同学提出错误:浮点多了个long, 整数少了个int](https://tobebetterjavaer.com/sidebar/sanfene/javase.html)
- [增加数据结构与算法的学习路线](https://tobebetterjavaer.com/xuexiluxian/algorithm.html)

### 2022年03月31日

- [增加学习建议板块](http://localhost:8080/home.html#学习建议)
Expand Down
1 change: 1 addition & 0 deletions docs/home.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ headerDepth: 1
* [操作系统学习路线(建议收藏:+1:](xuexiluxian/os.md)
* [前端学习路线(建议收藏:+1:](xuexiluxian/qianduan.md)
* [蓝桥杯学习路线(建议收藏:+1:](xuexiluxian/lanqiaobei.md)
* [算法和数据结构学习路线(建议收藏:+1:](xuexiluxian/algorithm.md)

## Java核心

Expand Down
4 changes: 2 additions & 2 deletions docs/sidebar/sanfene/javase.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ Java 语言数据类型分为两种:**基本数据类型**和**引用数据类
<b>基本数据类型:</b>

- 数值型
- 整数类型(byte、short、long)
- 浮点类型(float、long
- 整数类型(byte、short、int、long)
- 浮点类型(float、double
- 字符型(char)
- 布尔型(boolean)

Expand Down
265 changes: 265 additions & 0 deletions docs/xuexiluxian/algorithm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
---
star: true
category:
- 学习路线
tag:
- 算法和数据结构
---

# 算法和数据结构学习路线(建议收藏:+1:

说出来还真有点不好意思。上学那时候傻,为了校招,硬着头皮刷《算法导论》、《编程珠玑》,还有 LeetCode,刷了小一年。

刷着忘着,忘着刷着,不刷怕考到,最后刷的秀发都稀疏了。

等找到了工作后才恍然大悟,原来当初根本不用那么辛苦。这不,刚好有小伙伴在《[Java 程序员进阶之路](https://tobebetterjavaer.com/)》上问我算法的学习路线,我就毫不保留地把我算法方面的学习经验分享出来,希望能给大家一点点启发和帮助。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-59f3bc36-4e6c-48c0-86e5-8afdd6165147.png)

我画了一张图,里面几乎涵盖了所有数据结构与算法书籍中都会讲到的知识点。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-220e86a7-fa5d-44a2-a560-3cb6cfa70ad0.png)

但讲良心话,对于一个初学者,或者不打算卷算法岗的程序员来说,完全就没必要把思维导图里面的所有知识点都学了,那样就太不高效了。

我们学习数据结构与算法,也得讲究策略。我的建议是这样的(敲黑板、划重点了啊):

**7 个数据结构**

- 数组
- 链表
-
- 队列
- 哈希表
- 二叉树
-

**10 个算法**

- 递归
- 排序
- 二分查找
- 搜索
- 哈希算法
- 贪心算法
- 分治算法
- 回溯算法
- 动态规划
- 字符串匹配算法

这些是学习数据结构与算法时的重点。很多人在第一次接触数据结构与算法这门课时,往往会觉得很抽象,很难搞懂,以至于站在门外徘徊不前。

其实真正的原因是没有找到好的学习方法,没有抓住学习的重点。相信你认真看完我这条学习路线后,学起来就会有的放矢、事半功倍了。

### 一、什么是数据结构

数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。

简单点说,数据结构就是把一堆数据,按照某种格式揉成一坨。

大家喜欢吃宫保鸡丁吗?

反正二哥挺喜欢这道菜的。我就以宫保鸡丁为例,来讲一讲数据结构吧。维基百科上是这样定义的。

宫保鸡丁(英语:Kung Pao chicken或Kung-Pao Chicken),又称宫爆鸡丁,呈糊辣荔枝味,源于黔菜、流传至鲁而后成于川菜的一道川味名菜。贵州、山东和四川三地对这道菜的做法不完全一样,称呼也有差异。贵州称为糊辣子鸡丁,山东则名为酱爆鸡丁,而四川是以宫保鸡丁为名的。

来,抽象下宫保鸡丁。

```
struct KungPaoChicken {
  鸡肉 = []
  花生 = []
  葱段 = []
  花椒 = []
  辣椒 = []
}
```

这个结构体(struct 是 C 语言中的一个概念)就是一个自定义的数据结构,将很多不同的配料融合在了一起。对于计算机的数据结构来说,只不过是把这些配料换成了基本数据类型。

抽象完宫保鸡丁再来抽象一下二哥吧。

```
class 二哥 {
  int age = 18;
  double 体重 =  65kg;
  
  void eat(宫保鸡丁) {
    体重 += 1kg;
  }
}
```

伪代码不是很严谨哈,大家理解这个意思就行了。

说到底,数据结构不过是一种抽象后的封装。像 Java,它之所以流行的一个很重要的原因,就是它提供了多种多样的、方便开发者调用的数据结构,比如说对数组的封装 ArrayList、对链表的封装 LinkedList、对哈希表的封装 HashMap、ConcurrentHashMap 等等。C 语言就没有这些,想用的话,就得自己封装。但 Java 和 C 语言的基本数据类型是一致的,int、float 这些都是相通的。

对于初学者来说,平常敲代码都是直接去调用数据结构的,是很少去想这些数据结构是怎么实现的。

当一个初学者向高级程序员迈进的时候,就必须得静下心来,去搞清楚 ArrayList 和 LinkedList 的内部实现,搞清楚之后就会明白,之所以它们在增删改查的时候性能上有差异,就是因为它们的内部使用了不同的数据结构所导致的。

经典的数据结构与算法都有哪些呢?比如说队列、栈、堆、二分查找、动态规划等等。

### 二、什么是算法

算法就是操作数据的一组方法。数据结构是为算法服务的,而算法想要体现出自己的价值,就必须得有数据结构这个载体。

它们俩就好像是一对恋人,离开了谁,都会孤单寂寞冷。

那一些初学者可能会有这样的疑惑:我数学成绩一般,学数据结构与算法会很吃力吗?

当然了,数据结构和算法离不开一些数学方面的推理和证明,比如说我们在分析某个算法的时间复杂度和空间复杂度时。但这个不需要去担心,只要你能保持高中时期的数学水准,就完全可以学好数据结构与算法。

### 三、为什么要学习数据结构和算法

你是不是觉得数据结构与算法,跟操作系统、计算机网络一样,都是脱离实际工作的知识,可能除了面试,这辈子都用不着?

就算不懂数据结构与算法,照样可以把 Java API、开发框架用得飞起?

首先,面试的确是要考数据结构与算法的。这是很多大厂的筛选要素之一。

这是因为校招的时候,参加面试的学生大多数都是没有实际项目经验的,公司只能通过考察这些基础知识来筛选。

大厂不怕你没有项目经验,而怕你没有长期发展的潜力。

所以,很多参加校招的同学,在面试前都会疯狂刷题的,至少会突击个 100 道左右的题目。

其次,实际工作当中肯定是会用到的。

举个例子,存储某个业务数据时,你打算用 ArrayList 还是 LinkedList,它们底层用的是哪种数据结构,增删改查上有哪些优缺点?

再比如,Redis 中的有序集合是用什么数据结构实现的?为什么要用跳表二不是二叉树呢?

不懂数据结构和算法,行得通吗?

还有,掌握了数据结构与算法,对阅读源码会有很大的帮助,因为很多时候,源码当中都会考量到不同数据结构之间的优点和缺点。

你比如说,HashMap 为什么在链表长度大于 8 的时候将其转为红黑树?为什么不能是二叉树?

总结一下。

我们学习数据结构与算法,并不是为了死记硬背几个知识点,我们的目的是建立时间复杂度、空间复杂度的意识,写出高质量的代码,提升编程技能,训练逻辑思维,从而获得更高的薪资回报。

为什么要学习数据结构与算法,我认为 3 点很重要:

1、写出性能更佳的代码。
2、算法是求解问题的计算步骤,而程序是用计算机可以理解的语言来描述的算法。
3、长期来看,思考能力是一个人非常重要的核心竞争力,而算法是为数不多能训练思考能力的途径之一。

是时候提升自己的内功了,这样怼人也会更自信,跳槽也不用畏畏缩缩了。

### 四、硬核算法和数据结构学习资料

**1)视频**

B 站上浙江大学的一个数据结构课非常不错,很系统很经典。每次看这些大学老师的讲课就越觉得考好大学很重要,很多学校的老师,在讲数据结构和算法的时候,自己都不知道自己在讲什么。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/java/yitiaolong-e2812c94-5945-41ad-adcd-4dbb02fae8d5.png)

不得不说,陈越姥姥等人对数据结构和算法这个领域的知识理解是真的透彻,我在听这个课的时候感觉整个人都通透了。

视频地址:[https://www.bilibili.com/video/BV1JW411i731](https://www.bilibili.com/video/BV1JW411i731)

这里还有个同学在 GitHub 上整理这门课程的所有课件和作业,学习 Java 的小伙伴可以尝试用 Java 完成下作业。

>GitHub 地址:[https://github.com/CYBruce/DataStructure_Algorithm_ZJU](https://github.com/CYBruce/DataStructure_Algorithm_ZJU)

**2)书籍**

入门阶段推荐陈小玉老师的《[趣学数据结构](https://book.douban.com/book/subject/34785269/)》和《[趣学算法](https://book.douban.com/subject/27109832/)》。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-2ac7da9b-e812-49d9-8012-5e2f792f87bf.png)

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-18b8f9d6-cbfa-482f-80a0-57081e3616d8.png)



算法领域的经典参考书《[算法 4](https://book.douban.com/subject/19952400/)》也非常值得推荐,里面的代码是用 Java 实现的,所以 Java 开发者可以直接选用这本书。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-766885af-dfac-452f-b110-c9ca89a0bb9a.png)

学霸型人才可以直接刷《[算法导论](https://book.douban.com/subject/20432061/)》,严谨全面,可以直接拿来作为研究生阶段的算法课程教材。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-fc895095-927c-42a4-a934-f98371a6f376.png)


**3)开源电子书**

算法方面的开源电子书是真的非常多,这里推荐下《labuladong 的算法小抄》,仓库里面有句话我非常认同——“刷题刷题,刷的是题,培养的是思维”,这个仓库的优势就在于,它的解题思路很完备,我相信可以帮助到不少读者,至少在刷题的时候少走很多弯路。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-d573f369-7dff-47a3-9929-46044e419aa8.png)

>GitHub 地址:[https://github.com/labuladong/fucking-algorithm](https://github.com/labuladong/fucking-algorithm)
当然了,考虑到有些小伙伴需要 PDF 版的,我也准备好了。直接长按识别/扫描下方二维码,关注后回复 「**刷题**」 下载这份 PDF 吧:

![扫码关注后回复「刷题」关键字](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png)

除此之外,再给大家推荐三份高质量的刷题笔记,C/C++、Java、Go 版的全有了!同样可以通过上面的方式获取。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-6c0c84be-ba1c-48d0-8ea7-70ef66e04ff2.png)

**4)在线网站**

>LeetCode题库:[https://leetcode-cn.com/problemset/all/](https://leetcode-cn.com/problemset/all/)
学习算法的套路非常简单,多看、多练,至于刷题,小伙伴们都知道要刷 LeetCode。只不过 LeetCode 上现在有两千多道题,而且有些题非常难,就算每天刷 10 道,也得刷半年以上。这显然不适合绝大多数的小伙伴,所以我们要找到核心,最重要的题集。

这里我给大家整理了 100 道面试高频算法题,大多数的小伙伴们按照这个路线去刷就足够应付面试了。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-c4d31ba3-6d81-4617-a68b-81d935b2a106.png)

>VisuAlgo:[https://visualgo.net/zh](https://visualgo.net/zh)
算法的难点在于,没办法在脑例子抽象出它的步骤,那 VisuAlgo 就是一个非常值得推荐的可视化算法网站。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-b0d17b5d-d13a-46aa-a8b0-6b16772a30a6.png)


**5)付费专栏**

小争哥在极客时间上开了一门《数据结构与算法之美》的付费专栏,风评非常不错,喜欢的小伙伴可以[戳链](http://gk.link/a/11ijz)接去购买。

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/xuexiluxian/algorithm-705c33b5-b90e-49c7-a3bc-a1f3c4630a66.png)

### 五、一点小心得

最后来分享一些让你事半功倍的学习技巧。

**第一、边学边练**

想一想,上学期间,除了听老师上课,自习外,最多的是什么?

对了,考试。

大大小小的考试,可不只是为了检验成绩,而是将你学会的举一反三,将你不会的拉出来吊打,折磨,直到下次考试的时候更进一步。

其实不只是学数据结构与算法了,学习任何一门其他的课程都一样,只看只听是完全不中用的,至少要做笔记啊,要把作业给交了呀!

至于刷题嘛,适量即可,不要总去挑战最难的,容易迷茫。

**第二、多交流**

二哥有个老乡,阿秀,凭借自己的努力考上了研究生,并且在研究生阶段刷了很多题,最终上岸了字节。

在刷题的过程中,他可不只是自己默默地刷,还结交了很多朋友,看到别人的解法,总是忍不住留言切磋一番,没想到,竟然结识了很多朋友。

然后大家一起交流互动后,水平都有所提高。思维的碰撞,很重要!

**第三、循序渐进**

道理都懂,但最后坚持下来的总是寥寥无几。

很重要的一个原因就是,很多人急于求成,总想一嘴吃个大胖子,结果呢?

学习是逆人性的,不然某音可能就不会这么火了,因为刷视频的快感真的是爽的一塌糊涂。

所以,学习的时候一定要遵循循序渐进这个真理。

每天学习到一点,每周学习到两点,每个月学习到三点,在学与忘的过程中反复锤炼,聚少成多。久而久之,你就把知识沉淀成自己的啦。

祝顺利!


![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
5 changes: 3 additions & 2 deletions docs/xuexiluxian/readme.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# CS学习路线

> 除了 Java 的学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、蓝桥杯等硬核学习路线,欢迎收藏品鉴!
> 除了 Java 的学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、蓝桥杯、算法和数据结构等硬核学习路线,欢迎收藏品鉴!
* [Java学习路线一条龙版(建议收藏:+1:](java/yitiaolong.md)
* [Java并发编程学习路线(建议收藏:+1:](java/thread.md)
Expand All @@ -12,4 +12,5 @@
* [Go语言学习路线(建议收藏:+1:](go.md)
* [操作系统学习路线(建议收藏:+1:](os.md)
* [前端学习路线(建议收藏:+1:](qianduan.md)
* [蓝桥杯学习路线(建议收藏:+1:](lanqiaobei.md)
* [蓝桥杯学习路线(建议收藏:+1:](lanqiaobei.md)
* [算法和数据结构学习路线(建议收藏:+1:](algorithm.md)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5ddaa0d

Please sign in to comment.