数据结构
基本概念
- 概述
- 线性表
- 栈
- 队列
要求掌握以下内容:
- 什么是算法?
- 复杂性(时间效率、空间效率)
- 理解什么是算法、算法的正确性、复杂性的概念;
- 理解算法的时间复杂度、空间复杂度;
- 时间复杂度 通过 大O标记法 :循环体重复执行次数评估时间复杂度
- 空间复杂度
- 什么是数据类型、什么是数据结构、如何表示与实现?
- 掌握抽象数据类型的说明、高级语言对抽象数据类型的支持;
数据结构概述
1. 什么是数据?
所谓数据指的是:凡是能够被计算机加工处理的一些信息的组合都可以称之为数据。
- 例:学生信息管理系统:中的学生就是这个系统的数据。图书馆管理系统:中的图书就是这个系统的数据。
2. 什么是数据元素(Data Element)?:
- 数据的基本单位,计算机通常作为一个整体来考虑,如一棵树中的一个结点、一个图中的一个结点。
- 一个数据元素可以有若干个数据项(Data Item)组成。
- 例:学生信息管理系统:所有的学生都是数据,其中一个学生就是一个数据元素。
- 数据元素是数据的基本单位,数据项是数据的最小单位。
3. 什么是数据对象(Data Object)?
- 性质相同的数据元素的集合。
- 例:学生信息管理系统:某一个班级就是一个数据对象。
4. 数据结构
数据元素之间的关系称之为结构。
- 四种基本结构
- 集合 - 特点:是无序的。
- 线性结构 - 特点:数据元素之间是一对一的关系。
- 树形结构 - 特点:数据元素之间是一对多的关系。
- 图状结构/网状结构 - 特点:数据元素之间是多对多的关系。 - 数据结构的形式定义:
- 一个二元组:Data_Structure=(D,S) - D:是数据元素的集合,S:是数据元素之间的关系
5. 数据的逻辑、物理(存储)结构
- 逻辑结构:数据元素之间的逻辑关系
- 物理结构:数据元素在计算机中的存储方法(表现和实现)
6. 数据结构的分类
- 按照逻辑结构的不同分为:集合、线性结构、树状结构、网状结构
- 按照物理结构的不同分为:
- 顺序结构:利用在存储器中的物理关系来表示逻辑关系。
- 链式结构:用在存储器中附加指针的方式来表示逻辑关系。
7. 什么是算法?
- 算法:对特定问题求解步骤的一种描述,是指令的有序序列。
- 算法的五个特性:有穷性、确定性、可行性、输入、输出。
- 算法设计的要求:时间复杂度、空间复杂度。
8. 什么是时间复杂度?
算法执行时间随数据规模增长而增长的趋势 T(n)=O(f(n)),称之为时间复杂度。
- f(n)算法规模,T(n)称算法复杂度
- 估算方法:以算法中重复执行的次数作为算法时间复杂度的依据。
三种最常见时间复杂度:
- O(1) 常量级
- O(n) 线性级
- O(n²)平方级
9. 什么是空间复杂度?
算法执行过程中所需的最大空间 S(n)=O(f(n)),称之为空间复杂度。
- 估算方法:输入数据所占空间 + 程序所占空间 + 辅助变量所占空间
数据结构:线性结构
- 线性表:在任何一个地方插入数据、将任何一个元素删除。
- 栈:在一个端口插入数据、在同一个端口删除数据。
- 队列:在队尾插入数据,在队头删除数据。
- 共同特点:线性表、栈、队列 逻辑上都是线性结构。
线性表、栈、队列
掌握一下内容:
- 熟练掌握顺序分配、链接分配的表示及实现方法;
- 熟练掌握各种链表:单链、双链、多链、循环链表;
- 理解栈、队列、双向队列的顺序、链式表示及其算法复杂度分析;
- 熟练掌握表达式计算原理。
1. 线性表的顺序表示与实现
- 线性表的存储结构:顺序存储、链接存储。
- 顺序存储:用一组地址连续的存储单元依次存储线性表的数据元素。
- 基地址:起始位置
- 每个元素占用的存储单元第i个元素的位置:LOC(ai)=LOC(a1)+(i-1)*l 即:首地址 + (i-1) * 所占存储单元
2. 顺序表的特点
- 利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构(物理结构)一致
- 在访问线性表时,可以利用给出的数学公式,快速计算任何一个数据元素的存储地址。即访问每个数据元素所花费的时间相等。
- 存取元素的方法被称为随机存取法。使用这种存取方法的存储结构被称为随机存储结构。
在高级语言中,使用一维数组表示,表示方法为:
const LIST_INIT_SIZE = 100; // 表初始分配空间
const LISTINCREMENT = 10; // 空间分配增量
typedef struct {
ElemType *elem; // 存储空间
int length; // 当前长度
int listsize; // 当前存储容量
int LISTINCREMENT; // 可增加存储结构
} SqList;
注意:
- 数组指针elem指示线性表的基地址,length:线性表的当前长度。
- C语言数组的下标从0开始,即数组中的第i个元素为L.elem[i-1]
3. 线性表的链式表示和实现
- 顺序表的局限:当频繁作插入或删除时要移动大量的元素,耗费大量时间。
- 链式表示:用一组任意存储单元存储线性表。
- 存储单元不要求连续:物理结构不反应逻辑结构。
- 不可以随机存储,但插入和删除方便。
- 需要两个域(部分):一个表示数据本身;一个表示数据元素间的关系。两个部分合起来称之为一个结点。
- 结点中表示关联的部分为指针域,内部存放指针或域。n个结点链接成一个链表。
单链表定义:
typedef struct LNode {
ElemType data;
struct Lnode *next;
} Lnode, *LinkList;
4. 循环链表
循环链表:线性表的另一种链式存储结构
- 特点:从表的任何位置出发,都可以找到其他结点;
- 操作与单链表的差别:判断尾表的条件:P->next=H
5. 双向链表
每个结点有两个指针域:一个指向直接后继;另一个指向直接前驱
双向链表存储结构:
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
} DuLNode, *DuLinkList;
6. 栈的表示和实现
栈时一种特殊的线性表,特殊在于插入与删除在同一个端口完成。
栈的特点:先进后出,后进先出。
栈的存储方式
- 顺序栈:栈的顺序存储
- 链栈:栈的动态存储
顺序栈的表示和实现:
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
- 其中stacksize表示栈当前可以使用的最大容量。base为栈底,top为栈顶。栈顶指针指向栈顶元素的下一个位置(即下次压栈是时元素所放的位置)
- top 指向压栈时下一个元素将要存放的位置
- top 减一指向弹栈时下一个元素的取值位置
- 栈空的条件:top=base
- 栈满的条件:top-base >= stacksize
定义栈结构:
typedef stuct stack_node {
ElemType data;
struct stack_node *next;
} STKPTR;
STKPTR *stk;
7. 队列的表示与实现
- 队列的特点:先进先出。
- 队列是一种线性表,是一种特殊的线性表,特殊在与插入在一个端口完成删除在另外一个端口完成。
队列的存储方式:
- 顺序存储
- 链式存储
链式队列定义:
typedef struct Qnode {
QElemType data;
struct Qnode *next;
} Qnode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
} LinkQueue;
顺序队列定义:
#define MAXQSIZE 100
typedef struct {
QElemType *base;
int front;
int rear;
} SqQueue;
其中base为连续空间首地址,front为队首,rear为队尾。
加
三、图
1、图的定义
图结构中,任意两个结点之间的关系是任意的,图中任意两个数据元素之间都可能相关。
2、图的术语
-
图的顶点称之为数据
-
顶点和顶点之间的关系称之为边
-
图分为两种:有向图、无向图
-
边达到一个图的最大数据时称为完全图
-
完全图:有 n(n-1)/2条边的无向图;
-
有向完全图:有 n(n-1)条弧的有向图;
-
稀疏图:只有顶点的图称为稀疏图。
-
稠密图:有很多条边的图称为稠密图。
-
子图:有一个图的顶点和边属于原图称为子图。
-
邻接点:无向图中,两个顶点之间是有边的,称这两个顶点互为邻接点。
-
顶点的度:和顶点相关联的边的条数称之为顶点的度。
-
在有向图中,度分为出度和入度:
-
出度:以顶点为起点的边的条数。
-
入度:以顶点为终点的边的条数。
-
-
路径:从一个顶点出发沿着一些顶点到达另外一个顶点的路程称之为路径;
-
回路:起点和终点相同的称之为回路。
-
简单路径:顶点序列中顶点不重复的路径。
-
-
连通图:
-
连通分量:
-
强连通图:
-
强连通分量:
-
连通图的生成树:一个极小连通子图,含有图中全部结点,但只有足以构成一棵树的n-1条边。
-
有向图:如果有一个顶点的入度为0,其余顶点的入度都为1,则是一颗有向树。
3、图的存储结构
图的存储结构分为两种:顺序存储、链式存储。
(1). 顺序存储
数组表示法(邻接矩阵):用两个数组分别存放顶点信息和边信息。
邻接矩阵:
-
无向图:第i行分量的和为结点的度。
-
有向图:第i行分量的和为结点的度,第i列分量的和为结点的度。
(2).链式存储
邻接表:一个链式存储结构。
-
无向图的邻接表中,顶点v的度就是该顶点的单链表中的结点数。
-
有向图的邻接表中,第i个链表的结点数是该顶点的出度。
十字链表:有向图的链式存储。
邻接多重表:无向图中的另一钟链式存储结构。
4、图的遍历
图的遍历方法: 深度优先算法、广度优先算法。
深度优先遍历
深度优先搜索遍历:类似于数的先根遍历、是树的先根遍历的推广。
最小生成树
-
构造连通网的最小代价生成数。
-
构造最小生成树的算法:Prim算法和Kruskal算法
拓扑排序
-
拓扑排序:由某个集合上的一个偏序得到该集合上的一个全序,就是拓扑排序。
-
偏序:集合中仅有部分成员之间可以比较;
-
全序:集合中全体成员之间均可比较。
最短路径
-
单源:从某个源点出发到其余各顶点的最短路径。
-
Dijkstra算法:按路径长度递增的次序产生最短路径。
查找
(1). 顺序表的查找
物理存储:
顺序表方式:
typedef struct {
ElemType *elem;
int length;
} SSTable;
查找过程:从表中最后一个元素开始,逐个比较,相等则比较成功,否则直到第一个元素。
(2). 有序表的查找
折半查找:先确定待差记录的范围,逐步缩小范围直到招到或找不到。
哈希表
排序
标签:存储,线性表,元素,算法,顶点,数据结构,数据 来源: https://www.cnblogs.com/GrayJunZi/p/13639216.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。