数据结构复习笔记

news2024/7/6 19:23:58

简答题 (3)

顺序表和链表的概念及异同

  • 顺序表: 把逻辑上相邻的结点储存在物理位置上的相邻储存单元中,结点的逻辑关系由储存单元的邻接关系来体现.
  • 链表: 逻辑上相邻的结点存储再物理位置上非连续非顺序的存储单元中, 结点的逻辑关系由指向下一个结点的指针确保.
  • 相同点
    • 都是线性表结构.
    • 结点逻辑上都是连续的.
    • 每个结点都有唯一的前驱和唯一的后续(首结点无前驱, 尾结点无后继).
  • 不同点
    • 物理存储方式不同: 物理空间上连续 vs 不连续.
    • 插入和删除方式不同: 任意位置插入或删除, 需要搬运大量元素, 时间复杂度 O ( n ) O(n) O(n) vs 无需搬运元素, 时间复杂度 O ( 1 ) O(1) O(1).
    • 随机访问不同: 支持随机访问, 时间复杂度 O ( 1 ) O(1) O(1) vs 只能顺序访问, 时间复杂度 O ( m ) O(m) O(m).
    • 是否需要扩容: 容量不足时, 开辟新空间拷贝元素, 平均时间复杂度为 O ( 1 ) O(1) O(1) vs 无需扩容.
    • 空间利用率不同: 利用率高 vs 利用率低, 额外存储指针信息, 空间碎片化.
    • 缓存利用率不同: 利用率高, 空间局部性好 vs 利用率低, 空间局部性差.
    • 应用场景不同: 适合随机访问频繁, 插入删除少 vs 适合插入删除频繁, 随机访问少.

栈和队列的概念及异同

  • 栈: 只允许在一端插入或删除的线性表.
  • 队列: 只允许在一段插入, 而在另一端删除的线性表.
  • 相同点
    • 都是受限的线性表结构.
    • 插入操作都限定在表尾进行.
    • 都可以通过顺序结构或链式结构实现.
    • 插入与删除的时间复杂度均为 O ( 1 ) O(1) O(1), 空间复杂度一致.
  • 不同点
    • 删除结点位置不同: 在表尾进行, FILO(先入后出) vs 在表头进行, FIFO(先入先出).
    • 是否支持空间共享: 单调栈可以实现多栈空间共享 vs 顺序队列不能.
    • 应用场景不同: 括号匹配, 表达式转换与求值, 函数调用和递归实现, DFS搜索或遍历 vs 系统资源管理, 消息缓冲管理(TCP), BFS搜索或遍历.

广义表存储方式及深度计算

  • 存储方式
    • 链式存储; 表头或表尾只考虑当前层.
    • 表头-表尾表示法
      • 头指针指向表头.
      • 结点间需依靠额外的表头结点相连.
      • 表结点: 标志(值为 1 1 1), 数据指针, 后继指针(已为表尾时指向 NULL).
      • 原子结点: 标志(值为 0 0 0), 值.
      • 空表为 NULL.
    • 表头-后继表示法
      • 头结点(特殊表结点)指向表头.
      • 表结点: 标志(值为 1 1 1), 表头指针, 后继指针(已为表尾时为 NULL).
      • 原子结点: 标志(值为 0 0 0), 值, 后继指针(已为表尾时为 NULL).
      • 空表为空表结点.
  • 长度: 最顶层元素个数.
  • 深度: 括号最大重数.
    • 向下遍历时 + 1 +1 +1, 向上回溯时 − 1 -1 1, 动态记录最大值.
    • 空表深度为 1 1 1.

