文章目录
1、什么是数据结构?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。结构包括逻辑结构和物理结构。
数据的逻辑结构包括4种
(1)集合:数据元素之间除了有相同的数据类型再没有其他的关系
(2)线性结构:数据元素之间是一对一的关系 ——线性表、栈、队列
(3)树形结构:数据元素之间是一对多的关系
(4)图状结构:数据元素之间是多对多的关系。
物理结构包括顺序存储结构和链式存储结构。
常见数据结构
数组 —————— 一维数组、二维数组
链表 —————— 单链表、循环链表
栈 —————— 先进后出、递归、后缀表达式、函数调用
队列 —————— 先进先出、树的层次遍历、图的广度遍历
树 —————— 二叉树、森林、平衡二叉树、线索二叉树、遍历
图 —————— 有向图、无向图、最小二叉树、遍历、最短路径
2、解释一下顺序存储与链式存储
顺序存储结构是用一段连续的存储空间来存储数据元素,可以进行随机访问,访问效率较高。链式存储结构是用任意的存储空间来存储数据元素,不可以进行随机访问,访问效率较低。
顺序存储结构:是以数据元素的相对物理位置来表示数据元素之间的逻辑关系的
链表存储结构 :以指针指向来表示数据元素之间的逻辑关系。
顺序存储结构 | 链表存储结构 |
---|---|
读取方便 O(1) | 读取不方便 需要遍历 O(n) |
插入删除 需要移动大量元素 | 插入删除方便 只需要改变指针 |
空间分配 :一次性 | 在需要时分配 |
存储密度 = 1 | 存储密度 < 1 |
3、头指针和头结点的区别?
头指针:是指向第一个节点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。
头结点:是放在第一个元素节点之前,便于在第一个元素节点之前进行插入和删除的操作,头结点不是链表的必须元素,可有可无,头结点的数据域也可以不存储任何信息。
4、线性结构的特点
(1)集合中必存在唯一的一个"第一个元素";
(2)集合中必存在唯一的一个"最后的元素";
(3)除最后元素之外,其它数据元素均有唯一的"后继";
(4)除第一元素之外,其它数据元素均有唯一的"前驱"。
5、数组和链表的区别?
从逻辑结构来看:数组的存储长度是固定的,它不能适应数据动态增减的情况。链表能够动态分配存储空间以适应数据动态增减的情况,并且易于进行插入和删除操作。
从访问方式来看:数组在内存中是一片连续的存储空间,可以通过数组下标对数组进行随机访问,访问效率较高。链表是链式存储结构,存储空间不是必须连续的,可以是任意的,访问必须从前往后依次进行,访问效率较数组来说比较低。
如果从第i个位置插入多个元素,对于数组来说每一次插入都需要往后移动元素,每一次的时间复杂度都是O(n),而单链表来说只需要在第一次寻找i的位置时时间复杂度为O(n),其余的插入和删除操作时间复杂度均为O(1),提高了插入和删除的效率。
数组 | 链表 |
---|---|
事先定义长度,不能适应数据动态地增减 | 动态地进行存储分配,可以适应数据动态地增减 |
从栈中分配空间 | 从堆中分配空间 |
快速访问数据元素,插入删除不方便 | 查找访问数据不方便,插入删除数据发布 |
6、单链表结构和顺序存储结构的区别?
当进行插入和删除操作时,顺序存储结构每次都需要移动元素,总的时间复杂度为O(n^2),而链式存储结构确定i位置的指针后,其时间复杂度仅为O(1)。由于顺序存储结构需要进行预分配存储空间,所以容易造成空间浪费或者溢出。链式存储结构不需要预分配存储空间,元素个数不受限制。
7、栈和队列的区别
队列是允许在一段进行插入另一端进行删除的线性表,对于进入队列的元素按“先进先出”的规则处理,在表头进行删除在表尾进行插入。
栈是只能在表尾进行插入和删除操作的线性表。对于插入到栈的元素按“后进先出”的规则处理,插入和删除操作都在栈顶进行。由于进栈和出栈都是在栈顶进行,所以要有一个size变量来记录当前栈的大小,当进栈时size不能超过数组长度,size+1,出栈时栈不为空,size-1。
栈 | 队列 |
---|---|
先进后出 | 先进先出 |
允许在表尾进行插入和删除 | 允许在一段进行插入一段进行删除 |
插入和删除都在表尾进行 | 在队尾插入在队头删除 |
8、介绍一下深度优先搜索和广度优先搜索是如何实现的?
深度优先搜索:(1)访问起始点v0(2)若v0的第一个邻接点没有被访问过,则深度遍历该邻接点;(3)若v0的第一个邻接点已经被访问,则访问其第二个邻接点,进行深度遍历;重复以上步骤直到所有节点都被访问过为止
广度优先搜索:(1)访问起始点v0(2)依次遍历v0的所有未访问过得邻接点 (3)再依次访问下一层中未被访问过得邻接点;重复以上步骤,直到所有的顶点都被访问过为止。
*9、各种查找方法(各方法是如何实现的要会用语言描述)
查找分为静态查找表和动态查找表;静态查找表包括:顺序查找、折半查找、分块查找;动态查找包括:二叉排序树和平衡二叉树。
(1)顺序查找:把待查关键字key放入哨兵位置(i=0),再从后往前依次把表中元素和key比较,如果返回值为0则查找失败,表中没有这个key值,如果返回值为元素的位置i(i!=0)则查找成功,设置哨兵的位置是为了加快执行速度,时间复杂度为O(n),其特点是:结构简单,对顺序结构和链式式结构都适用,但查找效率太低。
(2)折半查找:要求查找表为顺序存储结构并且有序,若关键字在表中则返回关键字的位置,若关键字不在表中时停止查找的典型标志是:查找范围的上界<=查找范围的下界。
(3)分块查找:先把查找表分为若干子表,要求每个子表的元素都要比后面的子表的元素小,也就是保证块间是有序的(但是子表内不一定有序),把各子表中的最大关键字构成一张索引表,表中还包含各子表的起始地址。特点是:块间有序,块内无序,查找时块间进行索引查找,块内进行顺序查找。
(4)二叉排序树:二叉排序树的定义为:一棵空树,或者是一棵具有如下特点的树:如果该树有左子树,则其左子树的所有节点值小于根的值;若该树有右子树,则其右子树的所有节点值均大于根的值;其左右子树也分别为二叉排序树
(5)平衡二叉树:平衡二叉树又称为AVL树,它或者是一棵空树或者具有如下特点:他的左子树和右子树的高度差的绝对值不能大于1,且他的左右子树也都是平衡二叉树。
如果再一个平衡二叉树中插入一个节点可能造成失衡,这时就要进行树结构的调整,即平衡旋转。包括4中情况:在左子树的左子树上插入节点时向右进行单向旋转;在右子树的右子树上插入节点时向左进行单向旋转;在左子树的右子树插入节点时先向左旋转再向右旋转;在右子树的左子树插入节点时先向右旋转再向左旋转。
*10、哈希表的概念、构造方法、冲突的解决办法?
哈希表又称为散列表,是根据关键字码的值直接进行访问的数据结构,即它通过把关键码的值映射到表中的一个位置以加快查找速度,其中映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希函数的构造方法包括:直接定址法,除留余数法,数字分析法,平方取中法,折叠法,随机数法
(1)直接定址法:取关键字的某个线性函数值作为散列地址,H(key)=a*key+b。
(2)除留余数法:取关键字对p取余的值作为散列地址,其中p
(3)数字分析法:当关键字的位数大于地址的位数,对关键字的各位分布进行分析,选出分布均匀的任意几位作为散列的地址,适用于所有关键字都已知的情况。
(4)平方取中法:对关键字求平方,再取结果中的中间几位作为散列地址。
(5)折叠法:将关键字分为位数相同的几部分,然后取这几部分的叠加和作为散列地址。适用于关键字位数较多,且关键字中每一位上数字分布大致均匀。
(6)随机数法:选择一个随机函数,把关键字的随机函数值作为散列地址。适合于关键字的长度不相同时。
哈希冲突的解决方法包括:开放定址法和拉链法,当冲突发生时,使用某种探测技术形成一个探测序列,然后沿此序列逐个单单元查找,直到找到该关键字或者碰到一个开放的地址为止,探测到开放的地址表明该表中没有此关键字,若要插入,则探测到开放地址时可将新节点插入该地址单元。其中开放定址法包括:线性探查法,二次探查法,双重散列法
(1)线性探查法:基本思想,探查时从地址d开始,首先探查T[d],在探查T[d+1]…直到查到T[m-1],此后循环到T[0],T[1]…直到探测到T[d-1]为止。
(2)二次探查法:基本思想,探查时从地址d开始,首先探查T[d],再探查T[d+12],T[d+22]…等,直到探查到有空余地址或者探查到T[d-1]为止,缺点是无法探查到整个散列空间。
(3)双重散列法:基本思想,使用两个散列函数来确定地址,探查时从地址d开始,首先探查T[d],再探查T[d+h1(d)],T[d+2*h1(d)]…
链接法:将所有关键字为同义词的节点链接在同一个单链表中,若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组,凡是散列地址为i的节点均插入到头指针为i的单链表中。
11、二叉树遍历
- 先序:
先访问根结点
再先序遍历左子树
最后先序遍历右子树
- 中序:
从根结点开始,
中序遍历左子树
访问根结点
最后中序遍历右子树
- 后序遍历
从左到右先叶子结点的方式遍历访问左右子树
最后访问根结点
- 层次遍历
从根结点的第一层开始访问
从上到下进行遍历,
从左到右访问结点
(利用队列来实现)
12、二叉平衡树、二叉排序树
-
二叉排序树:
是比根结点大的放在右子树,比根结点小的放在左子树 -
二叉平衡树:
在二叉排序树的基础上,只要保证每个节点左子树和右子树的高度差小于等于1就可以了。
适用于插入删除比较少,但是查找比较多的情况
*13、红黑树
主要性质:
节点是红色或者黑色,没有其他的颜色
根结点是黑色,不能为红。
每个叶节点是黑色,这里的叶子结 节点是指空的叶子结点
不存在两个连续的红色节点,即父节点和子节点不能是连续的红色
从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。
14、图的相关概念
图结构中结点之间的关系是任意的,图中的任意两个结点都可能有关系。
图分为有向图和无向图
有向图的基本算法:拓扑排序、最短路径(Dijkstra算法和Floyd算法)。
无向图的基本算法:最小生成树(prime算法,Kruska算法)、DFS、BFS。
15、图的存储结构
邻接表:(链式存储结构)由单链表的表头形成的顶点表,和单链表其余结点形成的边表两部分组成;一般顶点表存放顶点信息和指向第一个边结点的指针
邻接矩阵:(顺序存储结构)
有向图的十字链表法
无向图的多重链表法