目录
什么是程序?
程序 = 数据结构 + 算法
学习数据结构与算法有什么用?
1.程序 = 数据结构 +算法
2.锻炼编程功底,提高编程思想
3.扩展思路,提高解决实际应用问题的能力
4.为将来的人工智能、大数据、云计算等领域奠定基础
5.校招必考,比例很大
数据结构主要学习的什么?
数据们之间的关系,将离散的数据规整划一
如何将这个关系具体实现并存储到计算机中
基于关系之上对数据的具体操作,增删改查等
数据结构的具体使用场景
数据结构(基础-进阶-高级)
1.基础结构: 线性表、栈、队列、双端栈、循环队列、双端队列、单向循环链表、双向循环链表、二分搜索树、最小堆/最大堆
2.进阶结构: Trie前缀树、线段树、并查集、AVL平衡树、哈希表
3.高级结构: 2-3树、红黑树、B树、B+树、多维数组、树状数组、伸展树、后缀树、树链剖分与动态树
什么是数据结构?
研究数据的存储方式
数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储数据,如{1, 2, 3, 4, 5} 为了是后期取得它们的加和值,无缘由的数据存储行为是对存储空间的不负责任。
因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好的方式来存储数据,而这也是数据结构的核心内容。
一直以来大家面对的数据存储,解决方式都是用变量或者数组对数据进行存储
int a = 1;
char str[3] = {'a','b','c'};
但是,如果要存储一组这样的数据: {短勃闻,损闻姐,豆锅清,烫91},短勃闻是损闻姐和烫91的老师,损闻姐是豆锅清的哥哥。
对于存储之间具有复杂关系的数据,如果还是用变量或数组来存储(比如用数组存储{短勃闻,损闻姐,豆锅清,烫91}),数据存储是没有问题的,但是无法体现数据之间的逻辑关系,后期根本无法使用,显然不明智。
针对此类数据,数组结构中提供有专门的树结构来存储这类数据。
再比如,导航无疑是出游旅行的必备神器,在我们程序员眼中,无论是哪款导航软件,其导航功能的实现都需要大量地图数据的支持。很明显,这些数据绝不是使用变量或数组进行存储的,那样对于数据的使用简直是个悲剧。
针对此类数据,数据结构提供了图存储结构,专门用于存储这类数据。
因此,数据结构是什么? 数据结构是一门学科,它教会我们"如何存储具有复杂关系的数据更有助于后期对数据的再利用"
数据结构有哪些,常用数据结构详解
数据结构大致包含以下几种存储结构:
-
线性表,还可以细分为顺序表、链表、栈和队列;
-
树结构,包括普通树、二叉树、线索二叉树等;
-
图存储结构
线性表
线性表存储的数据往往是可以依次排列的,"一对一"关系的就可以使用线性表来存储。
例如:{1,3,5,7,9} 各元素依次排列,每个元素的前面和后边有且只有一个元素与之相邻(除首元素和尾元素),因此可以使用线性表存储。
线性表是n个数据特性相同的元素组成有限序列,是最基本且常用的一种线性结构(线性表、栈、队列、串和数组都是线性结构),同时也是其他数据结构的基础。
线性表并不是一种具体的存储结构,它包含顺序存储结构和链式存储结构,是顺序表和链表的统称。
顺序表
简单理解,就是常用的数组,只是换个名字而已。
顺序表是物理地址连续的存储单元依次存储数据的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。
由于顺序表结构的底层实现借助的就是数组,因此对于初学者来说,可以把顺序表完全等价为数组,但实则不是这样。数据结构是研究数据存储方式的一门学科,它囊括的都是各种存储结构,而数组只是各种编程语言中的基本数据类型,并不属于数据结构的范畴。
链表
使用顺序表(底层实现靠数组)时,需要提前申请一定大小的存储空间,这块存储空间的物理地址是连续的。
链表则完全不同,使用链表存储数据时,是随用随申请,因此数据的存储位置是相互分离的,换句话说,数据的存储位置是随机的。
为了给各个数据快建立"依次排列"的关系,链表给各数据块增设一个指针,每个数据块的指针都指向下一个数据块(最后一个数据块的指针就指向Null),这样,看似毫无关系的数据块就建立了"依次排列"的关系,也就形成了链表。
栈和队列
栈和队列隶属于线性表,是特殊的线性表,因为它们对线性表中元素的进出做了明确的要求。
栈中的元素只能从线性表的一端进出(另一端封死),且要遵循"先进后出"的原则,即先进栈的元素后出栈。
出栈顺序: C最先出栈,B,最后A
队列中的元素只能从线性表的一端进,从另一端出,且要遵循"先进先出"的原则,即先进队列的元素也要先出队列。
出队列顺序: A--B--C
线性存储结构
一对一
树存储结构
树存储结构适合存储具有"一对多"关系的数据
图存储结构
图存储结构适合存储具有"多对多"关系的数据。
V1可以达到V2、V3、V4,同样从V2、V3、V4也可以达到V1,这就是"多对多"的关系,满足这种关系的数据可以使用图存储结构。
数据的逻辑结构和存储结构(物理结构)
数据结构的选择取决于两方面,即数据的逻辑结构和存储结构(物理结构)
逻辑结构
数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系。
例如:上述树存储结构和图存储结构
数据之间的逻辑关系可细分为三类,"一对一"、"一对多"和"多对多":
"一对一":类似集合{1,2,3,...,n}这类的数据,每个数据的左侧有且只有一个数据与其相邻(除1外);同样,每个数据的右侧也只有一个数据与其相邻(除n外),所有的数据都是如此,就是说数据之间是"一对一"的逻辑关系。
"一对多": 树存储结构中,就属于"一对多"。
"多对多":图存储结构就属于"多对多"。
通过学习数据结构,我们可以学到 3 种存储结构分别存储这 3 类逻辑关系的数据,换句话说:
-
线性表用于存储具有“一对一”逻辑关系的数据;
-
树结构用于存储具有“一对多”关系的数据;
-
图结构用于存储具有“多对多”关系的数据;
由此,我们可以通过分析数据之间的逻辑关系来决定使用哪种存储结构,但具体使用顺序存储还是链式存储,还是要通过数据的物理结构来决定。
存储结构(物理结构)
数据的存储结构,也就是物理结构,指的是数据在物理存储空间上选择集中存放还是分散存放。假设要存放10M的数据
顺序存储结构解释: 开辟一组连续的空间存储数据 通常用数组来实现,数组中空间本身是连续的,保证了数据之间的关系
链式存储结构解释: 开辟了一组随机的空间存储结构 通常用节点来实现,节点不仅要存储数据还要存储下一个节点的位置以保证数据之间的关系
如果选择集中存储,就使用顺序存储结构;反之,就是用链式存储。至于如何选择,主要取决于存储设备的状态以及数据的用途。
集中存储(底层实现使用的是数组)需要使用一大块连续的物理空间,假设要存储大小为1G的数据,若存储设备上没有整块大小超过1G的空间,就无法使用顺序存储,此时就要选择链式存储,因为链式存储是随机存储数据,占用的都是存储设备中比较小的存储空间,因此有一定几率可以存储成功。
并且,数据的用途不同,选择的存储结构也不同。将数据进行集中存储有利于后期对数据进行遍历操作,而分散存储更有利于后期增加或删除数据。因此,如果后期需要对数据进行大量的检索(遍历),就选择集中存储;反之,若后期需要对数据进一步更新(增加或删除),则选择分散存储。
线性结构的物理存储方式
树形结构的物理存储方式
图形结构的物理存储方式