![表头-表尾表示法请添加图片描述
表头-后继表示法

散列表定义/要素/优缺点

  • 散列表: 利用连续内存的随机访问时间复杂度为 O ( 1 ) O(1) O(1), 将键值通过散列函数映射到数据索引, 实现快速查找/插入/删除的数组查找结构.
  • 要素: 散列函数.
    • 确定性: 同一键值, 散列函数总是得到相同的散列值.
    • 高效性: 散列值计算速度要快, 以减少查找/插入/删除操作时的耗时.
    • 冲突最小化: 不同的键值尽量映射到不同的区域中, 以避免解决冲突导致的性能下降.
  • 优点
    • 数据处理迅速.
    • 能够以 O ( 1 ) O(1) O(1) 时间复杂度实现查找/插入/删除操作.
    • 实现相对简单(关键只在于散列函数).
  • 缺点
    • 散列表中数据无序.
    • 不允许出现重复数据.
    • 为减少冲突率, 开辟数组大小需超过数据量很多, 容易造成空间浪费.
    • 当发生冲突时, 解决冲突较为复杂.

森林转换为二叉树

  • 树转换为二叉树
    • 孩子结点从左到右顺序编号.
    • 所有兄弟结点之间加边.
    • 每个结点只保留与第一个孩子的边, 删掉和其余孩子间的边.
  • 森林转换为二叉树
    • 森林中所有树均转换为二叉树.
    • 从第二棵二叉树开始, 依次将根结点作为前一棵二叉树的根结点的右孩子(即成为右子树).
    • 所有二叉树都相连后即得.

图的最小生成树

  • 最小生成树: 权值最小的生成(保留全部顶点)子树.
  • Kruskal: 从边集中逐步选取不会形成回路的最小权边; 时间复杂度为 O ( m log ⁡ m ) O(m\log m) O(mlogm).
  • Prim: 从某结点出发逐步选取不会形成回路的最小权边邻接的顶点; 时间复杂度为 O ( n 2 ) O(n^2) O(n2).

应用题 (5)

给定二元算术表达式, 画出对应的树, 写出前缀表达式和后缀表达式

  • 二元算术表达式构造树
    • 叶子结点均为数字; 内部结点均为运算符(不包含括号).
    • 按照运算优先级从叶子结点反向生长.
  • 树的遍历
    • 中序遍历 - 中缀表达式: 左根右.
    • 前序遍历 - 前缀表达式: 根左右.
    • 后序遍历 - 后缀表达式: 左右根.

给定字符及频率, 画出 Huffman 树, 写出 Huffman 编码

  • Huffman 树构造
    • 每个字符及频率视为一个结点, 即有结点集.
    • 依次选择频率最小的两个结点, 构造分别以两结点作为左孩和右孩的新结点替换到集合中, 新结点频率为两结点频率和.
    • 直至结点集中只剩一个结点, 即 Huffman 树.
  • Huffman 编码: 从根结点出发, 左孩在末尾补 0 0 0, 右孩在末尾补 1 1 1, 直至叶子结点, 即得到该字符编码.
  • 前缀码: 不存在某编码为另一编码的前缀的情况.

给定数组, 分别构造二叉排序树和 AVL 树(不平衡时旋转方式), 分别计算平均查找长度

  • 构造二叉排序树
    • 第一个数作为根结点.
    • 小于当前结点成为左孩或进入左子树; 大于当前结点成为右孩或进入右子树.
  • 构造 AVL 树
    • 平衡: 每个结点平衡因子(左右子树高度差)的绝对值不超过 1 1 1.
    • 插入后不平衡时递归旋转调整(旋转中心为子树的根结点).
不平衡情况平衡因子旋转类型旋转方式
LL: 插入较高的左子树的左子树根结点 2 2 2; 左子树根结点 1 1 1右单旋原左子树根结点成为新根结点, 原左子树的右子树成为原根结点左子树, 原根结点成为原左子树根结点的右子树
RR: 插入较高的右子树的右子树根结点 − 2 -2 2; 右子树根结点 − 1 -1 1左单旋原右子树根结点成为新根结点, 原右子树的左子树成为原根结点的右子树, 原根结点成为原右子树根结点的左子树
LR: 插入较高的左子树的右子树根结点 2 2 2; 左子树根结点 − 1 -1 1左右双旋左子树左旋, 整体右旋
RL: 插入较高的右子树的左子树根结点 − 2 -2 2; 右子树根结点 1 1 1右左双旋右子树右旋, 整体左旋
  • 平均查找成功长度 = ( ∑ =(\sum =( 本层深度 × \times × 本层结点数 ) / )/ )/ 总结点数.
  • 平均查找失败长度 = ( ∑ =(\sum =( 本层深度 × \times × 本层结点补全空叶子结点数 ) / )/ )/ 补全叶子结点总数.

写出图的邻接矩阵和邻接表表示, 对图分别进行 BFS 和 DFS; 对有向图进行拓扑排序

  • 邻接矩阵: 对角线为 0 0 0, 无边连接记为 ∞ \infty .
  • 邻接表: 遍历时需额外记录顶点邻接点链表中当前的指针.
  • BFS: 使用队列辅助.
    • 初始化一个队列, 起始顶点入队.
    • 出队一个顶点, 标记已遍历, 将未遍历过的邻接点入队.
    • 直至队列空.
  • DFS: 使用栈辅助或递归.
    • 初始化一个栈, 起始顶点入栈.
    • 读栈顶, 若栈顶顶点仍有未被遍历的邻接顶点, 邻接顶点入栈; 若没有邻接点或邻接点已全部遍历, 出栈, 并标记为已遍历.
    • 直至栈空.
  • 拓扑排序: 对有向无环图的顶点线性排序; 每个顶点只出现一次; 若两顶点间存在路径, 则出发点必在终点前.
    • 在图中选择一个入度为 0 0 0(即无前驱顶点)的顶点输出, 并在图中删除该顶点及边.
    • 直到图中无顶点.
    • 若图中仍有顶点但已无入度为 0 0 0 的顶点, 则说明有环, 不存在拓扑排序.

Dijkstra 算法和 Floyd 算法求图的最短路径

  • Dijkstra 算法: 一点到其余各点的最短路径; 时间复杂度为 O ( n 2 ) O(n^2) O(n2).
    • 初始化距离数组 D [ n ] D[n] D[n], 出发点 s s s 赋值为 0 0 0, 其余全部赋值为 ∞ \infty .
    • 更新当前顶点所有邻接点的距离 D [ i ] = min ⁡ ( D [ i ] , D [ j ] + D i s t [ j ] [ i ] ) D[i]=\min(D[i],D[j]+{\rm Dist[j][i]}) D[i]=min(D[i],D[j]+Dist[j][i]) ( j j j 为当前顶点, D i s t [ n ] [ n ] {\rm Dist}[n][n] Dist[n][n] 为邻接矩阵); 当前顶点标记已遍历; 选择未遍历过且 D [ i ] D[i] D[i] 中值最小的顶点作为下一顶点.
    • 直至遍历完全部顶点.
  • Floyd 算法: 各点间最短路径; 时间复杂度为 O ( n 3 ) O(n^3) O(n3).
    • 初始化距离矩阵 D [ n ] [ n ] = D i s t [ n ] [ n ] D[n][n]={\rm Dist}[n][n] D[n][n]=Dist[n][n].
    • 依次以一顶点作为中介顶点更新距离矩阵 D [ x ] [ y ] = min ⁡ ( D [ x ] [ y ] , D [ x ] [ j ] + D [ j ] [ y ] ) D[x][y]=\min(D[x][y],D[x][j]+D[j][y]) D[x][y]=min(D[x][y],D[x][j]+D[j][y]) ( j j j 为当前顶点).
    • 直至遍历完全部顶点.

选择排序/堆排序/冒泡排序/快速排序/归并排序的步骤/算法复杂度/数据比较次数

  • 选择排序
    • 依次选出尾序列中的最值放在序列起始位置.
    • 从头遍历到尾的前一个.
  • 堆排序
    • 原地构造大根堆.
    • 交换当前末尾与根, 固定末尾将头序列调整为大根堆.
    • 从尾遍历到头的后一个.
  • 冒泡排序
    • 相邻的两两比较并交换.
    • 从头遍历到尾的前一个.
  • 快速排序
    • 分区中随机选择一个基准, 所有小于基准的放在一侧, 大于基准的放在另一侧.
    • 对左右小分区递归操作
  • 归并排序
    • 开辟临时空间, 有序子序列合并后存入临时空间.
    • 递归操作.

排序算法特点
表格来自: 各类排序算法特性+比较次数+交换次数对比表格.

*多项式广义表表示

多项式广义表表示1
多项式广义表表示2

*堆的存储结构和小根堆构建

  • 小根堆: 结点值总不小于其父结点值的完全二叉树.
  • 存储结构: 链式存储; 顺序存储(数组模拟).
  • 小根堆构建: 数组模拟
    • 从最底层子树开始, 递归调整父结点和子结点, 使得父结点小于等于子结点.
    • 调整后还需递归检查并调整子树, 确保每个子树中父结点均小于等于子结点.
    • 直至调整完根节点, 递归检查并调整所有子树.

*先序遍历和中序遍历重构二叉树; 层次遍历和中序遍历重构二叉树

  • 先序遍历和中序遍历重构二叉树
    • 先序遍历为"根左右", 中序遍历为"左根右", 由此可确定根结点和左右子树.
    • 递归地, 可一直确定到左右叶子结点及其父结点.
  • 层次遍历和中序遍历重构二叉树
    • 层次遍历第一个结点必为根结点, 中序遍历为"左根右", 由此可确定左右子树.
    • 层次遍历第二个结点开始为第二层的根结点, 递归地, 可以确定每一层的根结点和左右子树.

*四则运算求值

  • 中缀表达式变为后缀表达式
    • 数字直接列出.
    • 优先级高于或等于栈顶符号的运算符/左括号入栈; 优先级低于栈顶符号/右括号时, 栈顶运算符/左括号出栈, 直至高于或等于栈顶运算符/左括号出栈后, 再入栈.
  • 后缀表达式求值
    • 数字入栈.
    • 遇到运算符时出栈两个数字, 并将运算结果入栈.
    • 最后栈中只剩一个数字, 即为运算结果.

算法设计 (2)

两个递增单链表原地合并为递增/递减链表

  • 双指针法
    • 两个指针分别指向两个单链表头部.
    • 比较指针指向结点的数据: 数据较小的结点插入新链表, 指针后移; 相等时插入第一个单链表的结点, 两个指针同时后移.
    • 递增合并为递增时采用尾插法; 递增合并为递减时采用头插法.
    • 直至一个指针来到单链表末尾.
    • 继续将另一指针(若未指向单链表末尾)指向结点插入新链表并后移, 直至也来到单链表末尾.

二叉树查找结点并递归返回路径

  • 后序遍历
    • 找到结点时, 输出当前结点并返回 1 1 1; 抵达叶子结点时返回 0 0 0.
    • 左右子递归返回 1 1 1 时, 输出当前结点.
    • 递归返回左右子递归返回值.

二叉树中相距最远的距离

  • 后序遍历
    • 当前根结点最远距离: m a x D i s t = max ⁡ ( m a x D i s t L e f t , m a x D i s t R i g h t , h e i t g h t L e f t + h e i g h t R i g h t ) {\rm maxDist}=\max({\rm maxDistLeft}, {\rm maxDistRight}, {\rm heitghtLeft}+{\rm heightRight}) maxDist=max(maxDistLeft,maxDistRight,heitghtLeft+heightRight).
    • 递归返回最远距离及高度(或结点维护高度只递归返回最远距离).

一步可以迈一个或两个台阶, 走十级台阶有多少种走法

  • 动态规划
    • 状态转移方程: f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n1)+f(n2).
    • 初始值: f ( 1 ) = 1 , f ( 2 ) = 2 f(1)=1,f(2)=2 f(1)=1,f(2)=2.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1809322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024.6.10学习记录

