对于软件工程专业的同学来说,数据结构与算法这门课程是必修课程,课程时间应该是大学二年级,在学习完了一门编程语言后,进行展开学习的。我是在学习完C语言后,进行数据结构与算法这门课程的。个人感觉这门课程 veryyyyyyyyy 枯燥的。老师在课堂上也没有做相关知识点的扩展,再加上那时候我们对于知识的渴望度也没有那么高 哈哈哈哈,单纯的就是为了考试而学习,也没有利用网络资源来对这门课程进行进一步的拓展。等到工作之后,才慢慢发现,这门课程就是在大学时候埋的雷啊 XD
但是毕竟还是学过的,时间还不晚,知识学到了,就是自己的,定期对自己复盘,重视自己,查缺补漏,就是最棒的!
学前三问:WHAT ? HOW ? WHY?
在之后写博客的时候,我也会遵循着 WWH 法则作为提纲。简单明了,直入主题。
WHAT - 数据结构 算法
数据结构
简单直白的理解 : 数据结构就是指一组数据的存储结构。
百度百科:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关
算法
简单直白的理解 : 算法就是操作数据的一组方法。
百度百科:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
HOW - 数据结构 算法
有的人喜欢看书稳扎稳打
有的人习惯看视频生动一点的获取知识
也有人倾向于直接进入主题,找教程,找博文攻破单个知识点
我这里只是说一下我的方法
首先就是这篇博文,先搞清楚WWH
然后呢,对数据结构和算法整个知识体系列一个大纲或者思维导图
接下来就进入学习的过程了,我个人是比较喜欢看视 频和读好的博客的,每一个点学完后啊,先找习题,完了打开IDEA ,写一些Demo去理解,然后呢,带着学过的算法和数据结构啊,进入实战场,看看之前自己写过的项目,可不可以重新装修一下。
最后一点,找一些成熟项目,读源码,读源码,读源码!!!
WHY - 数据结构 算法
这一栏位的内容,我找了很久,也想了很久怎样的去写,后来在搜寻的时候,发现很多博主和学习论坛都引用了知乎上涛吴的观点(涛吴,知乎上最受欢迎程序员前十名👍🏻),写的确实好,好东西就要分享出来😂
如果说 Java 是自动档轿车,C 就是手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而且未必就比懂得的人慢。写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。如果你对这两件事都不感兴趣也就罢了,数据结构懂得用就好。但若你此生在编程领域还有点更高的追求,数据结构是绕不开的课题。Java 替你做了太多事情,那么多动不动还支持范型的容器类,加上垃圾收集,会让你觉得编程很容易。但你有没有想过,那些容器类是怎么来的,以及它存在的意义是什么?最粗浅的,比如 ArrayList 这个类,你想过它的存在是多么大的福利吗——一个可以随机访问、自动增加容量的数组,这种东西 C 是没有的,要自己实现。但是,具体怎么实现呢?如果你对这种问题感兴趣,那数据结构是一定要看的。甚至,面向对象编程范式本身,就是个数据结构问题:怎么才能把数据和操作数据的方法封装到一起,来造出 class / prototype 这种东西?
此外,很重要的一点是,数据结构也是通向各种实用算法的基石,所以学习数据结构都是提升内力的事情。
原文链接学 Java 有必要看数据结构的书吗?如果是,那么哪本书比较好? - 涛吴的回答 - 知乎
学数据结构和算法可以应用在哪些场景?
在大学的时候,学习数据结构与算法,学的时候云里雾里的,搞不清楚这些数据结构和算法应该用在哪里?能干些什么?还没有一个长长的SQL带来的成就感强烈。以为这门课程只是应试教育中的必须进行的一环,现在想起来真是单纯的孩子啊 哈哈😄
下面我引用InfoQ上的一篇文章,看完之后,有种醍醐灌顶的感觉,我觉得我明天应该会去翻遍所有的源码去看,有点迫不及待了……
实际项目中的常见算法
其次,以下场景中使用了丰富的数据结构来实现,可以择一来深入研读
Linux 内核
SQL引擎
网络拓扑结构
集群节点
各种协议
学数据结构和算法的精髓是什么?
想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。时间复杂度和空间复杂度
这个概念究竟有多重要呢?可以这么说,它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。
数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招
怎样去选择合适的数据结构
首先,选择数据结构的时候,第一点就要知道,数据怎么去组织,和数据规模是有关的。不一样规模的数据,难度也就不一样。
解决问题的效率,是与数据组织方式相关的。
首先上来我先Po出一张图,来应对第一步大类结构的选择
查询操作更多的程序中,你应该用顺序表
修改操作更多的程序中,你要使用链表
单向链 双向链表 循环链表。
栈,涉及后入先出的问题,例如函数递归就是个栈模型、Android的屏幕跳转就用到栈,很多类似的东西,你就会第一时间想到:我会用这东西来去写算法实现这个功能。
队列,先入先出要排队的问题,你就要用到队列,例如多个网络下载任务,我该怎么去调度它们去获得网络资源呢?再例如操作系统的进程(or线程)调度,我该怎么去分配资源(像 CPU)给多个任务呢?肯定不能全部一起拥有的,资源只有一个,那就要排队!那么怎么排队呢?用普通的队列?但是对于那些优先级高的线程怎么办?这时,你就会想到了优先队列,优 先队列怎么实现?用堆,然后你就有疑问了,堆是啥玩意?
怎样评测算法的好坏
怎样将数据结构和算法应用到实际之中?
写一些程序,尤其是比较底层的程序。数据结构如红黑树,后缀树, 算法如快速傅里叶变换,网络流等… 平时工作本来就很难碰上这些东西(如果确实从事尖端研究除外),个人经常碰到的也无非就是些搜索, 优化剪枝…
留下一个问题去给大家思考:如果让你实现qq那种分组的好友列表,支持各种qq里边的好友操作,你会怎么做?
Sooooooooooo 学习数据结构与算法是提升自身内力,内力提升了,学习其他技术和框架,就会简单容易一些🐨