-
数据结构的逻辑结构、物理结构和算法特性
-
数组和链表的区别
从逻辑结构看,数组必须实现于固定长度,即数组的大小一旦定义就不能改变;链表动态进行存储分配,数据可以动态增减,且可以方便的插入删除
从内存存储看,数组从栈中分配空间;链表从堆中分配空间。
从访问方式看,数组在内存中是连续的存储,可以利用下标索引进行访问;链表是链式存储结构,访问元素时只能通过线性方式访问线性表的链式存储性能分析
(1) 查找:由于查找需通过指针从第一个结点开始查找,因此,最好情况时间复杂度为O(1),最坏情况事件复杂度为O(n)
(2) 删除、插入:单链表的插入和删除主要由两部分组成:第一部分是遍历查询第i个元素;第二部分就是插入和删除元素从整个算法来说,我们很容易推导出:它们的时间复杂度都是O(n)。如果在我们不知道第i个元素的指针位置,单链表数据结构在插入和删除操作上,与线性表的顺序存储之间是没有太大的优势。但是如果我们希望从第i个位置,插入10个元素,对于顺序存储结构意味着,每一次插入都需要移动n-i个元素,每次都是O(n)。而对于单链表,我们只需要在第一次找到第i个位置的指针,此时为O(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是O(1)。
适用范围:插入或删除越频繁的操作,单链表的效率优势就越明显。 -
头指针与头节点的区别
头指针:指向第一个节点存储位置的指针,标识作用。无论链表是否为空,头指针均不为空。
头节点:第一个元素节点之前,方便在第一个元素节点前进行插入删除。不是必要元素。 -
数据结构的逻辑结构
线性结构: 一对一
树形结构: 一对多
图状结构: 多对多
集合: 除了同属于一种类型外,无其他关系 -
邻接矩阵和邻接表
邻接矩阵:无向图的邻接矩阵的对称的,第i行或者第i列的有效元素个数之和就是顶点i的度;有向图的邻接矩阵,第i行有效元素个数之和是顶点i的出度,第i列有效元素个数之和是顶点i的入度。
邻接表:无向图的同一条边在邻接表中存储两次。顶点的度为所对应链表的节点个数;有向图的每条边在邻接表中存储一次,求顶点的出度遍历所对应的链表即可,顶点的入度需要遍历其他顶点的链表。
邻接矩阵与邻接表对比:
邻接矩阵可以快速判断两个顶点之间是否存在边,快速加边删边;但是相对浪费空间
邻接表节省空间;但是当关注顶点的度时,需要遍历一个链表。 -
单链表与双链表
单链表只有一个指针next,单链表只能向后遍历。双链表有prev指针,指向前一个节点地址,next指针,指向后一个结点地址。 -
栈和队列
(1)都是线性结构;(2)插入操作都在表尾进行;(3)插入和删除时间复杂度都是O(1),空间复杂度相同;(4)都可以通过顺序结构和链表实现
(1)删除元素位置不同,栈在表尾进行,队列在表头进行;(2)顺序栈能实现多栈空间共享,顺序队列不能 -
树与二叉树
二叉树的特点:(1)非空二叉树只有一个根节点;(2)每一个结点最多有两棵子树,左子树,右子树,即有顺序。
满二叉树,除最后一层外,每一层所有节点有两个子节点
完全二叉树,除最后一层外,每一层结点数均达到最大值,在最后一层上只缺少右边的若干结点。 -
图
图由顶点集V(G)和边集E(G)组成,记为G=(V,E),E(G)是边的有限集合,边是顶点的无序对或有序对。
对有向图,E(G)是有向边(弧)的有限集合,弧是顶点的有序对
对无向图,E(G)是边的有限集合,边是顶点的无序对 -
DFS
(1)访问起始结点v
(2)若v的第1个邻接点没访问过,访问此邻接点
(3)若当前邻接点已访问过,访问v的第2个邻接点重新遍历 -
BFS
(1)访问起始结点v之后,依次访问v的邻接点
(2)再依次(顺序)访问这些点(下一层)中未被访问过的邻接点
(3)直到所有顶点都被访问过为止
复试专业课记录--数据结构1
最新推荐文章于 2023-04-04 22:20:26 发布