1、代码随想录二刷 2、项目难点 review 3、计组复习

常见的api:BigDecima

一.计算中的小数 float和double占有的位置是有限的 二.BigDecima的作用 1.用于小数的精确计算 2.用来表示很大的小数 三.使用(传入小数) BigDecimal b1 new BigDecimal(0.01);BigDecimal b2 new BigDecimal(0.09);System.out.println(b1);System.out.println(b2); 不精确&…

C++面向对象程序设计 - 输入输出流进一步研究

在C中&#xff0c;输入输出流&#xff08;I/O&#xff09;是一个强大的特性&#xff0c;它允许程序与各种输入/输出设备&#xff08;如键盘、显示器、文件等&#xff09;进行交互。C标准库中的<iostream>头文件定义了基本的输入输出流类&#xff0c;如std::cin&#xff0…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream&#xff0c;用于存储word_count_data中的数据。…

creo学习一

设置好当前配置后&#xff0c;导出config配置文件&#xff0c;并覆盖掉此路径下的旧文件&#xff0c;使得新配置永久生效&#xff0c;这样每次打开软件都是新配置的设置&#xff1a; 系统颜色的导出&#xff1a; 打开版本的问题&#xff1a; 不能有弱尺寸&#xff1a; 注意&a…

【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错

一、问题描述 在进行安卓项目开发时使用import android.support.v7.app.AppcompatActivity;报错&#xff1a; 运行后会有乱码出现&#xff1a; 二、解决办法 将import android.support.v7.app.AppcompatActivity;改为import androidx.appcompat.app.AppCompatActivity;基本上…

