软考复习之数据结构篇

算法设计

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

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

未完待续......

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch深度学习实战(34)——Pix2Pix详解与实现

PyTorch深度学习实战&#xff08;34&#xff09;——Pix2Pix详解与实现 0. 前言1. 模型与数据集1.1 Pix2Pix 基本原理1.2 数据集分析1.3 模型构建策略 2. 实现 Pix2Pix 生成图像小结系列链接 0. 前言 Pix2Pix 是基于生成对抗网络 (Convolutional Generative Adversarial Netwo…

Fog Volume 3

仅支持内置渲染管线 Fog Volume 3是一个体积雾渲染器,旨在模拟各种大气效果。它提供了大量的控制,以帮助您在外观和性能方面满足您的需求。有关详细信息,请查看文档。 下载: ​​Unity资源商店链接 资源下载链接 效果图:

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…

基于SSM的二手车交易网站设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的二手车交易网站设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

【C++初阶】C++入门(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

AI技术的机遇与挑战

现在&#xff0c;企业对人工智能&#xff08;AI&#xff09;技术人员的需求高涨&#xff0c;对人工智能项目大幅投入预算。全球新冠肺炎疫情等驱动因素促进了数字化转型&#xff0c;极大地加快了AI和机器学习&#xff08;ML&#xff09;技术的发展。越来越多的企业正在研究如何…

Vue_Router_守卫

路由守卫&#xff1a;路由进行权限控制。 分为&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强&#xff0c;history没有#兼容性差"…

重新看:浏览器是如何渲染页面的?

这里写自定义目录标题 写在前面的话浏览器是如何渲染页面的&#xff1f;1、解析HTML &#xff08; Parse HTML&#xff09;2、样式计算&#xff08; Recalculate Style&#xff09;3、布局&#xff08; Layout&#xff09;4、分层&#xff08; Layer&#xff09;5、绘制&#x…

Tensorflow2.0笔记 - Tensor的限值clip操作

本笔记主要记录使用maximum/minimum,clip_by_value和clip_by_norm来进行张量值的限值操作。 import tensorflow as tf import numpy as nptf.__version__#maximum/minimumz做上下界的限值 tensor tf.random.shuffle(tf.range(10)) print(tensor)#maximum(x, y, nameNone) #对…

ElementUI组件:Link 文字链接

ElementUI安装与使用指南 Link 文字链接 点击下载learnelementuispringboot项目源码 效果图 el-link.vue页面效果图 项目里el-link.vue文件代码 <script> export default {name: el_link }</script> <!--https://element.eleme.cn/#/zh-CN/component/link …

详解SpringCloud微服务技术栈:深入ElasticSearch(2)——自动补全、拼音搜索

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;1&#xff09;——数据聚合 &#x1f4da;订阅专栏&…

全彩屏一体化负氧离子监测站在景区中的作用

【TH-FZ5】全彩屏一体化负氧离子监测站在公园景区中的作用主要体现在实时监测与预警、提升游客体验、辅助决策与科学管理、科普教育和促进生态旅游发展等方面。通过这些作用&#xff0c;可以更好地保护和利用景区的生态环境&#xff0c;为游客提供更加健康、愉悦的旅游体验。 …

C51 单片机学习(一):基础外设

参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机&#xff08;Micro Controller Unit&#xff0c;简称 MCU&#xff09; 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处…

嵌入式系统中VSCode配置C/C++环境方法

小伙伴们大家好&#xff0c;今天给大家介绍一款程序员常用的开发神器VSCode&#xff0c;想必大家肯定有所了解&#xff0c;也有很多小伙伴在日常工作中经常使用。当木荣君初次见到VSCode时&#xff0c;真正的被它惊艳到了&#xff0c;可以说是一见钟情。从此就爱不释手&#xf…

CUDA编程- - GPU线程的理解 thread,block,grid - 学习记录

GPU线程的理解 thread,block,grid 一、从 cpu 多线程角度理解 gpu 多线程1、cpu 多线程并行加速2、gpu多线程并行加速2.1、cpu 线程与 gpu 线程的理解&#xff08;核函数&#xff09;2.1.1 、第一步&#xff1a;编写核函数2.1.2、第二步&#xff1a;调用核函数&#xff08;使用…

Linux内核源码

记得看目录哦&#xff01; 1. 为什么要阅读Linux内核2. Linux0.01内核源码3. 阅读linux内核源码技巧4. linux升级内核5. linux的备份和恢复5.1 安装dump和restore5.2 使用dump完成备份5.3 使用restore完成恢复 1. 为什么要阅读Linux内核 2. Linux0.01内核源码 3. 阅读linux内核…

论文阅读-MapReduce

论文名称&#xff1a;MapReduce: Simplified Data Processing on Large Clusters 翻译的效果不是很好&#xff0c;有空再看一遍&#xff0c;参照一下别人翻译的。 MapReduce:Simplified Data Processing on Large Clusters 中文翻译版(转) - 阿洒 - 博客园 (cnblogs.com) 概…

智慧高校|为何要建设实验实训室综合管理平台?

一、平台背景 实训室综合信息管理平台是实训室管理系统能正常运转的框架与核心&#xff0c;它承载了实验室基础管理、实验室安全教育准入考试管理、实验室安全检查管理、试剂耗材管理、危险化学品管理、仪器设备管理、实验队伍管理、物联网终端管理、系统设置、权限管理等软件…

2024前端面试总结—JS篇(文档持续更新中。。。)

1、Event Loop&#xff08;事件循环&#xff09;机制 JS是单线程的非阻塞语言 为什么是单线程&#xff08;如果js是多线程&#xff0c;那么两个线程同时对同一个Dom进行操作&#xff0c;一个增一个删&#xff0c;浏览器该如何执行&#xff1f;&#xff09; 非阻塞&#xff08;…

企业计算机中了360后缀勒索病毒如何处理,360后缀勒索病毒处理建议

网络的不断发展与应用&#xff0c;不仅为企业的生产运营提供了极大便利&#xff0c;还极大地提高了企业生产效率&#xff0c;为企业的生产提供了有利条件。但网络的发展也为企业的数据安全带来严重威胁。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的…