数据结构pintia_如何学习数据结构?

看了这么多答案,感觉很多人都没回答到点子上。

今天刚好帮表弟解释这个问题。我来讲下我的学习体验。

其实学习数据结构重点并不在于哪本书,哪个教程,那个网课。

首要的问题是,要搞清楚数据结构的目的。

故名思议,数据结构这门学科就是为了让计算机能够以更加高效,简单,便捷的方式来存储和使用数据而产生的。所有的目标都围绕着存和取两个目标打转。在这两个目标下,有几个评估的指标,存取效率,可扩展性,顺序性,可排序性这几个特征。

要明白这几种特征,就需要先搞清楚几个前提,

一、内存的数据存储模式,是以顺序排列的方式存储的。

也就是说,内存中的数据是起点是0,终点根据内存的大小和操作系统而定的一个顺序的序列。0被占用,后面存入的数据则依次存入。

二、程序在一个线程中,一次只能从一个地址来取数据。所以,除了图之外,所有的数据结构都有且只有唯一的取数入口。所以,必须从一个入口来进行取数。

三、内存的数据存取并不是单线的,而是很多个程序不断的进行并行操作的。所以数据的分布是不连续的,操作系统并不能保证可以一次性找到足够大的一块内存来存放一次操作所需要的所有数据。

可以用磁盘碎片整理的图示来类比一下,使用一段时间以后,内存中的数据大概就是这个样子的,此时要想一次性开出一大块数据,是不可能的,所以要想办法解决数据量无限增加时的数据分配。

四、数据结构的基础是最吃理解的一门课程,只要理解了,除了遍历算法之外,都豁然开朗,所以刷题毫无意义。关键是理解几中种数据结构存在的目的,和他们之间的区别。

数据结构分为三大类。

一、线性表:

线性表是为了解决单线存储而出现的。

数组:就是最简单粗暴的存储方法。就是直接拉出一大块数据存在那里。数组的快速存取其实只是一个副作用,因为所有的数据都在一起,可以直接算出来数据的地址。

链表:则是为了解决可以无线增长的需求的。因为找不到一大块可以连续的存入数据,甚至也不知道程序可能使用的数据总量,所以就没办法划分一块数据来使用,划小了不够用,划大了浪费(这在早年是非常大的事情)。所以必须想办法解决问题。最后采用的方法就是从入口开始,每一个数据块不仅仅有数据,还会有指向下一个数据块的线索,用来寻找下一个数据。这就是链表。

所谓的双向链表,只是加了一个向前的线索的链表而已。不仅如此,队列,栈,都是线性表的特殊形态。进行了操作上的限制罢了。既可以是数组,也可以是链表。

二、树:

树是为了解决单一入口下的非线性关联性的数据存储或者排序这样的功能而来的。

最常见的应用是编程时候的map,就是利用了二叉树的可排序和可以快速插入并且保持序列完整的特性来构建键值数据对,来实现数据的插入增加以及快速查找的能力的。

还有做语法解析,文字处理等等很多场景也会用到树。这就不一一赘述了。当然在吃透线性表的基础上,再去理解树也并不难。因为在本质上,树相对于链表,就是每个节点不止有一个后续节点但是只有一个前置节点。

三 图:

图是数据结构里最难的一部分,但是很多学校并不作为重点,因为确实大部分人不会用到。

图的本质其实就是把线性表进一步扩展,每个节点会有不止一个前置和后缀节点,而且前置和后缀的概念也不再明晰,变成了关联节点。

具体的应用主要是一些特殊的算法和图形学上的一些使用。我自己也没有用过。没办法细讲了。

总之数据结构的前期学习要重理解。以倒推的方式,搞清楚每种数据结构产生的目标。多画画图,思考一下,理解透彻以后。再去做练习题会事半功倍。

你可能感兴趣的:(数据结构pintia)