- 博客(238)
- 收藏
- 关注
原创 需求工程各个步骤详解
对系统应提供的服务和所受到的约束的描述就是系统需求的内容。这些需求反映了客户对系统帮助其解决某些问题的需要,这些问题可以是:对设备的控制,安排一次订货,或者是信息的查询,等等。对服务和约束的发现、分析、建立文档、检验的过程叫做需求工程。用户需求是用自然语言加图的形式给出的、关于系统需要提供哪些服务以及系统操作受到哪些约束的声明。系统需求详细地给出系统将要提供的服务以及系统所受到的约束。系统需求文档有时也称为功能描述,应该是精确的。它可能成为系统买方和软件开发者之间合同的重要内容。功能需求和非功能需求
2021-06-24 17:09:06
4984
1
原创 敏捷软件开发——敏捷方法、极限编程、Scrum
快速的软件开发过程就是为迅速制造可用软件而设计的。软件的开发和部署不是一次完成的,而是以一系列增量的形式完成的,每一个增量包括新的系统功能。尽管有很多快速软件开发的方法,它们都有一些基本的特性:描述、设计和实现过程是交织在一起的。没有详细的系统描述,设计文档得到了最少化,或者是由实现系统所采用的编程环境所自动生成。用户需求文档只定义最为重要的系统特性。系统通过一系列版本开发出来。最终用户和其他系统信息持有者都参与了每个版本的定义和评估。他们提出对软件的变更建议和对系统后一个版本应该实现的新需求的提议。
2021-06-24 10:20:41
1369
原创 过程活动详解——软件描述、软件设计和实现、软件有效性验证、软件进化
软件描述软件描述或需求工程是理解和定义系统需要提供哪些服务,以及找出开发和运行中受到哪些约束。需求工程是软件过程中一个特别关键的阶段,这个阶段的错误将不可避免地带来系统设计和实现阶段的后续问题。需求工程过程有4个主要的阶段:可行性研究:指明现有的软件、硬件技术能否实现用户对新系统的要求。从业务角度决定系统开发是否划算以及在预算范围内能否开发出来。可行性研究应该是相对来讲花钱少快速完成的。结果应该得出结论,该系统是否值得进行更细致的分析。需求导出和分析:这是一个通过对现有系统分析、与潜在用户和购买
2021-06-23 23:18:03
2381
1
原创 8255并行芯片——外部特性、工作方式、命令字
并行接口的特点传输速率高——字节、字、双字宽 ,多根数据线同时传可靠性高——可设置握手联络信号线,易于实现异步互锁协议使用自由——数据格式、传输速率、工作时序无固定规定,根据I/O设备要求决定不做差错检验和速率控制适于近距离传输使用广泛8255外部特性下图为8255的外部引脚:其中,A、B、C端口都可以作为数据口与外设之间交换数据,但C端口的使用比较特殊,除了作为数据端口外,还可以做状态端口、专用联络线和做按位控制用,且C端口被分为高4位和低4位两部分,高4位PC4 ~ PC7与A端
2021-06-23 20:10:39
8475
1
原创 中断控制器8259——工作方式、命令字
首先来看一下8259的外部引脚:8259的工作方式:命令字初始化命令(ICW1~ICW4)注意命令字中的A0,若A0为1,则使用奇地址;若为0,则使用偶地址。ICW1进行中断触发方式和单片/多片使用的设置。其中D3设置触发方式,D1设置单/多片使用。ICW2进行中断号设置。初始化编程时只写高5位,低3位写0。低3位的实际值由外设所连接的IRi引脚编号决定,并由8259自动填写,比如连接IR5,则低3位为5。ICW3进行级联方式设置。只有系统存在2片以上8259时启用,否则不用。ICW4
2021-06-23 19:02:31
10409
2
原创 8254芯片详解——6种工作方式、命令字、计数初值的计算
首先8254的芯片引脚如下图:6种工作方式8254计数初值的确定:计数初值=CLK的时钟频率 * 所需定时时长8254中只有2、3方式输出周期性的波形,0、1、4、5方式则只输出单次波形。0方式:当写入计数初值后,启动计数器开始计数,OUT信号变为低电平,并维持低电平至减法计数器的内容减到0时,停止工作,OUT信号变为高电平,并维持高电平到再次写入新的计数值,因此0方式输出单次波形。如下图为0方式输出的波形,计数初值为4:需要注意的是,0方式是由软件启动,写入计数初值之后就开始计数,无需外加启
2021-06-23 15:27:15
28587
4
原创 一文搞定软件过程模型——瀑布模型、增量式开发/增量开发与迭代开发的区别
软件开发比较经典的过程模型有:瀑布模型:该模型将基本的过程活动、描述、开发、有效性验证和进化,看成是一些界限分明的独立的过程阶段,例如,需求描述阶段、软件设计阶段、实现阶段、测试阶段等。增量式开发:该方法使得描述活动、开发活动和有效性验证活动交织在一起。系统的开发是建立一系列的版本(增量),每个版本添加部分功能到先前的版本中。面向复用的软件工程:该方法是基于已存在的大量可复用的组件。系统开发过程着重于集成这些组件到新系统中,而非从头开发。三个模型相互不排斥,而且经常一起使用,尤其是对大型系统的开
2021-06-23 11:32:20
6905
1
原创 语义分析——声明语句、赋值语句、条件语句和循环语句的翻译
接下来介绍各种常用语句在语义分析中如何翻译。声明语句的翻译程序语言中的声明语句都是给编译程序提供信息的,其作用是告知编译器把某个名字和某个类型联系起来,并为它分配相应的内存空间。因此对声明语句一般不生成代码,只是在编译时把有关信息填入相应表格即可。为局部名字建立符号表条目,其中包含名字的类型和分配给它的存储单元的相对地址等信息赋值语句的翻译简单算术表达式的赋值语句所谓简单指不考虑数组元素、记录、函数引用等情况。如C语言中的:a = 1;对应的四元式为:(=, a, _, 1)
2021-06-22 19:35:48
2000
原创 属性文法——S属性文法、L属性文法/语法制导定义SDD
属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列 、符号表内容等等。属性和变量一样,可以进行计算和传递。属性一般分为两类:综合属性:用于“自下而上”传递信息。在语法树中,一个结点的综合属性的值由其子结点或其自身的某些属性值确定。继承属性:用于“自上而下”传递信息。在语法树中,一个结点的继承属性值由该结点的父结点、兄弟结点和其自身的某些属性值确定。注意:终结符只有综合属性,由词法
2021-06-22 18:35:32
13435
1
原创 自下而上的语法分析——LR(0)和SLR分析
借助于一个栈,可以将这种方法简化为“移进—规约分析”:从左向右逐个扫描待分析的单词符号串,并将串中单词一个一个地移入栈中,边移入边分析;每当栈顶符号串形成了所给文法的某个产生式右部时就进行一次归约,即用该产生式的左部非终结符去替换相应的右部符号串(即:出现在栈顶的这一串单词符号,称为可归约串)。重复这一过程,若能将所有的单词符号都归约到文法的开始符号,则该单词符号串是该文法的合法句子,否则不是。关键问题分析过程中的关键问题是如何确定栈顶已经形成了可规约串,即:如何定义可归约串?如何识别可归约串?
2021-06-22 16:58:46
3931
原创 自上而下的语法分析-递归下降分析和LL(1)文法
对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下、自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串。显然,这一过程应该与一个最左推导相对应。方法特点:这实际上是一种穷举法,自上而下地试探,有时免不了要走回头路—回溯存在的问题及解决方法左递归问题自顶向下分析为什么不能处理左递归文法?如果在匹配输入串过程中,正好轮到要用非终结符 U 直接匹配输入串,那么就会用到 U 所对应的右部符号串 U… 去匹配;然后又轮到 U 去匹配,又
2021-06-21 21:37:29
4456
原创 一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简
有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA。确定有穷自动机(DFA)形式定义:表示形式为:注意:终态是用两个圆圈表示的,图中的3号即为DFA的终态。不确定的有穷自动机(NFA)形式定义:DFA与NFA的区别DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA。这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自
2021-06-21 20:07:32
55822
5
原创 编译过程概述
编译过程大概的过程为:没错,编译程序的过程就是一个IPO过程,那么具体的过程则为:词法分析词法分析,就是依据语言构词规则,从输入的源程序(字符串)中识别出一个个单词(符号)。首先,单词的种类有:关键字:for if while运算符:+ - × /分割符: , ;() { }标识符:a1 a2 pi常数: 9 1024 4.8 6E6其中,前三个为有穷集合(程序设计语言确定了,那么这些就确定了),后三个则为无穷集合。词法分析工作由词法分析器完成,又称扫描器(scanner)。词
2021-06-21 10:36:26
1156
原创 编译程序与解释程序的区别
高级程序设计语言主要可以分为两类:编译执行的语言和解释执行的语言,对应的程序即为编译程序和解释程序,那么这两个之间的区别是什么呢?根本区别编译程序和解释程序的根本区别在于是否产生低级语言形式的目标程序。编译程序在生成可执行文件之后,花费的时间就会比解释程序短,因为编译程序已经转换成低级语言形式了,而解释程序还需要重新先转换成低级语言形式,这就相当于多走了一段路程,花费的时间自然就会长一些。编译程序这里以C语言为例,首先我们编写的源程序的文件后缀名为.c文件,然后点击运行之后,首先进行预处理,这一步
2021-06-21 10:00:27
2749
原创 需求分析中常用的图形工具
在需求分析阶段常用的图形工具有层次方框图、IPO图和Warnier图。层次方框图层次方框图用树形结构的一系列多层次的矩形框描绘数据的层次结构。描绘一家计算机公司全部产品的数据结构可以用层次方框图表示:公司的产品由硬件、软件和服务3类产品组成,软件产品又分为系统软件和应用软件,系统软件又进一步分为操作系统、编译程序和软件工具等。IPO图IPO图是输入、处理、输出图的简称,它是由美国IBM公司发展完善起来的一种图形工具,能够方便地描绘输入数据、对数据的处理和输出数据之间的关系。Warnier图Wa
2021-06-20 21:32:55
7068
原创 软件工程中的交换流和事务流
数据流图呈线性变换特征,而且可以抽象成三部分:I-P-O。信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫作变换流 。计算、分析型软件的数据流图通常具有这种形式。数据流图呈辐射型,根据输入数据的性质选择加工路径。若处理沿输入通道达到一个处理T,处理T根据输入数据的类型在若干动作序列中选择一个来执行。这类特殊的数据流称为事务流。处理T称为处理中心。处理中心的任务:接收输
2021-06-20 21:21:03
3608
转载 Jackson图概念+优点缺点+改进的Jackson图+实例
那天写实验报告的查资料的时候发现网上居然没有完整的Jackson图相关知识orz那我就自己动手丰衣足食好了quq以下多图预警! Jackson方法是一种面向数据结构的设计方法。 一、Jackson图 1.顺序结构 顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。如图。 2.选择结构 选择结构的数据包含两个或多
2021-06-20 18:42:05
11360
转载 耦合和内聚-图解7种耦合关系
图解7种耦合关系颜海镜知名技术博主,《React状态管理与同构实战》作者 yanhaijing.com237 人赞同了该文章之前组内同学问我耦合的关系,我没给对方讲清楚,今天借这个机会来深入讲讲模块之间的耦合关系这个事情。本文将用图文详细讲解七种耦合的不同之处。高内聚与低耦合高内聚与低耦合是每个软件开发者追求的目标,那么内聚和耦合分别是什么意思呢?内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块
2021-06-20 17:07:26
7912
转载 软件程序设计中的N-S图、PAD图、程序流程图、E-R图
在软件程序设计中,我们通常会用到以下几种图,来帮助我们,分析问题,整理逻辑。 我将介绍这四种图的特性,以及区分它们的方法。1.N-S图: 也叫盒图,由美国学者I.Nassi 和 B.Shneiderman提出,所以又称N-S图,可以清晰的表示程序的结构以及流程,其主要特征为“矩形框”。 2.PAD图: 全称为Problem Analysis Diagram,即问题分析图表,利用二维树形结构表示程序的控制流,也就是将程序功能的路线图给画出来,既可以表示程序的逻辑,也可以表示程序的结构,区分它的方法是
2021-06-20 16:57:02
16951
原创 Floyd算法
给定一个带权连通图(有向或无向),要求找出从每个顶点到其他所有顶点之间的距离(最短路径的长度),这就是完全最短路径问题。只要图中不包含长度为负的回路,可用Floyd算法来生成距离矩阵。该算法既可应用于无向加权图,也可用于有向加权图。对于一个带权有向图:其对应的权重矩阵为:而距离矩阵为:而我们的要求便是通过权重矩阵求出其对应的距离矩阵。算法思想其中,D(0)即为权重矩阵,D(n)即为距离矩阵。状态转移方程由上图可知,第k次迭代中[ i , j ]之间的距离是由d[ i , j ]
2021-06-20 11:33:29
2342
原创 Warshall传递闭包算法
一个n个顶点有向图的传递闭包,即为一个n阶布尔矩阵T={ t i j }:如果从 i 到 j 顶点间存在一条有向路径,那么矩阵第 i 行第 j 列置1 即T[i, j]=1;否则置0即T[i, j]=0。传递闭包给出给定图各顶点之间是否存在任意长度的有向路径。首先可以肯定的是,求一个图的传递闭包,可以用DFS和BFS来求,但是很明显,使用DFS和BFS的话,我们必须要循环|V|次,因此效率会非常低。而Warshall算法则是使用的动态规划的思想,能够有效地提高效率。具体思想Warshall 算法首先
2021-06-20 10:39:24
13307
原创 生成组合对象
组合对象,即排列、组合和给定集合的子集等。数学中我们也学过排列组合,对于给定的一个集合,给出其对应的排列组合,以及对应的子集。生成排列排列问题指的是对于给定的多个元素求其中各种可能的序列。为了简单起见,这里仅仅考虑1到n之间的整数的排列问题。生成排列的方法有三种:插入法、Johnson-Trotter法、字典顺序法插入法方法便是依次从集合中取元素,并将其插入到之前生成的排列中。如:求n=3的排列则首先在n=1的排列中插入2,然后在n=2的排列中插入3。过程便是:在 1 中从右到左插入
2021-06-19 17:03:50
469
转载 如何编写测试文档
如何编写测试文档相信很多小伙伴都有过产品测试的经历,在测试环节之后,就是要编写合理的测试文档。那么一篇合格的测试文档是什么样的呢? 通常情况下,测试报告上会包含测试进度,测试环境,测试情况大致描述、作为测试者对于当前版本的看法(是否可以上线),测试内容(测试场景),测试概况,新提交的bug汇总等内容。 本文中将以我们的一个项目,TimeIsMoney,一款校园做任务挣钱的云平台为例。 测试文档包含的要素 一、项目背景 本测试报告的具体编写目的,指出预期的读者范围。 简单介绍项目
2021-06-17 11:39:23
3698
原创 编译原理实验十:语义分析构造能处理完整程序的递归下降翻译器
实验要求【任务介绍】对递归下降分析器进行改造,使其能够一遍处理,同时完成语法分析和中间代码翻译。【输入】一个完整的源程序。【输出】与输入对应的一个四元式序列。【题目】对实验六的程序进行升级改造,使得程序对于输入的一个完整的源程序,在对其做递归下降分析的同时,生成等价的四元式序列,一遍完成。编程环境和语言编程语言:C++IDE:vs 2019实验原理分析实验六的文法如下:<Block> → { <Decls> <STMTS> } <Decls&g
2021-06-06 15:41:43
3103
2
原创 快速排序(Quick Sort)
快速排序(Quick Sort),简称快排,顾名思义,是一种效率很高的排序算法,由霍尔在1960年发明,也正因此,霍尔在20年后的1980年获得了图灵奖,而快排算法也在2000年被评为二十世纪对科学技术进步有巨大影响的十大算法之一!由此可见,快排的影响力之巨大!算法思想快排的思想便是,首先选取数组中的一个元素(一般取第一个元素)作为中轴,则剩下的元素若小于中轴元素,便放在中轴元素的左侧,若大于中轴元素,便放在中轴元素的右侧,然后将左右两侧的部分按照上述思想依次执行,直到分治到只剩下一个元素时停止。
2021-05-26 23:28:03
3155
原创 堆排序
对于一个满二叉树,若是按照层序遍历的顺序从1开始依次加上编号,则我们可以发现若一个节点的编号为n,则该节点的两个孩子的编号分别为2n、2n+1(若孩子节点存在)如上图所示,只有最左边的树是满二叉树,也只有最左边的树符合上述的性质。那么我们其实就可以将满二叉树转换为数组形式进行存储,若再加上一条性质:每个节点的值都要大于(或小于)孩子节点的值,则就可以进行堆排序了。思想详解以上图数组列表2、9、7、6、5、8为例,则首先从节点7开始,因为节点7只有一个节点且8大于7,所以进行交换,得到如下结果:
2021-05-22 20:24:57
138
原创 线索二叉树详解及代码实现
在二叉树的结点上加上线索的二叉树称为线索二叉树(Threaded BinaryTree),对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化,从而使得每个结点(除了第一个和最后一个结点以外)都有一个直接前驱和直接后继。原理ni表示度数为i的结点个数,很明显,i=0,1,2首先对于一个含有n个结点的二叉树,空指针的总数为2n0+n1,又因为n=n0+n1+n2=n1+2n2+1,从而得到n0=n2+1,因此空指针的总数为2n0+n1=n0+n
2021-05-14 11:38:38
765
1
原创 二叉树遍历之递归与非递归遍历
对于树结构,最重要的部分莫过于遍历,因为对于树的其他操作,都离不开遍历操作,而其中最典型的遍历,便是对二叉树的遍历,说到二叉树的遍历,我们首先想到的肯定是用递归实现的先序、中序和后序遍历,因为代码简洁明了,也很容易理解,但是众所周知,递归实现的代码效率肯定不高,因此在这里,除了介绍常用的递归实现之外,还将介绍非递归实现的方法。这里使用的是C++实现。准备工作首先这里使用的树结构如下所示,可以看到,这是一颗二叉排序树:相应的代码如下所示:typedef struct BiTNode { int
2021-05-13 15:45:25
1972
6
原创 合并排序(归并排序)
合并排序,大致思想便是先将数组中的元素拆分成若干小部分,然后再将这些小部分按照顺序进行重新组合,从而实现排序。很明显,这里用到了分治法的思想,即将一个大问题分成若干个相同的小问题,因为问题规模变小了,所以解决问题的难度也随之减小,试想一下,对一个拥有10000个元素的数组进行排序简单还是对一个只拥有1个元素的数组进行排序简单?答案很明显。对于合并排序,将大问题分成若干小问题是一件很容易的事情,只需要不断递归即可,其中最主要的难点就是将这些小问题解决之后,如何再将这些小问题合并起来,若是处理不好,很可能就导
2021-05-13 09:30:40
15666
5
原创 编译原理实验七:对完整程序的递归下降语法分析并构造语法树
【任务介绍】递归下降的语法分析。【输入】一个完整的源程序。【输出】语法树或者错误。【题目】设计一个程序,输入字符串形式的源程序,输出该程序的语法分析树,有错误时报告错误。要求:1.源语言及其语法规则:可以参照附录A,也可以自定义。2.输入为字符串形式的源程序,因此,需要调用前面实验做过的词法分析器,为语法分析器提供单词符号。3.应该指出错误的具体位置,如:在xx单词之后/之前发现错误,分析中止。编译环境和语言编程语言:C++IDE:vs 2019实验原理分析根据附录A提供的文法,结合我
2021-05-08 09:36:15
4601
3
原创 编译原理实验六:对多条执行语句的递归下降分析
【任务介绍】根据给定的上下文无关文法,对高级程序设计语言中常见的几种执行语句进行语法分析。【输入】一串执行语句,其中包括:赋值语句、选择语句和循环语句。【输出】与输入对应的一颗完整的语法树或者错误。【题目】设计一个程序,根据给定的上下文无关文法,对于输入的一串源程序语句,构造其对应的语法树或者报告错误。要求:1.基础文法以为开始符号:<Block> → { <Decls> <STMTS> } <Decls> → <Decls> <
2021-05-08 09:26:07
1856
原创 编译原理实验五:对算术表达式的递归下降分析
【任务介绍】根据给定的上下文无关文法,分析任意一个算术表达式的语法结构。【输入】任意的算术表达式。【输出】与输入对应的一颗语法树或者错误。【题目】设计一个程序,根据给定的上下文无关文法,构造一颗语法树来表达任意一个算术表达式的语法结构。要求:1.基础文法:<Expr> → <Term> <Expr1> <Expr1> → <AddOp> <Term> <Expr1> | empty <Term> →
2021-05-08 09:20:03
4695
7
原创 折半查找
折半查找(Binary Search)是一种减治思想的算法,即每次将问题的规模减半,以达到快速查找到目标元素的目的。因为对于一个有序数组而言(假设是非降序排列的),若数组中间的元素大于目标元素,则其后面的所有元素都是大于目标元素的,因此我们只需要在其前面的元素中查找即可;反之,若数组中间的元素小于目标元素,则其前面的元素都是小于目标元素的,因此我们只需要在其后面的元素中查找即可。当然,折半查找的前提是,所要查找的数组必须是有序的!!!否则不能使用折半查找。具体减治法的思想可以参考我的另一篇博文:《减治法
2021-04-24 23:43:04
721
1
原创 计算中值——如何快速找到一个数组的中值
在统计学中,中值往往比平均值更能体现一组数据的特点,因为不会被两边的极端数据影响。那么要找到一个无序数组的中值,可以先将数组中的数据排序,然后直接返回数组中间的数据即可,但是我们要想到,仅仅只是为了找到数组的中值,就对其进行排序,可想而知时间复杂度会很高,因此这就需要一个更好的算法来求出中值。算法原理首先我们可以想一想,如果已知一个数组的中值的位置为k且中值的值也已知,那么从数组的开头开始遍历,如果数组元素大于中值,那么去掉该元素之后,中值在数组中的位置依旧为k;若数组元素小于中值,那么去掉该元素之后
2021-04-24 23:42:05
10221
3
原创 插值查找——一个比折半查找更好的查找算法
我们熟知的查找算法应该就是折半查找了,而且这种算法的时间复杂度也还是比较低的,为O(logn)。但是我们还要考虑到在一些极端数组中查找数据,比如一个元素值在1~100的大型数组(如80个左右),那么若大部分的元素都是前50的,而只有少量的元素是50之后的,那么若查找的元素是50之后的,那么查找起来步骤就会比较多,因此这种算法还有待改进,于是就出现了插值查找算法。首先对于插值,学过数值分析的应该对这个名词不陌生,简单来说就是根据现有的几个点来构造函数,比如根据两个点就可以构造一条直线(两点确定一条直线),这
2021-04-24 23:39:29
581
原创 减治法
减治(decrease-and-conquer),顾名思义,就是将一个大的问题减小成若干个小问题,然后只需要解决其中的一个小问题,再建立起这个小问题与原来的大问题之间的联系即可,这与分治不同,分治是将一个大的问题减小成若干个小问题后,需要逐个解决这些小问题。减治法主要有3种变化形式:减常量减常因子减可变规模减常量减常量,即问题的规模每次都是减少一个常量,一般的,这个常量通常为1,如下即为减常量1的步骤:这种形式其实非常常见,如求一个数的阶乘、求斐波那契数列、求幂乘等都用到了减常量的思想,
2021-04-24 23:38:36
2374
原创 插入排序和希尔排序(shell sort)
对于排序算法,我们一开始都是学习的最简单暴力的算法,即冒泡排序和选择排序,这两个差不多,都是思想简单,实现起来也很简单,但就是时间复杂度非常高,无论是最优效率还是最差效率,复杂度都为O(n2)。这里我将详细介绍一下两种比较高级的排序算法——插入排序和希尔排序(shell sort)注:这里的排序算法默认都是非降序排列插入排序(insertion sort)插入排序是一种减治法的思想,并且是减治法中的减一技术。插入排序的主要思想就是假设前n-1个元素都已经是有序队列了,然后将第n个元素插入到有序队列
2021-04-19 23:23:23
399
原创 The import javax.annotation.Resource cannot be resolved Resource cannot be resolved to a type报错的解决方法
出现以上这种报错,那么首先需要看看你的jdk版本是不是最新的,我的版本是jdk15,如果是最新的(jdk11及以上),那么说明是你的jdk版本太高了,这里需要用jdk8才不会报错,因此接下来介绍jdk8的安装以及jdk的修改:jdk8的下载下载地址为:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html然后直接划到最下面:这里我下载的是x64版本的,即第二个。当然,点击下载的时候,会弹出一个界面,
2021-04-14 10:15:44
5270
2
原创 eclipse+MySQL+tomcat配置数据库连接池
数据库连接池的作用首先,我们来说说为什么要建立数据库连接池,以及数据库连接池的作用。作用:当一个连接通道使用完后,系统并不会将其释放,而是将它存储在连接池里。下次需要使用连接通道的时候,系统会判断连接池里是否有空闲的连接通道对象。如果有,设置其连接字符串,修改其连接状态,重新使用。这样能在很大程度上减少实例化的次数,节省了内存和时间,提升了效率。 要知道,创建一个对象需要做3件事:开辟堆空间,调用构造函数,返回地址。而这些行为是很消耗性能的。从上面所说的作用,我们可以马上发现数据库连接
2021-04-12 23:13:47
3465
2
原创 DFS(深度优先搜索)的递归与非递归
DFS,depth-first search,深度优先搜索。顾名思义,从一个节点出发,尽可能往下遍历,即尽可能离“家”远一点,这个思想其实就是树结构遍历中的先序遍历。那么从上述话语中,我们可以很容易地判断出需要用到递归,其实DFS的常规构造方法也就是用到递归的,但是我们还要考虑到一个问题,那么就是如果一个图足够大,比如有上万个节点,上万条边,那么估计用递归运行DFS我们的电脑会瞬间卡死。。。因为递归的代价实在是太大了,图如果小一点还好,不是特别明显,一旦图过大,递归的劣势会被无限放大,因此这里除了用递归来
2021-04-11 11:35:19
12184
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人