数据结构知识点

一、算法的基本概念

算法:特定问题求解步骤的一种描述
算法的特性:有穷性、确定性、可行性、输入、输出
算法效率的度量
1、时间复杂度:最深层循加粗样式环内的语句的频率。
常见的时间复杂:
O(1)<O(log2n)<O(n)<O(nlog2n)<O( n 2 n^2 n2)<O( n 3 n^3 n3)<O( 2 n 2^n 2n)<O(n!)<O( n n n^n nn)
2、空间复杂度:S(n),算法所耗费的存储空间

数据:所有能被输入到计算机中,且被计算机处理的符号的集合,计算机操作对象的总称,是计算机处理的信息的某种特定的符号表示形式。 数据是数据元素的集合,数据元素是数据结构中讨论的基本单位。
数据结构:带结构的数据元素的集合,其形式定义为:数据结构=(D,S),其中:D是数据元素的有限集,S是D上关系的有限集。

数据的逻辑结构:因为数据结构是带结构的数据元素集合,如果这种结果描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑结构,人们一般用抽象数据类型加以描述。抽象数据类型是指一个数学模型及定义在该模型上的一组操作,因为该定义是一种逻辑上的定义,它与计算机内部如何表示和实现无关。根据数据结构中的数据元素之间关系的不同,可以将逻辑结构分为四类:
线性结构:线性表(线性表的应用:多项式、稀疏矩阵)、栈和队列等。
树形结构:树、二叉树、森林等
图状结构:有向图、无向图、有向网和无向网。
集合:各种查找表。

例题

1、 以下不属于算法必须满足的特性有( D )。
A. 确定性 B. 有穷性 C. 可行性 D. 高效性

2.、数据结构是一门研究非数值计算的程序设计问题中计算机的( A )和其上操作的学科。
A.数据对象 B.计算方法 C.逻辑存储 D.数据映像

3、下列程序段的时间复杂度是( B )。
for (i = 0; i < n; i++)
for (j = n - i; j > 0; j - -)
printf("%d\n", j);
A. O(n) B. O( n 2 n^2 n2) C. O(nlogn) D. O( n 3 n^3 n3)

4、根据F(n)=F(n-1)+F(n-2)定义二阶斐波那契数列的递归计算函数,递归终止条件为F(1)=F(2)=1, 则计算F(6)时一共调用了该函数( C )次。
A. 6 B. 12 C. 15 D. 30
1、请给出数据、数据结构和算法的定义。

二、线性表

线性表的定义

例题

2、线性表是具有n个( C )的有限序列(n>= 0)。
A. 表元素 B. 字符 C. 数据元素 D.数据项

4、向一个长度为n的顺序表中的第i个元素(1<=i <= n)之前插入一个元素时,需要向后移动( C )个元素。
A. n B. n - i C. n – i + 1 D. n – i -1

6、 二维数组A按行主序存储,其中每个元素占1个存储单元。若A[0][0]的存储地址为420,A[2][2]的存储地址为446,则A[4][4]的存储地址为( A )。
A. 472 B. 471 C.458 D. 457

7、 设一个10*10的对称矩阵A采用压缩存储方式,以行为主序存储,a00为第一个元素,其存储地址为1,每个元素占一个地址空间,则a74的地址为( B )。
A. 13 B.33 C.32 D.40

链表的定义

例题

4、循环单链表(带头结点, 结点结构为(data,next))为空的判定条件是( C )。
A. headNULL B. head->nextNULL
C. head->next==head D. head!=NULL
8、单链表和双向循环链表表示线性表List时常常增加一个头结点,其目的是( C )。
A.为了简化查找算法 B.为了简化归并算法
C.为插入删除操作时不需要做特殊的处理 D.以上说法都不对。
9、带头结点的非循环单链表head的尾结点(由p所指向,结点的数据域为Element,指针域为Next)满足( D )。
A. p = = head B. p = = NULL C. p->Next = = head D. p->Next = = NULL
15、链栈和顺序栈相比,有一个比较明显的优点是( A )。
A. 通常不会出现栈满情况 B. 通常不会出现栈空情况
【解析】 对于顺序栈,如果同时需要多个栈,只要其中一个栈满,另一个栈即使还有空间也不能使用,而利用栈的链式存储,只有所有的栈空间都占满的时候才会发生上溢的情况,因此可以方便地实现共享空间。
16、用不带头结点的循环链表表示的队列长度为n,若只设尾指针(指向第一个结点的指针),则出队和入队的时间复杂度分别是( D )。
A. O(n) O(n) B. O(1) O(n) C. O(n) O(1) D. O(1) O(1)

