文章目录
📂 第三章、数据结构与算法
数据结构是指数据元素的集合及元素间的相互关系和构造方法,结构就是元素之间的关系。在数据结构中,元素之间的相互关系是数据的逻辑结构。按照逻辑关系的不同将数据结构分为线性结构和非线性结构,其中,线性结构包括线性表、栈、队列、串,非线性结构主要包括树和图。数据元素及元素之间关系的存储形式称为存储结构,主要有顺序存储和链式存储两种基本方式。
📁 3.1 线性结构
线性结构的特点是数据集合中的元素之间是一种线性关系,数据元素“一个接一个地排列”,也就是一个序列。
📖 3.1.1 线性表
线性表是指一个序列,常采用两种存储方法:顺序存储和链式存储,主要的基本操作是插入、删除和查找。
线性表的定义:
一个线性表是n个有限序列(n≥0),通常表示为( a1 , a2 , … , an ),其特点是在非空的线性表中:
线性表的存储结构: ⭐ ⭐ ⭐
线性表的顺序存储:
指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。这种存储方式下,元素间的逻辑关系无须占用额外的空间来存储。
线性表的链式存储(链表):
线性表的链式存储用节点来存储数据元素,元素的节点地址可以连续,也可以不连续,因此,存储数据元素的同时必须存储元素之间的逻辑关系。另外,节点空间只有在需要的时候才申请,无须实现分配,基本的节点结构:
数据域存储数据元素的值,指针域存储当前元素的直接前驱或直接后继元素的位置信息,指针域中所存储的信息称为指针或链,单链表节点中只有一个指针域。
在链式存储结构中,只需要一个指针指向第一个结点,就可以按照链接关系顺序地访问表中的任意一个元素。 Head指针不存储实际的数据元素,用于辅助数据元素的定位,方便插入和删除操作。
链表的类别:
根据节点中指针信息的实现方式,有:
线性表的查找方法: ⭐ ⭐ ⭐
📖 3.1.2 栈和队列
栈和队列是常用的两种数据结构,它们的逻辑结构与线性表相同,其特点在于运算受到了限制。栈按“后进先出”规则进行操作(类似杯子喝水),队列“先进先出”规则进行操作(类似沙漏)。
栈: 只能通过访问它的一端来实现数据存储和检索操作,按先进后出(FILO:First In Last Out)或后进先出(LIFO)规则进行插入删除操作。在栈中进行插入和删除操作的一端成为栈顶(Top),另一端成为栈底(Bottom)。
栈的基本运算:
栈的存储结构:
栈的应用:
栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。
函数调用和返回控制是用栈实现的。 ⭐ ⭐ ⭐
队列: 是一种先进先出(FIFO:First In First Out)线性表,只允许在标的一段插入元素,而在标的另一端删除元素。允许插入元素的一端称为队尾,允许删除元素的一端称为对队头。
队列的基本运算:
队列的存储结构:
队列的应用:
队列常用于处理需要排队的场合,如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。
📖 3.1.3 串
串: 是仅有字符构成的有限序列,是取值范围受限的线性表。
串的基本运算:
串的存储结构:
通常情况下,字符串存储在一维字符数组中,每个字符串的末尾都有一个串结束符,在C/C++程序中以特殊字符“\0”作为结束标记。
📁 3.2 数组和矩阵
数组可看作是线性表的推广,其特点是多维数组的数据元素仍然是一个表。
数组:
数组的定义及基本运算:
一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n 维数组是定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。
数组结构的特点:
数组顺序存储:
由于数组一般不作插入和删除运算,也就是说,一旦定义了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动,因此数组适合于采用顺序存储结构。
矩阵:
在一些矩阵中,存在很多值相同的元素或者是零元素。为了节省存储空间,可以对这类矩阵进行压缩存储。压缩存储的含义是为多个值相同的元素只分配一个存储单元,对零元不分配存储单元。
矩阵分类:
📁 3.3 树和图
📖 3.3.1 树
树:
树是n(n≥0)个节点的有限集合,当n=0时称为空树,在任一非空树(n>0)中,有且仅有一个称为根的节点,其余节点可分为m(m≥0)个互不相交的有限集T1 , T2 ,…, Tm,其中每个集合又是一棵树,并且称为根节点的子树。
树的相关术语:
二叉树:
二叉树是n(n≥0)个节点的有限集合,它或者是空树(n=0),或者是由一个根节点及两颗不相交的、分别称为左子树和右子树的二叉树所组成,简单来说,就是度不超过2的树(节点最多有两个叉)。
树与二叉树的区别:
二叉树的性质:
满二叉树和完全二叉树:
满二叉树:一个二叉树(深度为k),每一个层的节点数都达到最大值2^k-1。
完全二叉树:当深度k、有n个节点的二叉树,其每一个节点都与深度为k的满二叉树中编号为1~n的节点一一对应。叶子节点只能出现在最下层和次下层,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树。
满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树。
二叉树的存储结构:
顺序存储:
用一组地址连续的存储单元存储二叉树中的节点,必须把节点排成一个适当的线性序列,并且节点再这个序列中的相互位置能反映出节点之间的逻辑关系,对于深度为k的完全二叉树,除第k层外,其余各层中含有最大的结点数,即每一层的结点数恰为其上一层结点数的两倍,由此从一个结点的编号可推知其双亲、左孩子和右孩子的编号。
显然,顺序存储结构对完全二叉树而言既简单又节省空间,而对于一般二叉树来说浪费空间了,不适用。
在坏的情况下,一个深度为h 且只有 h 个结点的二叉树(单枝树)却需要2^k-1个存储单元。
链式存储:
由于二叉树中节点包含有数据元素、左子树根、右子树根及双亲等信息,因此可以用三叉链表或二叉链表(即一个节点含有3个指针或2个指针)来存储二叉树,链表的头指针指向二叉树的根节点。
二叉树的遍历:
遍历是按某种策略访问树中的每个节点,且仅访问一次。
按照遍历左子树要在遍历右子树之前进行的约定,依据访问根节点的位置的不同,可以得到二叉树的前序、中序和后序三种遍历方法。
最优二叉树:
最优二叉树又称为哈夫曼树,是一类带权路径长度最短的树。
权:是一个人为的概念,表示计算机对每个结点的访问频率。
路径长度:从树中一个节点到另一个节点之间的通路称为节点间的路径,该通路上分支数目。
树的路径长度:树根到每一个叶子之间的路径长度之和。
节点的带权路径长度:从该节点到树根之间的路径长度与该节点权的乘积。
树的带权路径长度为树中所有叶子节点的带权路径长度之和,记为:
其中n为带权叶子节点数目,wk为叶子节点的权值,lk为叶子节点到根节点的路径长度,根据定义,如下b图的为最优二叉树。
Tips:
1、最优二叉树的一个应用是对字符集中的字符进行编码和译码。
2、给定N个权值作为N个叶子结点,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
3、霍夫曼树可以用来进行通信电文的编码和解码。
4、B-树是一种平衡的多路查找树:
5、树的前序遍历与二叉树的先序遍历一样;树的后序与二叉树的中序遍历一样。
6、散列就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值,如此建立的表为散列表,散列表是可以动态创建的。
7、二分查找(折半查找):要求关键字必须采用顺序存储结构,并且必须按关键字的大小有序排序。
二叉查找树:
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树:
对二叉树进行中序遍历,可得到一个关键码递增有序的节点序列,使用二叉查找树来查找树中的数值比普通的二叉树更方便。
构造二叉树时需进行平衡化处理,使每个节点左右子树的高度的绝对值不超过1。
📖 3.3.2 图
图G(Graph)是由两个集合:V和E构成的二元组,其中V(Vertex)是图中顶点的非空有限集合,E(Edge)是图中边的有限集合,图G的顶点集和边集分别记为V(G)和E(G),而将图G记作G=(V,E)。
可以看出,一个顶点集合与连接这些顶点的边的集合可以唯一表示一个图。从数据结构的逻辑关系角度来看,图中任一顶点都有可能与图中其他顶点有关系,而图中所有顶点都有可能与某一顶点有关系,所以图中一个节点的前驱和后继的数目是没有限制的。
在图中,数据结构中的数据元素用顶点表示,数据元素之间的关系用边表示。
边数等于所有顶点的度数之和的一半。
有向图:
图中每条边都是有方向的,从顶点vi到vj的有向边< v i , v j >,vi称为弧尾,v j称为弧头,< v i , v j >和< v j , v i >为两条弧。
无向图:
图中每条边都是无方向的,< v i , v j > 和< v j , v i > 为同一条边。
Tips:
1、有向图中所有顶点的出度数之和等于入度数之和。
2、在有向图中,顶点为n的边数等于n(n-1) / 2 ,无向图中边数等于n(n-1) 。
完全图:
一个无向图具有n个顶点,且每个顶点与其他n − 1个顶点之间都有边则称为无向完全图,n个顶点的无向完全图的弧数目为n ( n − 1 ) / 2,n个顶点的有向完全图的弧数目为n ( n−1 ),因为任意两个不同顶点之间都存在方向相反的两条弧。
度、出度、入度:
顶点 v 的度是指关联于该顶点的边的数目,记作D(v),若为有向图,度表示该顶点的入度和出度之和。
顶点的入度是以该顶点为终点的有向边的数目;
顶点的出度指以该顶点为起点的有向边的数目。
路径:
第一个顶点和最后一个顶点相同的路径称为回路或环。若一条路径上除了顶点Vp和顶点Vq可以相同外,其余顶点均不相同,这种路径称为一条简单路径。
子图:
连通图:
如果无向图 G中任意两个顶点都是连通的,则称其为连通图。图 3-22(b)所的无向图是连通图。
强连通图:
从顶点Vi到顶点Vj和从顶点Vj到顶点Vi都存在路径,则称图G为强连通图。
网: 边或者弧具有权值的图
图的存储结构:
邻接矩阵表示法:
利用一个矩阵来表示图中顶点之间的关系;
邻接链表表示法:
为图中的每个顶点建立一个单链表,第i个单链表中的节点表示依附于定点v i 的边(对于有向图是以v i为尾的弧)。
邻接链表中的表节点有表节点和表头节点两种类型:
其中各参数的含义如下:
图的遍历:
深度优先搜索( DFS ):
访问起始点 v;
若v的第1个邻接点没访问过,深度遍历此邻接点;
若当前邻接点已访问过,再找v的第2个邻接点重新遍历。
广度优先搜索( BFS ):
在访问了起始点v之后,依次访问 v的邻接点;
然后再依次(顺序)访问这些点(下一层)中未被访问过的邻接点;
直到所有顶点都被访问过为止。
📁 3.4 常用算法
📖 3.4.1 算法概述
算法是问题求解过程的精确描述,它为解决某一特定类型的问题规定了一个运算过程。
算法特性:
算法考查:
算法与数据结构:
算法实现时总是建立在一定的数据结构基础之上,计算机程序从根本上看包括两方面的内容:一是对数据的描述,二是对操作(运算)的描述。概括来讲,在程序中需要指定数据的类型和数据的组织形式就是定义数据结构,描述的操作步骤就构成了算法。因此,从某种意义上可以说“数据结构+算法 = 程序”。
算法描述:
常用的算法描述方法有流程图、N/S 盒图、伪代码和决策表等。
流程图:
N/S 盒图:
伪代码:
决策表:
📖 3.4.2 排序
假设含有n个记录的文件内容为{ R 1 , R 2 , … , R n },其相应的关键字为{ k 1 , k 2 , … , k n }。
常见的内部排序算法:
直接插入排序:
在插入第i个记录时,R 1 , R 2 , … , R i − 1已经排好序,这时将记录R i的关键字依次与关键字k i − 1 , k i − 2 , … , k 1进行比较,从而找到Ri 应该插入的位置,插入位置及其后的记录依次向后移动。
直接插入排序是一种稳定的排序方法,其时间复杂度为 O(n^2)。排序过程中仅需要一个元素的辅助空间,空间复杂度为 O(1)。
void insertSort(int data[], int n)
/*将数组 data[0]~data[n-1]中的n个整数按非递减有序的方式进行排列*/
{
int i, j;
int tmp;
for (i = 1; i < n; i++) {
if (data[i] < data[i - 1]) {
tmp = data[i];
data[i] = data[i - 1];
for (j = i - 1; j >= 0 && data[j] > tmp; j--)
data[j + 1] = data[j];
data[j + 1] = tmp;
} /*if*/
} /*for*/
} /*insertSort*/
冒泡排序:
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换两个记录的值,然后比较第二个记录和第三个记录的关键字,以此类推,直至第n-1个记录和第n个记录的关键字比较完为止。
void bubbleSort(int data[], int n)
/*将数组data[]~data[n-1]中的n个整数按非递减有序的方式进行排列*/
{
int i, j, tag;
/*用tag 表示排序过程中是否交换过元素值*/
int tmp;
for (i = 1, tag = 1; tag == 1 && i < n; i++) {
tag = 0;
for (j = 0; j < n - i; j++)
if (data[j] > data[j + 1]) {
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
tag = 1;
} /*if*/
} /*for*/
} /*bubbleSort*/
简单选择排序:
void selectSort(int data[], int n)
/*将数组 data[]~data[n-1]中的n个整数按非递减有序的方式进行排列*/
{
int i, j, k;
int tmp;
for (i = 1; i < n; i++) {
k = i;
for (j = i + 1; j <= n; j++)
/*找出最小元素的下标,用 k 表示*/
if (data[j] < data[k]) k = j;
if (k != i)[tmp = data[i]; data[i] = data[k]; data[k] = tmp;
} /*if*/
} /*for*/
} /*selectSort*/
每次选出关键字最小的记录,并和未排序记录进行交换。
希尔排序:
又称为“缩小增量排序”,是对直接插入排序方法的改进,先将整个待排记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
快速排序:
通过一趟排序将待排的记录划分为独立的两部分,称为前半区和后半区,其中,前半区中记录的关键字均不大于后半区记录的关键字,然后再分别对这两部分记录继续进行快速排序,从而使整个序列有序。
各种排序方法的性能比较:
📖 3.4.3 查找
查找表是指由同一类型的数据元素(或记录)构成的集合,分为静态查找表(只进行查找和检索操作)和动态查找表(还可进行插入和删除操作),哈希表是一种动态查找表。
对于查找算法来说,其基本操作是“将记录的关键字与给定值进行比较”,因此,通常以“其关键字和给定值进行过比较的记录个数的平均值”作为衡量查找算法好坏的依据。为确定记录在查找表中的位置,需和给定值进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为:
Pi为查找表中第i 个数据元素的概率,一般为1/n;Ci为找到第i个数据元素时已经比较过的次数,显然,Ci 随查找方法的不同而不同。
顺序查找:
从表中的一段开始,逐个进行记录的关键字和给定值的比较,若找到一个记录的关键字与给定值相等,则查找成功;若整个表中的记录均比较过,仍未找到关键字等于给定值的记录,则查找失败。
顺序查找是对顺序存储和链式存储方式的查找表都适用,优点算法简单且适用面广,缺点查找效率较低。
在等概率的情况下,顺序查找成功的平均查找长度为:
折半查找(二分查找):
折半查找基本思想:先令查找表中间位置记录的关键字和给定值比较,若相等,则查找成功;若不等,则缩小范围,直至新的查找区间中间位置记录的关键字等于给定值或者查找区间没有元素时(表名查找不成功)为止。
折半查找的平均查找长度为:
折半查找比顺序查找的效率要高,但它要求查找表进行顺序存储并且按关键字有序排列,一般不进行表的插入与删除操作。因此,折半查找适用于表不易变动,且经常进行查找的情况。
索引顺序查找:
索引顺序查找又称分块查找,是对顺序查找方法的一种改进。
在分块查找过程中,首先将表分成若干块,每一块中关键字不一定有序,但块之间是有序的,即后一块中所有记录的关键字均大于前一个块中最大的关键字。此外,还建立一个“索引表”,索引表按关键字有序。
树表查找:
二叉查找树是一种动态查找表,其特点是表结构本身是在查找过程中动态生成的,即对于给定值key,若表中存在关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。
哈希查找:
前面几种查找方法,由于记录的存储位置与其关键码之间不存在确定的关系,所以查找时都要通过一系列对关键字的比较,才能确定被查记录在表中的位置,即这类查找方法都建立在对关键字进行比较的基础之上。
哈希表思想:
依据记录的关键码直接得到对应的存储位置,即要求记录的关键码与其存储位置之间存在一一对应的关系,通过这个关系,能很快的由关键码找到记录。
哈希函数:
关键字作为自变量,关键字存放的地址作为因变量。
哈希冲突:
对于某个哈希函数Hash和两个关键字K1和K2,如果K1≠ K2而H a s h ( K 1 ) = H a s h ( K 2 ),则称为冲突,对哈希函数来说,K1和K2称为同义词。
采用哈希法主要考虑的两个问题是哈希函数的构造和冲突的解决。
冲突处理:
开放定址法、链地址法、再哈希法等。
📖 3.4.4 递归算法
递归(recursion)是一种描述和解决问题的基本方法,用来解决可归纳描述的问题,或者是可分解为结构自相似的问题。所谓结构自相似,是指构成问题的部分与问题本身在结构上相似。
📖 3.4.5 图的相关算法
生成树:
设图G = ( V , E ) 是个连通图,如果其子图是一棵包含G 的所有顶点的树,则该子图成为G的生成树。
对于连通图来说,边是带权值的,生成树的各边也都带权值,于是就把生成树各边的权值总和成为生成树的权,把权值最小的生成树称为最小生成树,求最小生成树最常用的两种算法:
求单源点的最短路径算法:
是指给定带权有向图G和源点v0,求从v0到G中其余各顶点的最短路径,按路径长度递增的次序产生最短路径的算法。
💯第三章 数据结构与算法(经典例题)
6、(2022上)计算机在处理算数表达式78+21*(36-34)时,先将其转换成"(5)"的后缀形式表示,然后利用(6)进行计算。
A、栈
B、队列
C、数组
D、串
7、(2022上)依次在初始为空的队列中插入元素5、6、7、8以后,紧接着做了两次删除操作,此时的队头元素是(7)。
A、5
B、6
C、7
D、8
8、(2022上)以下关于串的叙述中,错误的是(8)。
A、串是仅由字符构成的有限序列
B、串是取值范围受限的线性表
C、空串不包含任何字符
D、串只可以采用顺序存储方式
9、(2022上)折半查找要求查找表中的数据为(9)。
A、顺序存储、有序排列
B、散列存储、有序排列
C、顺序存储、无序排列
D、散列存储、无序排列
10、(2022上)(10)的基本思想是先将待排的记录划分为独立的两个部分,然后分别对这两部分记录再执行该排序算法,最终使整个序列有序。
A、快速排序
B、冒泡排序
C、堆排序
D、希尔排序
5、(2021上)一个栈的输入序列为1,2,3,4,5,不可能得到的输出序列是( )。
A.2,3,4,1,5
B.5,4,1,3,2
C.2,3,1,4,5
D.1,5,4,3,2
6、(2021上)( )算法是不稳定的排序算法。
A.简单选择
B.冒泡
C.直接插入
D.归并排序
6、(2021上)( )是一种先进先出的线性表,只允许在表的一端插入元素,而在表的另一端删除元素。
A.栈
B.队列
C.串
D.树
8、(2021上)一棵5层的二叉树,其最多有( )个结点,第5层最多有( )个结点。
问题1
A.15
B.16
C.31
D.32
问题2
A.15
B.16
C.31
D.32
9、(2021上)( )排序又被称为缩小增量排序,是对直接插入排序方法的改进。
A.简单选择
B.冒泡
C.快速
D.希尔
5、(2020上)在常见的数据结构中,( )是只能通过访问它的端来实现数据存储和检索的一种线性数据结构,它的修改遵循先进后出的原( )是一种先进先出的线性表。( )是取值范围受限的线性表。
问题1
A.链表
B.队列
C.栈
D.串
问题2
A.链表
B.队列
C.栈
D.串
问题3
A.链表
B.队列
C.栈
D.串
6、(2020上)二叉树遍历是按照某种策略访问树中的每个结点,且仅访问一次。按照遍历左子树要在遍历右子树之前进行的原则,根据访)位置的不同,可得到二叉树的前序、中序和后序三种遍历方法。
A.根节点
B.导航节点
C.叶子结点
D.兄弟节点
7、(2020上)以下有关哈夫曼树的说法中,错误的是( )。
A.哈夫曼树又被称为最优二叉树
B.哈夫曼树是一种带 权路径长度最短的树
C.具有n个叶子结点的权值为W ,W , … W 的最优二叉树是唯一的
D.哈夫曼树可以用来进行通信电文的编码和解码
8、(2020上)查找算法中,( )要求查找表进行顺序存储并且按照关键字有序排列,一般不进行表的插入与删除操作。
A.顺序查找
B.折半查找
C.分块查找
D.动态查找
10、(2020上)以下关于哈希函数的说法中,不正确的是( )。
A.哈希表是根据键值直接访问的数据结构
B.随机预言机是完美的哈希函数
C.哈希函数具有单向性
D.哈希函数把固定长度输入转换为变长输出
5、(2019上)令序列X、Y、Z的每个元素都按顺序进栈,且每个元素进栈和出栈仅一次。则不可能得到的出栈序列是( )。
A.X Y Z
B.X Z Y
C.Z X Y
D.Y Z X
6、(2019上)以下关于单链表存储结构特征的叙述中,不正确的是( )。
A.表中结点所占用存储空间的地址不必是连续的
B.在表中任意位置进行插入和删除操作都不用移动元素
C.所需空间与结点个数成正比
D.可随机访问表中的任一结点
7、(2019上)B-树是一种平衡的多路查找树。以下关于B-树的叙述中,正确的是( )。
A.根结点保存树中所有关键字且有序排列
B.从根结点到每个叶结点的路径长度相同
C.所有结点中的子树指针个数都相同
D.所有结点中的关键字个数都相同
8、(2019上)对于给定的关键字序列{47, 34, 13, 12, 52, 38, 33, 27, 5},若用链地址法(拉链法)解决冲突来构造哈希表,且哈希函数H(key)=key%11,则( )。
A.哈希地址为1的链表最长
B.哈希地址为6的链表最长
C.34和12在同一个链表中
D.13和33在同一个链表中
9、(2019上)某有向图G的邻接表如下图所示,可看出该图中存在弧<V , V >,而不存在从顶点V 出发的弧。以下关于图G的叙述中,错误的是( )。
A.G中存在回路
B.G中每个顶点的入度都为1
C.G的邻接矩阵是对称的
D.不存在弧<V3, V1>
10、(2019上)已知有序数组a的前10000个元素是随机整数,现需查找某个整数是否在该数组中。以下方法中,( )的查找效率最高。
A.二分查找法
B.顺序查找法
C.逆序查找法
D.哈希查找法
5、(2018上)设有n阶三对角矩阵A,即非零元素都位于主对角线以及与主对角线平行且紧邻的两条对角线上,现对该矩阵进行按行压缩存若其压储空间用数组B表示,A的元素下标从0开始,B的元素下标从1开始。已知A[0,0]存储在B[1],A[n-1,n-1]存[3n-2],那么非零元素A[i,j](0≤ i<n,0≤ j<n,│i-j│≤1)存储在B[( )]。
A.2i+j-1
B.2i+j
C.2i+j+1
D.3i-j+1
6、(2018上)用哈希表存储元素时,需要进行冲突(碰撞)处理,冲突是指( )。
A.关键字被依次映射到地址编号连续的存储位置
B.关键字不同的元素被映射到相同的存储位置
C.关键字相同的元素被映射到不同的存储位置
D.关键字被映射到哈希表之外的位置
7、(2018上)对有n个结点、e条边且采用数组表示法(即邻接矩阵存储)的无向图进行深度优先遍历,时间复杂度为( )。
A.O(n )^2
B.O(e^2 )
C.O(n+e)
D.O(n*e)