代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0 )return true;if(t.size()0)return false;vector<vector<int>> dp(s.size(…

学生信息管理(C语言)

学生信息管理 (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能: 系统以菜单方式工作学生信息录入功能(学生信息用文件保存)---输入学生信息浏览功能---输出查询、排序功能---算法1、…

Zabbix6.0自动发现Linux服务器并添加主机

文章目录 一、整体流程二、操作过程 一、整体流程 Zabbix自动发现主机功能是Zabbix监控系统的一个重要功能&#xff0c;它能够自动发现并添加新的主机到监控系统中&#xff0c;从而减少人为繁琐的操作&#xff01; 步骤操作1️⃣ 第一步创建自动发现规则2️⃣ ​第二步创建自…

上汽集团25届暑期实习测评校招笔试题库已发(真题)

&#x1f4e3;上汽集团 25届暑期实习测评已发&#xff0c;正在申请的小伙伴看过来哦&#x1f440; ㊙️本次实习项目面向2025届国内外毕业生&#xff0c;开放了新媒体运营、销售策略、市场运营、物流、质量分析等岗位~ ✅测评讲解&#xff1a; &#x1f449;测评自收到起需在…

PawSQL优化 | 分页查询太慢?别忘了投影下推

​在进行数据库应用开发中&#xff0c;分页查询是一项非常常见而又至关重要的任务。但你是否曾因为需要获取总记录数的性能而感到头疼&#xff1f;现在&#xff0c;让PawSQL的投影下推优化来帮你轻松解决这一问题&#xff01;本文以TPCH的Q12为案例进行验证&#xff0c;经过Paw…

万能表单与AI的完美融合,打造个性化AI小程序

在人工智能技术日益成熟的今天&#xff0c;如何将AI智能与用户界面无缝结合&#xff0c;已成为软件开发领域的新挑战。MyCms 以其创新的“万能表单结合AI”功能&#xff0c;为开发者提供了一个全新的解决方案&#xff0c;让个性化AI小程序的开发变得前所未有的简单和高效。 一、…

powerdesigner各种字体设置

1、设置左侧菜单&#xff1a; 步骤如下&#xff1a; tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可&#xff0c;同下图。 2、设置Table的字体大小 Tools------>Display Prefrences------>Table------->Format---------…

基于机器学习的锂电池RUL SOH预测

数据集为NASA锂电池数据集。 import datetimeimport numpy as npimport pandas as pdfrom scipy.io import loadmatfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.metrics import mean_squared_errorfrom sklearn import metricsimport matplotlib.pyplot as p…

从GPU到ASIC,博通和Marvell成赢家

ASIC市场上&#xff0c;博通预计今年AI收入将达到110亿美元以上&#xff0c;主要来自与Google和Meta的合作&#xff1b;Marvell预计2028年AI收入将达到70亿至80亿美元&#xff0c;主要来自与Amazon和Google的合作。 随着芯片设计和系统复杂性的增加&#xff0c;科技大厂将更多地…

Python 全栈体系【四阶】(五十八)

第五章 深度学习 十三、自然语言处理&#xff08;NLP&#xff09; 3. 文本表示 3.1 One-hot One-hot&#xff08;独热&#xff09;编码是一种最简单的文本表示方式。如果有一个大小为V的词表&#xff0c;对于第i个词 w i w_i wi​&#xff0c;可以用一个长度为V的向量来表示…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项&#xff1a;包内有两个版本及圆形图片&#xff0c;请根据自身需要版本进行安装演示为&#xff1a;MacBook Pro M3芯片1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff08;最终目的&#xff1a;安装进…

vuInhub靶场实战系列--Kioptrix Level #3

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

27-LINUX--I/O复用-poll

一.poll概述 poll是一个多路复用的I/O模型&#xff0c;一个进程监视多个文件描述符&#xff0c;当文件描述符就绪时&#xff0c;poll返回可读并做相应处理。 1.poll的模型 #include <poll.h>struct pollfd {int fd; //文件描述符short events; //事件类型 s…

5 个你不知道的隐藏 CSS 属性

层叠样式表 (CSS) 是网页设计的骨架&#xff0c;它可以帮助我们轻松的设置网页的样式和格式。虽然大多数的 CSS 属性&#xff0c;例如颜色、字体大小和边距都被大家熟知&#xff0c;但还有许多鲜为人知的属性可以帮助我们设计添加功能。在这篇文章中&#xff0c;我们将介绍 5 个…