栈和队列 (特殊的线性表)

例题

1.若循环队列以数组Q[0…m-1]作为其存储结构,变量rear表示循环队列中的队尾元素的实际位置,其移动按rear = (rear + 1) mod m进行,变量length表示当前循环队列中的元素个数,则循环队列队头元素的实际位置是( C )。
A. rear – length B.(rear – length + m) mod m
C.(rear – length + m +1) mod m D. m - length
2.若栈采用顺序存储方式存储,现有两栈共用一个空间v[0…n-1],top[i]保存第i个栈(i=1,2)的栈顶元素的下标,栈1的底在发v[0]的位置,栈2的底在v[n-1]的位置,则栈满的条件是( B )。假设top[1], top[2]始终指向栈顶元素。
A. top[2] – top[1] = = 0 B. top[1] +1 = = top[2]
C. top[1] + top[2] = = n D. top[1] = = top[2]
3. 假设一个循环队列Q[maxSize]的队头指针为front,队尾指针为rear,队列的最大容量为maxSize,除此之外,该队列再没有其他数据成员,则该队列的队空条件是 ( A )。
A. front == rear B. front + rear >= maxSize
C. rear == (front + 1) % maxSize D. front == (rear + 1)% maxSize

三、树

树的定义

节点:树是由有限个元素组成的集合,每个元素都称作一个节点
空集合也是树,称为空树。空树中没有结点。
孩子结点子结点:一个结点含有的子树的根结点称为该结点的子结点;
结点的:一个结点含有的子结点的个数称为该结点的度;
叶结点终端结点:度为0的结点称为叶结点;
非终端结点分支结点:度不为0的结点;
双亲结点父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
兄弟结点:具有相同父结点的结点互称为兄弟结点;
树的度:一棵树中,最大的结点的度称为树的度;
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度深度:树中结点的最大层次;
堂兄弟结点:双亲在同一层的结点互为堂兄弟;
结点的祖先:从根到该结点所经分支上的所有结点;
子孙节点:以某结点为根的子树中任一结点都称为该结点的子孙。
森林:由m(m>=0)棵互不相交的树的集合称为森林;

树的种类

有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树
二叉树:每个节点最多含有两个子树的树称为二叉树
满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树。
满二叉树是完全二叉树的特殊形态, 即如果一棵二叉树是满二叉树, 则它必定是完全二叉树。
完全二叉树:有个 2 k − 1 2^k-1 2k1节点的满二叉树称为完全二叉树
哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树;
线索二叉树:在二叉树的结点上加上线索的二叉树称为线索二叉树。所有应该为空的右孩子指针指向该结点在中序序列中的后继,所有应该为空的左孩子指针指向该结点的中序序列的前驱。
二叉排序树,又称二叉查找树,亦称二叉搜索树
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
平衡二叉树又被称为AVL树,且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡因子:某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。
是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

完全二叉树
在这里插入图片描述
线索二叉树:
一般树用二叉链表存储结构如下图所示,这样浪费很多空间
在这里插入图片描述
现在我们构建中序线索二叉树,

首先该树的中序遍历为 H D I B E J A F C G
在这里插入图片描述
对空指针的填充方式为:空的右孩子指针指向该结点在中序序列中的后继,所有应该为空的左孩子指针指向该结点的中序序列的前驱

树转二叉树:如下图所示
在这里插入图片描述
1、连接兄弟
2、断双亲节点(最右边节点的双亲不断)

28、 以下关于查找二叉树描述中,哪个是正确的( B )。
A.查找二叉树左孩子和右孩子可以互换
B.查找二叉树进行查找的时间复杂度为O(log2N), 其中N为结点总数
C.结点的值大于其左孩子和右孩子的值
D.结点的值小于其左孩子和右孩子的值
2、 深度为k的完全二叉树(Complete Binary Tree)的最少结点个数是多少?最多结点个数是多少?
答:
(1)最少结点数为:k-1层之前全满,即有2k-1-1个结点,另外第k层至少有一个结点,则最少结点数为2k-1-1+1=2k-1。
(2)由二叉树的性质可知,深度为k二叉树的最多结点个数即为满二叉树的结点数为2k-1。
3、给定一组权值为{2,3,4,7,8,9},构造关于这些权值的哈夫曼树,请计算该哈夫曼树的带权路径长度WPL。
WPL=9 * 2 + 2 * 4 + 3 * 4 + 4 * 3 + 7 * 2 + 8 * 2 = 80

树的遍历

树的前序遍历
根->左子树->右子树
树的中序遍历
左子树->根->右子树
树的后序遍历
左子树->右子树->根
树的层次遍历

