武汉大学数据结构21-22分析

1,首先先来看简答题。

线性表的顺序和链式存储方式:

优点:

顺序表:1,内存连续,可以快速访问任意位置元素。

              2,存储密度高,不需要额外的存储空间。

链式表:1,便于插入和删除,插入和删除的时间复杂度都是O(1),只需要修改指针,不需要移动元素。

               2,可以固定分配内存,灵活度高,不受容量控制。

缺点:

顺序表:1,插入和删除需要移动大量元素,操作时间复杂度是O(n)。

               2,容量固定,需要预先分配一定大小的内存空间,不易动态扩展。

          

链式表:1,需要额外的指针空间来存储元素之间的联系,增加了存储开销。

                2,访问元素需要从头遍历链表,时间复杂度是O(n)。

对于无向图,什么是顶点的度:

在无向图中,顶点的度就是与该顶点相连的边的数量。

请简要写出递归方法求取二叉树深度的过程:

1,首先定义递归函数depth(node),用于计算以node为根节点的二叉树的深度。

2,如果node==NULL,表示节点为空,即空数,函数返回0。

3,否则,递归计算左子树的深度,结果保存在left_depth中,调用递归函数depth(left_depth)

。递归计算右子树的深度,将结果保存在right_depth中,调用递归函数depth(right_depth)。

4,当前二叉树的深度等于其左右子树的最大深度+1,即max(left_depth,right_depth)+1,返回值作为当前二叉树的深度。

下面给出一段Python代码:

def depth(node):
    if node is None:
        return 0
    else:
        left_depth = depth(node.left)
        right_depth = depth(node.right)
        return max(left_depth, right_depth) + 1

当然,我WHU的学生习惯使用C++。下面给出C++代码:

int depth(TreeNode* node) {
  if (node == nullptr) {
    return 0;
  } else {
    int leftDepth = depth(node->left);
    int rightDepth = depth(node->right);
    return std::max(leftDepth, rightDepth) + 1;
  }
}

什么是赫夫曼树:

赫夫曼树也叫做最优二叉树。其实也就是哈夫曼树,音译问题。由给定权重构建哈夫曼树的方法如下:

不断选取给定权重中最小的两个,其和组成新的权重,并将每次组合之后最小的两个权重不断向上连接成树。

简述有序表的折半查找过程:

  1. 首先,确定要查找的目标元素 target 和有序表的范围,通常是整个有序表。

  2. 初始化两个指针,left 和 right,分别指向有序表的起始位置和结束位置。

  3. 在每一次迭代中,计算中间位置 mid,即 mid = (left + right) / 2

  4. 比较目标元素 target 和中间位置元素 arr[mid] 的值:

    • 如果 target 等于 arr[mid],则找到目标元素,返回 mid
    • 如果 target 小于 arr[mid],说明目标元素可能在左半部分,更新 right = mid - 1
    • 如果 target 大于 arr[mid],说明目标元素可能在右半部分,更新 left = mid + 1
  5. 重复步骤 3 和 4,直到找到目标元素或者 left > right,表示整个有序表中没有目标元素。

常见的题目是:对于从一开始递增为1的有序排列数组,查找数m最多需要几次折半查找。

假设需要n次查找,则2**n>m,n取所有满足条件的n的最小值。

下面还有几个知识点出现在这张试卷上:

很显然,只有栈是线性数据结构。树属于树形结构,图和网都属于图形结构。

数据结构的类型有以下几种:

  1. 线性结构(Linear Data Structures):线性结构是最简单和常见的数据结构类型。它包括数组(Array)、链表(Linked List)、栈(Stack)、队列(Queue)等。线性结构的特点是数据元素之间存在一对一的关系,元素之间只有一个前驱和一个后继。

  2. 树形结构(Tree Data Structures):树形结构是非线性的数据结构,以分层的方式组织数据。常见的树形结构有二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)、平衡二叉树(Balanced Binary Tree/AVL Tree)、堆(Heap)等。树形结构的特点是一个节点可以有多个子节点。

  3. 图形结构(Graph Data Structures):图形结构是由节点和边组成的非线性数据结构。图可以是有向的(有向图)或无向的(无向图),可以带有权重或值(带权图)。图的常见表示方式有邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)等。

  4. 散列结构(Hashing Data Structures):散列结构使用散列函数将数据映射到一个固定的位置,称为散列桶或槽。常见的散列结构有哈希表(Hash Table)和哈希集合(Hash Set)。散列结构的特点是可以在常数时间内进行插入、删除和查找操作。

  5. 文件结构(File Data Structures):文件结构是在磁盘或其他外部存储介质上组织和管理数据的方法。常见的文件结构有顺序文件、索引文件、散列文件等。(很少用,基本不考。)

在第一个简答题中我们就已经叙述了顺序表内存连续,可以快速访问任意元素,所以访问的时间复杂度是O(1),但是插入和删除则需要移动大量的元素,时间复杂度是O(n)。请注意,时间复杂度括号里面不允许存在系数。所以O(n/2)一眼错。

结点个数最多就是全部占满呗,高度为8的满二叉树结点数是(2**8)-1=255。但是有时候这种题会考察高度为8的完全二叉树的节点个数最多多少个,最少多少个,完全二叉树的叶子结点只能存在在最低的两层。最多为(2**8)-1,仅当完全二叉树是满二叉树的情况下是。最少是2**(8-1)=128。当且仅当最后一层只有一个叶子结点的时候。

看这道题,你应该很快想起在xqm班上被打的那位同学。

很明显,广度优先搜索是层次搜索,使用队列,相邻结点进入队列,取出要用到的结点而后才会进入其子结点,但是下一次是在队头取结点,即还是刚使用结点的兄弟结点,很明显有层次遍历的作用。广度优先搜索也叫宽度优先搜索,可以得到最优解。而深度优先搜索是纵向搜索,使用堆栈比较合适,已经遍历过遍历一个结点后放入其子结点,子结点放在兄弟结点后面,使用堆栈从栈顶取结点,越后放入的结点越先被取到,即取过某个结点后就取其子结点,有效的实现了纵向搜索。

邻接矩阵问题,有n个顶点就要有n个行,表示与指定元素相连的元素,n个列,表示指定元素被某些元素相连,无向图的邻接矩阵具有对称性,A与B相连,则B与A相连,有向图则不具有这种对称性。注意分析。

该题考察快速排序,关于快速排序,见图:

下面我们确定时间复杂度:很明显基本操作是s=s+t,其运算次数的阶数最高,是O(n²)。

顺序表是顺序存储,内存连续,显然,第十一个元素的存储起始地址是1000+2(11-1)=1020。

基本概念,遍历的顺序包括先序遍历,中序遍历和后序遍历,分别对应根左右,左根右,左右根。

折半查找,也就是二分查找,为了方便利用数据索引,当然是使用顺序存储结构。实现快速定位。

1.队空条件:rear==front

2.队满条件:(rear+1) %QueueSIze==front,其中QueueSize为循环队列的最大长度,也就是n。

弧也就是边,也就是n个顶点的有向图最多有多少条边,显然,每个顶点最多与(n-1)个顶点相连,则最多有n(n-1)条边,如果是无向图就要折半了。

小题就这些,希望大家都考出好成绩。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丘小羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值