软考复习之数据结构篇

news2024/9/22 1:42:41

算法设计

迭代法:用于求方程的近似根。

1、若方程无解,则算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考查方程是否有解,并在程序中对迭代的次数给予限制。

2、方程虽有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

穷举搜索法:对可能是解的众多候选解按某种顺序进行逐一枚举和检查,并从中找出符合要求的候选解作为问题的解

递推法:利用问题本身所具有的一种递推关系求问题解的一种方法

递归法:执行过程分递推和回归两个阶段:在递推阶段,把较复杂的问题的求解分解成比原问题简单一些的问题的求解。在回归阶段,从获得的最简单情况的解,逐级返回,依次获得稍复杂问题的解。(递归法就是把问题转化为规模缩小了的同类问题的子问题

分治法:把大问题分解成一些较小的问题,然后由小问题的解方便地构造出大问题的解,每个小问题都是相互独立的。例如二分查找法、汉诺塔问题、斐波那契、归并排序

动态规划法:基本思想也是将大问题分解为多个小问题,但是与分治法不同的是,动态规划法的子问题往往不是独立的。因此,动态规划法可以避免大量重复的计算。以自底向上的方式计算出最优值。例如最大子段问题

贪心法:不追求最优解,只希望得到较为满意解的方法。可以快速得到满意的解,不考虑整体情况,所以贪心法不要回溯。例如哈夫曼编码

回溯法:该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选键除了不满足问题规模要求外,满足所有其他要求,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求,该候选键就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程被称为回溯;扩大当前候选解的规模,以继续试探的过程称为向前试探,回溯法以深度优先的方式搜索解空间树。

分支限界法:类似于回溯法,也是在问题的解空间树上搜索问题解的方法。但在一般情况下,二者的求解目标不同。回溯法是找出解空间树中满足空间树中满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。分支限界法以广度优先或以最小耗费优先的方式搜索空间树。例如单源最短路径问题

算法复杂度

例题

已知算法 A 的运行时间函数为 T(n)=8T(\frac{n}{2})+^{n^2},其中 n 表示问题的规模,则该算法的时间复杂度为(1),另已知算法 B 的运行时间函数为 T(n)=XT(\frac{n}{4})+^{n^2},其中 n 表示问题的规模。对充分大的 n,若要算法 B 比算法 A 快,则 X 的最大值为(2)
(1) A. O(n)        B.O(nlogn)        C.O(^{n^2})        D.O(^{n^3})

(2) A. 15        B. 17        C. 63        D.65

一般地,当递归方程为 T(n) = aT(n/c) + O(n),T(n)的解为:

  1. 1. O(n),a<c && c > 1
  2. 2. O(n^{\log_2{n}}),a=c && c > 1
  3. 3. O(n^{\log_c{a}}),a>c && c > 1

概率算法

数值概率算法:适用于数值问题的求解,这类算法得到的往往是近似解,且近似解的精度随时间的增加不断提高。在多数情况下,要计算出问题的精确解是不可能的或是没有必要的,因此数值概率算法可得到相当令人满意的解。

蒙特卡罗算法:适用于求问题的精确解,该算法能求得一个解,但该解未必是正确的,正确的概率依赖算法所用的时间,时间越久,正确率越高。因此,该算法的缺点就是无法有效地判断所得到的解是否正确

拉斯维加斯算法:如果该算法找到一个解,那一定是正确的解,得到正确解的概率依赖算法所用的时间。

舍伍德算法:一定能找到一个正确的解,该算法设法消除最坏情形与特定实例之间的关联性

存储结构

顺序存储

适用于频繁用一组地址连续的存储单元依次存储线性表的各个数据元素查询时使用。

链式存储

在计算机中用一组任意的存储单元存储线性表的数据元素,适用于在较频繁的插入、删除、更新元素时使用。

单链表

循环链表

双链表

因为双链表有两个指针域,因此,双链表的灵活度优于单链表,但是双链表的开销要大一些。

顺序表与链表的比较:

散列存储

将数据元素的存储位置与关键码之间建立确定对应关系的查找技术,即键值对。

索引存储

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单,比如数据库。

二叉树

性质:

  1. 深度为K的二叉树最多有(2^K)-1个节点(K>=1)。

  2. 二叉树的第N层上最多有2^(N-1)个节点(N>=1)。

  3. 二叉树的叶子节点数等于度为2的节点数加1,即n0=n2+1。n0表示叶子节点数,n2表示度为2的节点数。

满二叉树

如果一棵二叉树的节点要么是叶子节点,要么它有两个子结点的树称满二叉树。

一棵深度为k且有(2^k)-1个节点的二叉树称为满二叉树。

除最后一层无任何子节点外,每一层都上的所有节点都有两个子节点或0个子结点的二叉树

性质:

  1. 层数为K的满二叉树的节点总数为(2^K)-1

  2. 层数为K的满二叉树的叶子节点数为2^(K-1)

完全二叉树

对一颗具有K个节点的二叉树按层序编号,如果编号为i(1<=i<=K)的节点与满二叉树中编号为i的节点在二叉树中的位置完全相同,那么这查二叉树称为完全二叉树。

性质:

  1. 叶子节点只能出现在最下两层;最下层的叶子节点集中在树的左边,倒数第二层的叶子节点一定出现在右边。

  2. 节点度为1,则该节点只有左子树,即不存在只有右子树的情况。

  3. 具有N个节点的完全二叉树的深度为⌊logN⌋+1(logN表示以2为底N的对数,⌊X⌋表示不大于X的最大整数)。

  4. 如果对一棵有N个节点的完全二叉树的节点按层序编号,则对任一节点index(1<=index<=N)满足以下条件:

    • index=1,节点index是二叉树的根,无双亲;若index>1,则[i / 2]是双亲节点。

    • 2*index>N,节点index无左孩子,否则2*index为左孩子节点。

    • 2*index+1>N,节点index无右孩子,否则2*index+1为右孩子节点。

注:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

四种遍历方式

前序遍历

遍历顺序根 => 左 => 右

中序遍历

遍历顺序左 => 根 => 右

后序遍历

遍历顺序左 => 右 => 根

层序遍历

遍历顺序逐层遍历

哈夫曼树(最优二叉树)

定义:哈夫曼树是带权路径(WPL)最短的树,权值越大的叶子节点越靠近根节点。

WPL值的计算:树的路径长度是从树根到每一结点的路径长度之和。树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作WPL。

以数组 【5,29,7,8,14,23,3,11】为例,下面是计算哈夫曼树 WPL 的详细过程。

  1. 排序:按照数组中元素的权值进行升序排序。

    排序后的数组:【3,5,7,8,11,14,23,29】

  2. 构建哈夫曼树: 依次从数组中取出两个权值最小的元素,构建一个新的节点,其权值为这两个元素的权值之和。将这个新节点放回数组,并继续排序,直到数组中只剩一个节点,即哈夫曼树的根节点。

    • 第一步:【3,5,7,8,11,14,23,29】
      构建新节点:3+5,得到【8,7,8,11,14,23,29】
    • 第二步:7,8,8,11,14,23,29
      构建新节点:7+8,得到【15,8,11,14,23,29】
    • 第三步:【8,11,14,15,23,29】
      构建新节点:8+11,得到【19,14,15,23,29】
    • 第四步:【14,15,19,23,29】
      构建新节点:14+15,得到【29,19,23,29】
    • 第五步:【19,23,29,29】
      构建新节点:19+23,得到【42,29,29】
    • 第六步:【29,29,42】
      构建新节点:29+29,得到【58,42】
    • 第七步:【42,58】
      构建新节点:42+58,得到【100】

  3. 计算 WPL: 计算哈夫曼树的 WPL 值。对于每个叶子节点,其带权路径长度等于该节点的权值乘以到达该节点的路径长度。最后将所有叶子节点的带权路径长度相加即可。

    WPL=(4+5+7+8)*4+(11+14)*3+(23+29)*2
            =96+75+52
            =275

例题

已知一个文件中出现的各字符及其对应的频率如下表所示。若采用定长编码,则该文件中字符的码长应为(1)。若采用Huffman编码,则字符序列“face”的编码应为(2)。

字符abcdef
频率(%)4513121695

(1) A.2        B.3        C.4        D.5

(2) A.110001001101        B.001110110011        C.101000010100        D.010111101011

解析:所谓定长编码是指用多少位二进制足够表示字符,图中字符是有6个的,a、b、c、d、e、f,可用000到101表示a到f,这样编码字符的码长可以为3,4位当然也是可以,但我们是找最合适的,自然3位能满足要求。第二问,哈夫曼树的左节点未必要比右节点小,但是通常做题时需要写成左小右大的形式,再左0右1赋值,所谓“face”编码,是指找到这4个字母,从根节点出发,要经历的编码数。如下图所示,所以答案为B A

二叉排序树

性质:

  1. 若任意结点的左子树不空,则左子树上所有节点的值均不大于它的根节点的值。

  2. 若任意结点的右子树不空,则右子树上所有节点的值均不小于它的根节点的值。

  3. 任意节点的左、右子树也分别为二叉搜索树

平衡二叉树

具备以下性质的二叉搜索树称为平衡二叉树。

性质:

  1. 每个节点的的左子树和右子树的高度之差的绝对值不超过1。

平衡因子 = 左子树的深度 - 右子树的深度

森林

树转二叉树

转换原理:

  1. 加线:将所有兄弟节点连成一条线。

  2. 去线:对树中每个节点,只保留它与每一个孩子节点的连线,删除其它孩子节点的连线。

在这里插入图片描述

二叉树转树

转换原理:

  1. 加线:如果根节点的左节点存在,则将根节点的所有右节点与根节点连成一条线。

  2. 去线:删除原二叉树中所有节点与右节点的连线。

  3. 层次调整。

森林转二叉树

转换原理:

  1. 将森林中的每一棵树转换成二叉树。

  2. 连线:将每棵树的根节点连成一条线。

img

二叉树转森林

转换原理:

  1. 只要存在右孩子节点,就不断删除右孩子节点的连线。

  2. 将分离后的二叉树转换成树。

邻接矩阵

无向图:其邻接矩阵第i行的元素的和即为顶点 i 的度

例如:顶点4的度就是第四行的和,即2。

有向图:其邻接矩阵第i行元素之和为顶点i的出度,而邻接矩阵的第j列元素之和为顶点j的入度。

查找算法

二分查找法

适用情况

不经常变动而查找频繁的有序列表

优点

1、比较次数少

2、查找速度快

3、平均性能好

缺点

1、要求待查表为有序表

2、插入删除困难

实现算法:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

分块查找法

适用情况:节点动态变化的情况

优点:比顺序查找算法快得多

缺点:速度不如折半查找法

实现算法:把一个线性表分成若干个块,每块中的节点可以任意存放,但块与块之间必须排序。假设是按关键码值非递减的,那么这种块与块之间必须满足已排序要求,实际上就是对于任意的i,第i 块中的所有节点的关键码值都必须小于第i+1块中的所有节点的关键码值。此外,还要建立一个索引表,把每块中的最关键码值作为索引表的关键码值,按块的顺序存放到一个辅助数组中,显然这个辅助数组是按关键码值递减排序的。查找时,首先在索引表中进行查找,确定要找的节点所在的块。由于索引表的排序的,因此,对索引表的查找可以采用顺序查找或折半查找;然后在相应的块中采用顺序查找,即可找到对应的节点

平均查找长度

(1)以二分查找确定块时,平均查找长度 = log2(n / s+1) + s / 2

(2)以顺序查找确定块时,平均查找长度 = (b + 1) / 2 + (s + 1) / 2 = (s^2 + 2s + n) / 2s

注:n 表示元素的总个数

s 表示每个块所具有的元素个数

b 表示分为几个块

排序算法

例题

堆是一种数据结构,(34) 是堆排序

A.(10,50,80,30,60,20,15,18)

B.(10,18,15,20,50,80,30,60)

C.(10,15,18,50,80,30,60,20)

D.(10,30,60,20,15,18,50,80)

归并排序的归并路数

归并路数 = | \log_km|,其中m为元素个数k为多路归并趟数。

例题:若对 27 个元素只进行 3 趟多路归并排序,则选取的归并路数为(37)

A. 2        B. 3        C. 4        D. 5

广义表

广义表的长度是将最外面那层的括号删了以后所剩下的元素(组)个数深度是括号的层数。

例题:L1=((a,(a,b),((a,b),c))), L2=((1,2,3)), L3=(1,2,3)。求L1、L2、L3的长度和深度?

长度深度
L114
L212
L331

未完待续......

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

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

相关文章

B3626 跳跃机器人——洛谷(疑问)

题目描述 地上有一排格子&#xff0c;共 &#xfffd;n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 &#xfffd;n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#…

使用 Paimon + StarRocks 极速批流一体湖仓分析

摘要&#xff1a;本文整理自阿里云智能高级开发工程师王日宇&#xff0c;在 Flink Forward Asia 2023 流式湖仓&#xff08;二&#xff09;专场的分享。本篇内容主要分为以下四部分&#xff1a; StarRocksPaimon 湖仓分析的发展历程使用 StarRocksPaimon 进行湖仓分析主要场景和…

读AI3.0笔记10_读后总结与感想兼导读

1. 基本信息 AI 3.0 (美)梅拉妮米歇尔 著 四川科学技术出版社,2021年2月出版 1.1. 读薄率 书籍总字数355千字&#xff0c;笔记总字数33830字。 读薄率33830355000≈9.53% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 虚拟人 新机器人 如何创造可信的AI 新机器智…

【极数系列】Flink集成DataSource读取Socket请求数据(09)

文章目录 01 引言02 简介概述03 基于socket套接字读取数据3.1 从套接字读取。元素可以由分隔符分隔。3.2 windows安装netcat工具&#xff08;1&#xff09;下载netcat工具&#xff08;2&#xff09;安装部署&#xff08;3&#xff09;启动socket端口监听 04 源码实战demo4.1 po…

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入…

深度强化学习(王树森)笔记11

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

部署PXE高效批量网络装机

部署PXE高效批量网络装机 因在Cisco3850核心交换机中已开启DHCP 服务&#xff0c;因此不需要在配置DHCP服务。如果您的网络环境中也已有DHCP服务&#xff0c;也不用再配置DHCP服务了&#xff0c;直接部署PXE相关服务即可。 找一台linux系统的服务器&#xff0c;这本次试验用的是…

华为云codeArts使用操作流程

一、开启服务 什么是华为云CodeArts&#xff1f; 本实验将在华为云CodeArts平台上搭建一个凤凰商城开发项目&#xff0c;并完成需求管理、代码仓库、代码检查、编译构建、发布、部署、流水线等软件开发操作。 1)新建项目 进入华为云“控制台”&#xff0c;鼠标移动到页面左侧菜…

kettle通过severice_name连接oracle数据源踩坑

最近在研究kettle做数据抽取核对&#xff0c;按照官网安装kettle后无法连接oracle 坑1&#xff1a;kettle 连接oracle的数据库名指的是sidname 而非severicename&#xff0c;前期一直使用severicename 如下始终报错 注意区分下&#xff1a; SID:一个数据库可以有多个实例&…

Docker容器引擎镜像创建

目录 一、镜像的创建 &#xff08;一&#xff09;基于现有镜像创建 1.启动一个镜像&#xff0c;在容器里做修改 2.将修改后的容器提交为新的镜像 &#xff08;二&#xff09;基于本地模板创建 &#xff08;三&#xff09;基于Dockerfile 创建 1.联合文件系统&#xff08…

【Node.js基础】http模块的使用

文章目录 前言一、客户端与服务器是什么二、http模块的使用2.1 导入http模块2.2 创建web服务器服务器的相关概念创建最基本的web服务器req对象解决发送中文乱码根据不同的url 响应不同的 html内容 总结 前言 Node.js 提供了一个强大的内置模块——http 模块&#xff0c;用于创…

力扣 55.跳跃游戏

思路&#xff1a; 从后往前遍历&#xff0c;遇到元素为0时&#xff0c;记录对应的下标位置&#xff0c;再向前遍历元素&#xff0c;看最大的跳跃步数能否跳过0的位置&#xff0c;不能则继续往前遍历 代码&#xff1a; class Solution { public:bool canJump(vector<int>…

linux --中断管理 -- irq的自动探测机制

irq自动探测机制 如果一个设备的驱动程序无法确定它说管理的设备的软件中断号irq&#xff0c;此时设备驱动程序可以使用irq的自动探测机制来获取其正在使用的irq。 使用自动探测机制的条件 内核与驱动&#xff0c;必须共同努力才能完成只限于非共享中断的情况 探测前&#…

[AG32VF407]国产MCU+FPGA Verilog编写控制2路gpio输出不同频率方波实验

视频讲解 [AG32VF407]国产MCUFPGA Verilog编写控制2路gpio输出不同频率方波实验 实验过程 根据原理图&#xff0c;选择两个pin脚作为输出 修改VE文件&#xff0c;clk选择PIN_OSC&#xff0c;使用内部晶振8Mhz&#xff0c;gpio使用PIN_51和52&#xff0c;pinout是数组 添加pll…

并发编程之线程

一、并发、并行、串行 并发: 多个任务在同一时间段内同时执行&#xff0c;如果是单核计算机&#xff0c;CPU会不断地切换任务来完成并发操作 并行:多任务在同一时刻同时执行&#xff0c;计算机需要有多核心&#xff0c;每个核心独立执行一个任务&#xff0c;多个任务同时执行…

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力&#xff0c;其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式&#xff1a; 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为&#xff1a; 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征&#xff1a;带分…

ASTORS国土安全奖:ManageEngine AD360荣获银奖

美国安全今日&#xff08;AST&#xff09;的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动&#xff0c;致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖&#xff0c;不仅…

【Web前端实操20】商城官网_黑色导航

今天继续着上一篇博客的内容进行编写,本次主要实现的是商场官网实战里面的黑色导航栏部分,也就是广告图片下面的部分。 本次除了每篇都要通用的样式CSS代码之外,还增添了一个引用矢量图标的样式,如果有兴趣的友友们,可以看看我的这篇博客,上面详细介绍了如何下载矢量图标…

live2D学习:做好让图片动起来的准备

做好让图片动起来的准备https://www.bilibili.com/video/BV1JE411Y7Te?p2&vd_source124076d7d88eee393a1d8bf6fc787efa 把psd文件通过菜单栏的“打开文件”进行导入或直接把psd文件拖到Live2D Cubism Editor 4.0的面板中 网格 我们在点击图像的一部分时&#xff0c;会出现…