例题

2、某非空二叉树的前序序列和后序序列正好相反,则二叉树一定是( A )的二叉树。
A. 空或只有一个结点 B. 高度等于其结点数
C. 任一结点无左孩子 D. 任一结点无右孩子
7、若要唯一地确定一棵二叉树,只需知道该二叉树的( )。
A.前序序列         B. 中序序列
C.前序和后序序列      D. 中序和后序序列
11、 若构造一棵具有n个结点的二叉查找树(Binary Search Tree),最坏的情况下其深度为( B )。
A. n/2 B. n C. (n+1)/2 D. n+1
13. 下述结论中正确的是( D )。
(1)只有一个结点的二叉树的度为0;(2)任意二叉树的度均为2;
(3)二叉树的左右子树可任意交换;
(4)深度为k的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.(1)(2)(3) B.(2)(3)(4) C.(2)(4) D.(1)(4)
15、树的先序序列等同于与该树对应的二叉树的 ( A ),树的后序序列等同于该树所对应的二叉树的( B )。

A. 先序序列 B. 中序序列 C. 后序序列 D. 层次序列

四、图

图的定义

是由顶点的有穷非空集合和顶点之间边的集合组成, 通常表示为: G(V,E), 其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
稀疏图:有很少条边或弧的图,反之称为稠密图
有向图:如果图中每条边都是顶点的有序对,即每条边都用箭头表明了方向,则此图为有向图。有向图中的边也称为,用尖括号括起一对顶点表示。
连通图:在无向图中,若每一对顶点之间都有路径,则称此图为连通图。
完全图:假设图中有n个顶点,e条边,则含有e=n(n-1)/2条边的无向图称作完全图;含有e=n(n-1)条弧的有向图称作有向完全图
简单路径:序列中顶点不重复出现的路径。
简单回路:序列中第一个顶点和最后一个顶点相同的简单路径。
无向图G的极大连通子图称为G的连通分量
拓扑排序对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。
最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
连通分量
在这里插入图片描述
上图为三个连通分量
普里姆(Prim)算法:从点开始(不断加点)
相关blog
在这里插入图片描述
克鲁斯卡尔(Kruskal)算法:(不断加边)
在这里插入图片描述

例题

1、若无向图G=(V, E)中含有7个顶点,要保证图G在任何情况下都是连通的,则需要的边数最少是( C )
A. 6 B. 15 C. 16 D. 21

18、下面结构中最适于表示稀疏无向图的是( C )。
A. 邻接矩阵 B. 逆邻接表 C. 邻接多重表 D. 邻接表

19、下列方法中可以判断出一个有向图是否有环(回路)的是( B )。
A. 广度优先遍历 B. 拓扑排序 C. 求最短路径 D. 求关键路径

图的搜索

广度优先搜索(BFS)
深度优先搜索(DFS)

五、排序

插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。
快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述
设定左右哨兵,第一个为分割点,排序如上图所示

例题

3、当增量序量设定为{7、3、1},若用希尔排序算法对整数序列(26,5,77,1,61,11,59,15,48,19)进行从小到大排序,请给出每个增量排序后的结果(7-sort, 3-sort, 1-sort)。

六、hash

例题

7、 为提高散列(Hash )表的查找效率,可以采用的正确措施是( )。
I .增大装填(载)因子
II. 设计冲突(碰撞)少的散列函数
III. 处理冲突(碰撞)时避免产生聚集(堆积)现象
A. 仅I B. 仅 II C. 仅 I 、II D. 仅 II 、III

答:D
【解析】散列表的查找效率(比较次数)取决于:散列函数、处理冲突的方法和散列表的装填因子a 。CX 标 志着散列表的装满程度,通常情况下,(X 越小,发生冲突的可能性越小;反之,a 越大,表示已填入的记录越多, 再填入记录时,发生冲突的可能性越大。因此选项I 错误,越是增大装填因子,发生冲突的可能性就越大,查找 效率也越低。选项II 正确。选项III 正确。采用合适的处理冲突的方法避免产生聚集现象,也将提高查找效率。

2.依次将关键字50、60、45、32、72、16插入到某哈希表中,假设哈希函数为H(k) = k %11,使用开放定址法二次探测处理冲突,即当发生冲突时,用Hi= (H(k)+di) mod 11计算存储位置,di = i2,i=1,2,3…。
则在哈希表中元素60的存储位置为 (5) ,元素72的存储位置为 ( 7 ) ,当所有元素插入哈希表后,该哈希表在查找成功时的平均比较次数为 (1.5) 。该哈希表的装填因子为 (6/11) 。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值