初识C语言《算法和数据结构》零基础学习路线整理
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识C语言《算法和数据结构》零基础学习路线整理相关的知识,希望对你有一定的参考价值。
前言
"为什么算法这么难?而别人不觉得难”
“为什么别人能想出来?而我却想不出来”
“为什么即便我想得出来?也写不出来”
我也曾迷茫,我也曾失落,但是每当通过自己的意念,理解了一个新的算法以后,之前熬过的苦,瞬间烟消云散,带给我的只有无尽的快乐。
为什么金字塔尖的人,寥寥无几,凤毛麟角,就是因为他们能,忍常人所不能忍,吃常人所不能吃的苦,才得以成就大业!天下无易成之业,亦无不可成之业,各守乃业则业无不成。
LeetCode算法学习路线
完整版视频地址
首先让我们看下,我们接下来这段时间,我们需要学习的内容,主要有:
专栏 | 定位 | 适宜人群 |
---|---|---|
「 光天化日学C语言 」 | 「 入门 」 | 没有任何语言基础 |
「 LeetCode零基础指南 」 | 「 初级 」 | 零基础快速上手力扣 |
「 C语言入门100例 」 | 「 中级 」 | 零基础持续C语言练习教程 |
「 算法零基础100讲 」 | 「 高级 」 | 零基础持续算法练习教程 |
「 画解数据结构 」 | 「 高级 」 | 「 推荐 」 数据结构动图教程 |
「 算法进阶50讲 」 | 「 资深 」 | 进阶持续算法练习教程 |
「 LeetCode算法题集汇总 」 | 「 资深 」 | 全面的力扣算法题练习集锦 |
「 夜深人静写算法 」 | 「 资级 」 | 竞赛高端算法集锦 |
文章目录
一、语言基础
1、Hello World
想上手一门语言,第一步一定是 Hello World。先不要急着配环境,如若环境配了几个时辰,可能起初的雄心壮志,就被配环境的过程消磨殆尽,更加不要谈日后的丰功伟业了。
要成大事就必争朝夕,让我们直接进入实战。
2、直接实战
我们直接在力扣上,进行第一段代码的编写,通过这道题,来了解编码的流程,就算你是算法零基础
想必也能看懂。(題目鏈接)
题目要求我们不要用加号,实现两个数的加法操作,你让我不要用,那我就偏要用,我就是要逆天而行。看!就是这么简单!让我们来复盘一下。
3、及时复盘
题目要求返回两个整数的和,并且要求不能用 加号,那如果我用了会怎么样,答案是并不会怎么样。因为平台不会对代码做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。
换言之,作为你接触算法的第一道题,其实这些条件,都无所谓,能过就行,对于新人来说,把问题过掉比问题本身更重要,题数的增加是信心的增加。信心比什么都重要,有了信心你才能继续往下走,只要你能往下推进,你就能继续学习,继续学习你迟早会学到相应的算法。
好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后,再来用题目要求的方法来过掉它。
4、坚持下去
仅仅做了这一道题是远远不够的,如果不能坚持学习,那么一切美好的愿景都只是海市蜃楼遥不可及。
现如今,经济飞速发展,我们要知道 “不进则退,慢进也是退” 的道理。只有当你采取快速高效的行动之后,才能够在残酷的竞争中,拥有自己的一席之地!
有志者事竟成,破釜沉舟,百二秦关终属楚!
苦心人天不负,卧薪尝胆,三千越甲可吞吴!
始终相信 长风破浪会有时,直挂云帆济沧海!
5、养成习惯
单纯学习语言未免太过枯燥乏味,所以建议一边学习一遍刷题,养成每天刷题的习惯,在刷题的过程中巩固语法,每过一个题相当于是一次正反馈,能够让你在刷题旅途中酣畅淋漓,从而更好的保证你一直坚持下去,在没有任何算法基础的情况下,可以按照我提供的专栏来刷题,这也是上上个视频提到的 九日集训 的完整教材,主要有以下几个内容:
这个专栏主要讲解了一些 LeetCode 刷题时的一些难点和要点,主要分为以下几个章节,并且会持续补充一些方法论的文章。文章有试读,可以简单先看一看试读文章。
6、九日集训
「 九日集训 」是博主推出的一个能够白嫖付费专栏「 LeetCode零基础指南 」的活动。通过 「 专栏中的联系方式 」 或者 「 本文末尾的联系方式 」 联系博主,进行报名即可参加。九日一个循环,第二期计划 「 2021.12.02 」 开启。
玩法很简单,每天会开启一篇试读文章,要求有三点:
1)阅读完文章后,课后习题 「 全部刷完 」(都能在文中找到解法,需要自己敲一遍代码);
2)写 「 学习报告 」 并发布社区 九日集训(每日打卡) 频道
3)在 「 打卡帖 」 提交 「 学习报告 」 链接;
完成以上三点后方可晋级到下一天,所有坚持到 9天 的同学,会成为 「 英雄算法联盟合伙人 」 群成员,只限500个名额,优胜劣汰,和精英在一起,无论是沟通,学习,都能有更好的发展,你接触到的人脉也都是不一样的,等找工作的时候,我也会为大家打通 hr 和猎头,让你前程无忧~
详细规则参见:九日集训规则详解。
目前第一轮「 九日集训 」已经进行到第七天,即将开启第二轮。
二、数学基础
LeetCode上的题目相比ACM来说,数学题较少,所以对数学有恐惧的同学也不必担心,比较常见的数学题主要有:位运算,线性代数,计算几何,组合数学 ,数论,概率论。
板块 | 题数 |
---|---|
位运算 | 30 |
线性代数 | 20 |
计算几何 | 5 |
组合数学 | 5 |
数论 | 5 |
概率论 | 5 |
1、位运算
位运算主要有:位与、位或、按位取反、异或、左移 和 右移。对应的文章可以看:
位运算是计算机的精华所在,是必须掌握的内容。大概每个运算操作刷 三 到 五 题就基本有感觉了。
2、线性代数
线性代数在刷题中,主要内容有 矩阵运算 和 高斯消元。矩阵在程序中的抽象就是二维数组。如下:
高斯消元是求解多元一次方程组的,一般在竞赛中会遇到,面试一般不问,因为面试官可能也不会。
3、计算几何
数论 是 ACM 中一个比较重要的内容,至少一旦出现,一定不会是一个水题,编码量较大,但是在 LeetCode 中题型较少,可以适当掌握一些基础内容即可。对应文章如下:
4、数论
数论 是 ACM 中一个比较重要的内容,但是在 LeetCode 中题型较少,可以适当掌握一些基础内容即可。对应文章如下:
5、组合数学 和 概率论
组合数学 和 概率论,在 LeetCode 中题目较少,有兴趣可以刷一刷,没有兴趣就不要去刷了,毕竟兴趣才是最好的老师。对应的文章如下:
三、数据结构
任何一种数据结构,都可以认为是一个容器,你可以让往里面添加元素,也可以从里面移除元素,也可以将某个元素的属性进行改变,还可以查询某个元素的属性。所以,它无非就是 增、删、改、查。
每一种数据结构都不是完美的,我们要做的,就是尽量减少 增、删、改、查 的 时间复杂度 和 空间复杂度。LeetCode 题中涉及到的数据结构主要分为:线性表、哈希表(也叫散列表)、树、图、树状数组。
以下是每个数据结构建议刷的题数(不要被数字吓到,实际刷下来很多内容是重复的,比如一个问题既可以用数组做,可以用链表做):
板块 | 题数 |
---|---|
数组 | 100 |
字符串 | 50 |
链表 | 50 |
栈 | 50 |
队列 | 50 |
哈希表 | 50 |
二叉树/二叉搜索树 | 30 |
字典树 | 20 |
堆 | 10 |
线段树 | 10 |
并查集 | 10 |
树状数组 | 10 |
AVL树/红黑树 | 5 |
霍夫曼树 | 1 |
接下来,就由我来为大家一一介绍:
1、线性表
线性表主要有 数组、字符串、链表、队列、栈。
1)数组
数组是数学中数列的抽象,在程序中的存储空间是连续的,数组和字符串相关的题多如牛毛。属于数据结构中最简单的内容,和数组相关的算法也层次不齐,主要是枚举,即遍历数组然后执行相关操作,大部分都较为简单,建议刷满 100 题。
2)字符串
字符串则是一种特殊的数组,即字符数组,字符串相关的算法主要有 字典树,KMP,前缀自动机,后缀树组,难度依次递增,建议先学习 字典树,很好理解,等力扣题刷满 500 题以后再来学习剩下几个算法也为时不晚,字符串的题建议刷满 50 题。
3)链表
链表和数组是一个对立概念。数组是顺序存储的,链表是链式存储的,也就是链表元素的 前驱 和 后继 在实际存储空间上,是不一定连续的。链表分为 单向链表 和 双向链表,理解链表以后,就对数据结构有一个更加清晰的认识了,链表的题建议刷满 50 题。
4)栈
栈是一种先进后出的数据结构,可以用数组或者链表来实现,主要应用就是将 递归转化成迭代,表达式求值就是典型的栈的实现。配合深度优先搜索使用,栈的题建议刷满 50题。
5)队列
队列是一种先进先出的数据结构,可以用数组或者链表来实现。主要应用就是 消息队列,配合广度优先搜索使用,在实际编码过程应用比较广泛。队列主要有:先进先出队列,双端队列,循环队列,单调队列。队列的题建议刷满 50 题。
2、哈希表
哈希表也叫散列表。它是一种 插入 和 查询 都是
O
(
1
)
O(1)
O(1) 的数据结构。唯一的缺点是它是无序的,哈希表的用途非常广泛,无论是搜索还是动态规划,都会借用到哈希的思想。
Python 中的 dict,Lua 中的 table,C++ 中的 unorderd_map,redis 中的 字典,都是由哈希表来实现的,哈希表的题建议刷满 50 题。
3、树
树 主要有 二叉树,二叉搜索树,堆,线段树,平衡二叉树,红黑树,字典树,霍夫曼树。重要性依次递减。
1)二叉树和二叉搜索树
刷树相关的题之前,建议先对递归有一个比较深入的了解,二叉树的遍历用到了深度优先搜索。建议重点掌握,二叉树和二叉搜索树的题建议刷满 30 题。
2)堆
堆也叫优先队列,是一种完全二叉树。是一种 增删
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n),查询最值
O
(
1
)
O(1)
O(1) 的数据结构。可以用 C++ 中的 priority_queue。
建议刷 10 题掌握其用法。
3)线段树
线段树用到了分治思想,典型的问题是区间最值。属于较难内容,面试考点也较少。建议刷 10 题掌握其思想。
4)AVL 树 和 红黑树
平衡二叉树主要有 红黑树 和 AVL 树。STL 中的 map / set 就是一棵平衡二叉树,和哈希表的功能类似,任何用哈希表的题都可以用它来过掉。面试的时候会问一些 红黑树 和 AVL树 的基础概念。
5)字典树
字典树主要做字符串的前缀匹配,相对较容易理解,大部分用哈希表的题都可以用字典树求解,建议刷 20 题巩固概念。
6)霍夫曼树
霍夫曼树主要用于霍夫曼编码,是一种前缀编码,题型不多,了解即可。
7)并查集
并查集是一种利用数组实现的森林数据结构,建议刷 10 题了解概念即可。
4、图
图主要分为有向图和无向图,还有一些特殊的图比如二分图。图主要对应遍历算法,即 广度优先搜索 和 深度优先搜索,后面讲常用算法的时候会提到。
5、树状数组
树状数组是一种数组的结构,但是数组元素之间有树形链接关系,它主要用于:单点更新,成段求和。由于实现简单,比线段树的常数时间复杂度低,建议刷 10 题了解一下概念。
五、常用算法
基础的算法主要分为:枚举、排序、贪心、搜索、动态规划。
板块 | 题数 |
---|---|
一维枚举 | 30 |
双指针 | 30 |
二分枚举 | 30 |
前缀和 | 20 |
二维枚举 | 10 |
1、枚举
枚举就是我们通常所说的暴力算法,主要有:一维枚举、多维枚举、前缀和、双指针、二分查找。
1)一维枚举
一维枚举就是一个循环,题目较多,一般配合 数组 或者 链表 这两种数据结构进行求解。建议刷 30 题。
2)多维枚举
多维枚举就是多个循环嵌套。建议刷题数为 10题。
3)前缀和
前缀和就是利用预处理将数组的前缀求和存储下来,并且在下次计算的时候利用减法在 O ( 1 ) O(1) O(1) 的时间求解,是一个预处理算法,技巧性较强,建议刷 20 题左右。
4)双指针
利用问题的单调性,将原本 O ( n 2 ) O(n^2) O(n2) 的算法转换成 O ( n ) O(n) O(n)。利用双指针的题很容易就能看出来,一般是数列,并且 n n n 都在 1 0 6 10^6 106 左右。双指针是面试的热门考点,必须掌握,建议刷 30 题巩固算法。
5)二分查找
利用问题的单调性,将原本 O ( n ) O(n) O(n) 的算法转换成 O ( l o g 2 n ) O(log_2n) O(log2n),是一种经典的对数级别的时间复杂度算法。和双指针一样,属于必须掌握的内容,建议刷 30 题巩固算法。
2、排序
对于排序,已经有太多人讲解它了,重要性也不言而喻。建议了解每个排序的算法实现原理,并且自己动手写一下,目的是为了提升思维。排序的题建议刷 100 题。
3、贪心
贪心是一种很神奇的算法,需要有大量习题总结归纳,一直没有很好的文章输出,我尽力写一篇。很多贪心都是先排序然后再贪心,所以跟着排序专题一起刷。
4、搜索
搜索主要分为 广度优先搜索 和 深度优先搜索。广度优先搜索主要用于求解最短路问题,深度优先搜索主要用于求解穷举,遍历类问题。建议各刷 100 题。
板块 | 题数 |
---|---|
深度优先搜索 | 100 |
广度优先搜索 | 100 |
5、动态规划
动态规划又叫DP,入门时建议先刷 一维DP 的题。详情请见:画解动态规划,动态规划建议 300 题起步。
六、杂项算法
杂项算法比较杂,列出来看看吧,刷不刷也无所谓啦,反正很偏,喜欢就刷去吧!主要有 状态压缩,高精度,离散化,模拟,博弈,随机算法,采样算法,闹经急转弯,交互类问题。
七、算法专栏推荐
专栏 | 定位 | 适宜人群 |
---|---|---|
「 光天化日学C语言 」 | 「 入门 」 | 没有任何语言基础 |
「 LeetCode零基础指南 」 | 「 初级 」 | 零基础快速上手力扣 |
「 C语言入门100例 」 | 「 中级 」 | 零基础持续C语言练习教程 |
「 算法零基础100讲 」 | 「 高级 」 | 零基础持续算法练习教程 |
「 画解数据结构 」 | 「 高级 」 | 「 推荐 」 数据结构动图教程 |
「 算法进阶50讲 」 | 「 资深 」 | 进阶持续算法练习教程 |
「 LeetCode算法题集汇总 」 | 「 资深 」 | 全面的力扣算法题练习集锦 |
「 夜深人静写算法 」 | 「 资级 」 | 竞赛高端算法集锦 |
八、配套福利赠送
语言入门:《光天化日学C语言》(示例代码)
语言训练:《C语言入门100例》试用版
数据结构:《画解数据结构》源码
算法入门:《算法入门》指引
算法进阶:《夜深人静写算法》算法模板
以上是关于初识C语言《算法和数据结构》零基础学习路线整理的主要内容,如果未能解决你的问题,请参考以下文章
Windows OpenGL ES 图像 GPUImageLookupFilter