5-7章节复习总结

软件工程

选择题10分

软件工程概述

软件工程生命周期:

  • 可行性分析与项目开发计划:主要确定软件的开发目标及其可行性。
  • 需求分析:确定软件系统的功能、性能、数据和界面等要求,从而确定系统的逻辑模型,该阶段产生的主要文档有软件需求说明书。
  • 概要设计:概要设计就是设计软件的结构,明确软件由哪些模块组成,这些模块的层次结构、调用关系、功能是什么样的。设计该项目总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结构,它们之间有
    什么关系。该阶段产生的主要文档有概要设计说明书。
  • 详细设计:详细设计阶段的主要任务是把功能描述转变为精确的、结构化的过程描述。即该模块的控制结构是怎样的,先做什么,后做什么,有什么样的条件判定,有些什么重复处理等,并用相应的表示工具把这些控制结构表示出来。该阶段产生的主要文档有详细设计文档。
  • 编码:编码阶段就是把每个模块的控制结构转换成计算机可接受的程序代码
  • 测试:测试是保证软件质量,该阶段产生的主要文档有软件测试计划、测试用例和软件测试报告。
  • 维护:软件维护是软件生存周期中时间最长的阶段。

能力成熟度模型(CMM)

能力等级特点关键过程区域
初始级软件过程的特点是杂乱无章,有时甚至很混乱,几乎没有明确定义的步骤,项目的成功完全依赖个人的努力和英雄式核心人物的作用。
可重复级建立了基本的项目管理过程和实践来跟踪项目费用、进度和功能特性,有必要的过程准则来重复以前在同类项目中的成功软件配置管理、软件质量保证、软件子合同管理、软件项目跟踪与监督、软件项目策划、软件需求管理
已定义级管理和工程两方面的软件过程已经文档化、标准化,并综合成整个软件开发组织的标准软件过程。所有项目都采用根据实际情况修改后得到的标准软件过程来发和维护软件。同行评审、组间协调、软件产品工程、集成软件管理、培训大纲、组织过程定义、组织过程集点
已管理级制定了软件过程和产品质量的详细度量标准。对软件过程和产品质量有定量的理解和控制。软件质量管理和定量过程管理
优化级加强了定量分析,通过来自过程质量反馈和来自新观念、新技术的反馈使过程能不断持续地改进过程更改管理、技术改革管理和缺陷预防

能力成熟度模型集成(CMMI)

能力等级特点关键过程区域
初始级过程不可预测且缺乏控制
已管理级过程为项目服务需求管理、项目计划、配置管理、项目监督与控制、供应商合同管理、度量和分析、过程和产品质量保证
已定义级过程为组织服务需求开发、技术解决方案、产品集成、验证、确认组织级过程焦点、组织级过程定义、组织级培训、集成项目管理、风险管理、集成化的团队、决策分析和解决方案、组织级集成环境
定量管理过程已度量和控制组织过程性能、定量项目管理
优化级集中于过程改进和优化组织级改革与实施、因果分析和解决方案

软件过程模型

软件过程模型习惯上也称为软件开发模型,它是软件开发全部过程、活动和任务的结构框架

  • 瀑布模型
  • V模型
  • 增量模型
  • 演化模型(原型模型、螺旋模型)
  • 喷泉模型
  • 基于构件的开发模型
  • 形式化方法模型等
  • 统一过程模型(RUP)
  • 敏捷开发方法

瀑布模型

在这里插入图片描述
瀑布模型:将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护。它规定了由前至后、相互衔接的固定次序,如同瀑布流水逐级下落

瀑布模型特点:

  • 从上一项开发活动接受该项活动的工作对象作为输入。
  • 以**文档作为驱动、适合于软件需求很明确的软件项目的模型。
  • 每个阶段都需要对该项活动的实施工作成果进行评审**。若其工作成果得到确认,则继续进行下一项开发活动;否则返回前一项,甚至更前项的活动。
  • 在瀑布模型中,需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,开发费用超出预算。

V模型

在这里插入图片描述
V模型:V模型描述了质量保证活动和沟通、建模相关活动以及早期构建相关的活动之间的关系。V模型提供了一种将验证确认活动应用于早期软件工程工作中的方法。

V模型特点:

  • 单元测试的主要目的是针对编码过程中可能存在的各种错误;
  • 集成测试的主要目的是针对详细设计中可能存在的问题;
  • 系统测试主要针对概要设计,检查系统作为一个整体是否有效地得到运行;
  • 验收测试通常由业务专家或者用户进行,以确认产品能真正符合用
    户业务上的需要。
  • V模型适用于需求明确和需求变更不频繁的情形

增量模型

在这里插入图片描述
增量模型:增量模型将需求分段为一系列增量产品,每一增量可以分别开发。该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的“增量”,第1个增量往往是核心的产品。客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品

增量模型特点:

  • 由于并不是从系统整体角度规划各个模块,因此不利于模块划分,难点在于如何将客户需求划分为多个增量
  • 与原型不用的是增量模型的每一次增量版本都可作为独立可操作的作品,而原型的构造一般是为了演示
  • 第一个可交付版本所需要的成本和时间很少
  • 开发由增量表示的小系统所承担的风险不大
  • 由于很快发布了第一个版本,因此可以减少用户需求的变更

演化模型之原型模型

在这里插入图片描述
原型模型:

  • 演化模型是迭代的过程模型,使得软件开发人员能够逐步开发出更完整的软件版本。典型的演化模型有原型模型和螺旋模型等。
  • 原型模型开始于沟通,其目的是定义软件的总体目标,标识需求,然后快速制订原型开发的计划,并构建原型。交付给客户使用,并收集客户的反馈意见,这些反馈意见可在下一轮中对原型进行改进。

原型模型特点:

  • 原型不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型;
  • 原型方法比较适合于用户需求不清、需求经常变化的情况
  • 构造方便、快速,造价低。对用户的需求是动态响应、逐步纳入的,不适合大型项目

演化模型之螺旋模型

在这里插入图片描述
螺旋模型:

  • 螺旋模型是一个演化软件过程模型,将原型实现的迭代特征与线性顺序(瀑布)模型中控制的和系统化的方面结合起来。在螺旋模型中,软件开发是一系列的增量发布。
  • 开发过程具有周期性重复的螺旋线状。四个象限分别标志每个周期所划分的四阶段:制订计划、风险分析、实施工程和客户评估

螺旋模型特点:

  • 螺旋模型强调了风险分析,特别适用于庞大而复杂的、高风险的系统
  • 需要开发人员具有相当丰富的风险评估经验和专门知识过多的迭代次数会增加开发成本,延迟提交时间。

统一过程模型

统一过程模型(RUP):是一种“用例和风险驱动,以架构为中心,迭代并且增量”的开发过程,由UML方法和工具支持。每次选代中,只考虑系统的一部分需求,进行分析、设计、实现、测试和部署等过程;每次迭代是在己完成部分的基础上进行的,每次增加一些新的功能实现,以此进行下去,直至最后项目的完成,每次迭代都包含正常软件项目的所有元素:计划、分析和设计、构造、集成和测试。

RUP把软件开发生命周期划分为多个循环,每个循环生成产品的一个新的版本,每个循环依次由4个连续的阶段组成,每个阶段完成确定的任务。这4个阶段如下:

  • 初始阶段:定义最终产品视图和业务模型,并确定系统范围。
  • 精化阶段:设计及确定系统的体系结构,制订工作计划及资源要求。
  • 构造阶段:构造产品并继续演进需求、体系结构、计划直至产品提交。
  • 移交阶段:把产品提交给用户使用。

敏捷开发

敏捷开发方法:

  • 敏捷开发的总体目标是通过“尽可能早地、持续地对有价值的软件的交付”使客户满意。通过在软件开发过程中加入灵活性,敏捷方法使用户能够在开发周期的后期增加或改变需求
  • 敏捷过程的典型方法有很多,实现了敏捷方法所宣称的理念就称之为敏捷宣言。
  • 敏捷宣言:个体和交互胜过过程和工具、可以工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、响应变化胜过遵循计划

核心思想:

  • 敏捷方法是适应型,而非可预测型
  • 敏捷方法是以人为本,而非以过程为本
  • 以原型开发思想为基础,采用增量式开发,发行版本小型化。
基本原则

在这里插入图片描述

  • 极限编程(XP):XP是一种轻量级(敏捷)、高效、低风险、柔性、可预测的、科学的软件开发方式。它由价值观、原则、实践和行为4个部分组成,彼此相互依赖、关联,并通过行为贯穿于整个生存周期。
  • 水晶系列方法:与XP方法一样,都有以人为中心的理念,但在实践上有所不同。其目的是发展一种提倡“机动性的”方法,包含具有共性的核心元素,每个都含有独特的角色、过程模式、工作产品和实践
  • 并列争球法(Scrum):是一种迭代的增量化过程,把每段时间(如30天)一次的迭代称为个“冲刺”(Sprint),并按需求的优先级别来实现产品,多个自组织和自治的小组并行地递增实现产品。
  • 特性驱动开发方法(FDD):是一个迭代的开发模型。认为有效的软件开发需要3个要素:人、过程和技术。有5个核心过程:开发整体对象模型、构造特征列表、计划特征开发、特征设计和特征构建

练习题

【2022】以下关于快速原型模型优点的叙述中,不正确的是(29)。
A.有助于满足用户的真实需求
B.适用于大型软件系统的开发
C.开发人员快速开发出原型系统,因此可以加速软件开发过程,节约开发成本
D.原型系统已经通过与用户的交互得到验证,因此对应的规格说明文档能正确描述用户需求

答案B

【2023】以下敏捷开发方法中,()使用迭代的方法,把一段短的时间(如30天)的迭代称为一个冲刺,并按照需求优先级来实现产品。
A. 极限编程(XP)
B. 水晶法(Crystal)
C. 并列争球法(Scrum)
D. 自适应软件开发(ASD)

答案C

软件生命周期

需求分析

软件需求:指用户对系统在功能、行为、性能、设计约束等方面的期望。是指用户解决问题或达到目标所需的条件或能力,是系统或系统部件要满足合同、标准、规范或其他正式规定文档所需具有的条件或能力,以及反映这些条件或能力的文档说明

需求分类:

  • 书本上的分类:功能需求、性能需求、环境需求、界面需求、文档需求、数据需求、资源使用需求、安全保密要求、可靠性要求、成本消耗和开发进度需求、其他非功能性需求
  • 常见的分类:
    • 业务需求:企业或客户对系统高层次的目标要求
    • 用户需求:描述的是用户的具体目标,或用户要求系统必须能完成的任务。即描述了用户能使用系统来做什么
    • 系统需求:从系统的角度来说明软件的需求,包括功能需求、非功能需求和设计约束等
过程

在这里插入图片描述

获取方法

常见的需求获取法包括:

  • 用户访谈:1对1-3,找有代表性的用户进行访谈,对提问者的水平是有要求的。其形式包括结构化(有剧本)和非结构化(随意发挥)两种。
  • 问卷调查:用户多,无法 – 访谈,收集到的需求不够精准,比较杂乱,比较考验问卷编写者的水平
  • 采样:从种群中系统地选出有代表性的样本集的过程,类似于数学中的数理统计。样本数量=0.25*(可信度因子/错误率)2
  • 情节串联板:一系列图片,通过这些图片来把需求给进行叙述出来,这样虽然生动,但是耗时
  • 联合需求计划(JRP):通过联合各个关键用户代表、系统分析师、开发团队代表一起,通过有组织的会议来讨论需求。
  • 需求记录技术:任务卡片、场景说明、用户故事、Volere白卡

系统设计

系统设计:

  • 在分析阶段,我们已经搞清楚了软件要做什么并通过需求规格说明书进行了描述,在设计阶段,就是要把软件“做什么”的逻辑模型转换成“怎么做”的物理模型,即着手实现软件系统的需求。
  • 系统设计的主要目的就是为系统制定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理地使用各种资源,最终勾画出新系统的详细设计方案
  • 系统设计的主要内容包括总体结构设计、代码设计、输出设计、输入设计、处理过程设计、数据存储设计、用户界面设计和安全控制设计等
  • 常用的设计方法有面向数据流的结构化设计方法(SD)和面向对象的分析方法(OOD)。
  • 系统设计的基本任务大体上可以分为概要设计和详细设计两个步骤。
概要设计
  1. 系统总体结构设计:基本任务是采用某种设计方法,将一个复杂的系统按功能划分成模块、确定每个模块的功能、确定模块之间的调用关系、确定模块之间的接口,即模块之间传递的信息、评价模块结构的质量。
  2. 数据结构及数据库设计
    • 数据结构的设计
    • 数据库的设计
  3. 编写概要设计文档:主要有概要设计说明书、数据库设计说明书、用户手册以及修订测试计划。
  4. 评审:对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方法的可行性,关键的处理及内外部接口定义的正确性、有效性、各部分之间的一致性等都-一进行评审。
详细设计
  1. 对每个模块进行详细的算法设计,用某种图形、表格和语言等工具将每个模块处理过程的详细算法描述出来。(流程图、IPO图、N-S图、PAD图)
  2. 对模块内的数据结构进行设计。
  3. 对数据库进行物理设计,即确定数据库的物理结构。
  4. 其他设计。根据软件系统的类型,还可能要进行以下设计。
    • 代码设计
    • 输入输出格式设计
    • 用户界面设计
  5. 编写详细设计说明书。
  6. 评审。
程序流程图、IPO图、N-S图、PAD图
  • 程序流程图(Program Flow Diagram,PFD):用一些图框表示各种操作,它独立于任何一种程序设计语言,比较直观、清晰,易于学习掌握。任何复杂的程序流程图都应该由顺序、选择和循环结构组合或嵌套而成。
    在这里插入图片描述

  • IPO图:也是流程描述工具,用来描述构成软件系统的每个模块的输入、输出和数据加工。结构化设计中的数据流图就是一种IPO图。

  • N-S图(盒图):比较容易表示嵌套和层次关系,并具有强烈的结构化特征。但是当问题很复杂时,N-S图可能很大,因此不适合于复杂程序的设计。
    在这里插入图片描述

  • 问题分析图(PAD):是一种支持结构化程序设计的图形工具。PAD具有清晰的逻辑结构、标准化的图形等优点,更重要的是,它引导设计人员使用结构化程序设计方法,从而提高程序的质量。
    在这里插入图片描述

练习题

【2021年】信息系统的文档是开发人员与用户交流的工具。在系统规划和系统分析阶段,用户与系统分析人员交流所使用的文档不包括(33)。
A.可行性研究报告
B.总体规划报告
C.项目开发计划
D.用户使用手册

答案D

【2022年】文档是软件的重要因素,关于高质量文档,以下说法不正确的是(34)。
A.不论项目规模和复杂程度如何,都要用统一的标准指定相同类型和相同要素的文档
B.应该分清读者对象
C.应当是完整的、独立的、自成体系的
D.行文应十分确切,不出现多义性描述

答案A

系统测试

系统测试:为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。
测试原则:

  • 应尽早并不断的进行测试,比如V模型,从设计的时候就开始测试;
  • 测试工作应该避免由原开发软件的人或小组承担;
  • 在设计测试方案时,不仅要确定输入数据,而且要根据系统功能确定预期的输出结果;
  • 既包含有效、合理的测试用例,也包含不合理、失效的用例;
  • 检验程序是否做了该做的事,且是否做了不该做的事;
  • 严格按照测试计划进行;
  • 妥善保存测试计划和测试用例;
  • 测试用例可以重复使用或追加测试。

软件测试方法可分为静态测试动态测试

静态测试

静态测试:指被测试程序不在机器上运行,而采用人工检测和计算机辅助静态分析的手段对程序进行检测,包括对文档的静态测试和对代码的静态测试。包括桌前检查、代码审查、代码走查的方式。使用这
种方法能够有效地发现30%-70%的逻辑设计和编码错误。

  • 桌前检查:在你自己编写代码后,你会进行桌前检查,这意味着你会仔细查看你的代码,以捕捉可能的错误、逻辑问题或风格不一致之类的问题。这是一种个人层面的检查,有助于在代码提交前修复问题。
  • 代码审查:代码审查是团队中的成员一起对某个人编写的代码进行检查。通过代码审查,团队可以共同评估代码的质量,发现潜在的问题,并确保代码符合团队的标准和最佳实践。这有助于提高代码的稳定性和可维护性。
  • 代码走查:代码走查是一种更广泛的审查实践,通常包括团队的开发人员、测试人员和其他相关人员。在代码走查过
    程中,团队会深入检查代码的各个方面,包括逻辑、性能、安全性等。目标是确保代码在整体上是健壮、高效且符合预期要求的。
动态测试

动态测试:指在计算机上实际运行程序进行软件测试,一般采用白盒测试和黑盒测试方法(还有灰盒和自动化)。

  • 黑盒测试:黑盒测试关注于测试软件的功能(功能性测试),而不考虑内部实现细节。测试人员不需要知道代码的具体结构,而是根据软件的需求规格和功能来设计测试用例。这种方法类似于将测试人员置于一个“盒子”外,只观察软件的输入和输出,以确定是否按预期工作。
    • 举例:假设你正在测试一个在线登录系统。对于黑盒测试,你会设计测试用例,包括输入不同的用户名和密码组合,然后观察系统的响应,验证是否成功登录、失败登录是否有适当的错误提示等,而不考虑系统内部的代码结构。
  • 白盒测试:白盒测试关注于测试软件的内部逻辑和代码结构(结构性测试),以确保代码按照预期方式执行。测试人员需要了解软件的代码,以设计测试用例,以覆盖不同的代码路径和分支情况,以及验证代码是否满足质量标准和最佳实践。
    • 举例:假设你正在测试一个计算器应用。对于白盒测试,你会检查代码,确保加法、减法、乘法和除法等操作都正确实现。你可能会编写测试用例,测试各种输入情况,例如测试正数、负数、小数等,以确保代码在不同情况下都能正确执行。
测试步骤
  1. 单元测试:
    • 也称为模块测试、算法测试。
    • 测试的对象是可独立编译或汇编的程序模块、软件构件或OO软件中的类(统称为模块)。
    • 测试依据是软件详细设计说明书。
    • 侧重于测试模块中的内部逻辑和数据结构。
    • 一般会采用白盒测试。
  2. 集成测试:
    • 目的是检查模块之间,以及模块和已集成的软件之间的接口关系,并验证已集成的软件是否符合设计要求。
    • 测试依据是软件概要设计文档。
  3. 系统测试:
  • 测试对象是完整的、集成的计算机系统;
  • 测试的目的是在真实系统工作环境下,验证完成的软件配置项能否和系统正确连接,并满足系统/子系统设计文档和软件开发合同规定的要求。
  • 测试依据是用户需求或开发合同。
  • 主要内容包括功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、安装与反安装测试等,其中,最重要的工作是进行功能测试与性能测试。
    • 功能测试主要采用黑盒测试方法;
    • 性能测试主要指标有响应时间、吞吐量、并发用户数和资源利用率等。
  • 系统测试通常由独立的测试团队执行,他们并不直接参与软件的开发过程。
  1. 确认测试:
  • 主要用于验证软件的功能、性能和其他特性是否与用户需求一致。
  • 测试依据是需求文档,确认测试是软件或产品开发的最后一个阶段,在系统测试完成后进行。
  • 主要目标是确保软件或产品已经满足最终用户的期望和需求。
  • 在确认测试中,最终用户(或其代表)将根据他们的实际使用情境,验证软件是否符合他们的业务流程和预期目标根据用户的参与程度,通常包括以下类型:
    • 内部确认测试:主要由软件开发组织内部按照SRS进行测试。
    • Alpha测试:用户在开发环境下进行测试。
    • Beta测试:用户在实际使用环境下进行测试,通过改测试后,产品才能交付用户。
    • 验收测试:针对SRS,在交付前以用户为主进行的测试。其测试对象为完整的、集成的计算机系统。验收测试的目的是,在真实的用户工作环境下,检验软件系统是否满足开发技术合同或SRS。验收测试的结论是用户确定是否接收该软件的主要依据。除应满足一般测试的准入条件外,在进行验收测试之前,应确认被测软件系统已通过系统测试。
  1. 回归测试
    • 测试目的是测试软件变更之后,变更部分的正确性和对变更需求的符合性,以及软件原有的、正确的功能、性能和其他规定的要求的不损害性(不能把其他好的模块改错)。
测试方法
黑盒测试

在这里插入图片描述
黑盒测试:将程序看做一个黑盒子,只知道输入输出,不知道内部代码,由此设计出测试用例,分为下面几类:

  • 等价类划分:一种常用的黑盒测试技术,用于减少测试用例的数量,同时保证测试覆盖到尽可能多的情况。它通过将输入数据分为若干个等价类,认为每个等价类中的所有数据对系统的行为应该是等效的。这样,只需为每个等价类选择一个代表性的测试用例,而不是测试所有可能的输入。
  • 边界值划分:将每类的边界值作为测试用例,边界值一般为范围的两端值以及在此范围之外的与此范围间隔最小的两个值,如年龄范围为0-150,边界值为0,150,-1,151四个。
  • 错误推测:没有固定的方法,凭经验而言,来推测有可能产生问题的地方,作为测试用例进行测试。
  • 因果图:由一个结果来反推原因的方法,从自然语言描述的程序规
    格说明中找出因(输入条件)和果(输出或程序状态的改变),通过因果图转换为判定表。

等价类划分举例:假设我们要测试一个登录功能,该功能要求用户输入用户名和密码。用户名必须是5到15个字符的字母,密码必须是8到20个字符的字母和数字组合。

  • 步骤1:识别输入条件
    • 用户名
    • 密码
  • 步骤2:划分等价类
    • 用户名有效等价类:
    • 用户名长度在5到15个字符之间,且全部是字母(如:Alice,Bob12345).
      • 用户名无效等价类:
      • 用户名长度少于5个字符(例如:Bob).
      • 用户名长度超过15个字符(例如:SuperLongUserName123).
      • 用户名包含非字母字符(例如:Alice!,Bob123).
    • 密码有效等价类:
      • 密码长度在8到20个字符之间,且是字母和数字的组合(如:Password123,Secure987)。
    • 密码无效等价类:
      • 密码长度少于8个字符(例如:Pass1).
      • 密码长度超过20个字符(例如:ThislsAVeryLongPassword12345).
      • 密码只包含字母(例如:Password).
      • 密码只包含数字(例如:12345678).
      • 密码包含特殊字符(例如:Pass@word123).
  • 步骤3:选择代表性用例:根据以上划分的等价类,我们选择每个类中的一个或多个代表性用例进行测试。
白盒测试

白盒测试:知道程序的代码逻辑,按照程序的代码语句,来设计覆盖代码分支的测试用例,覆盖级别从低至高分为下面几种:

  • 语句覆盖SC:逻辑代码中的所有语句都要被执行一遍,覆盖层级最低,因为执行了所有的语句,不代表执行了所有的条件判断。即下图的矩形框c和e覆盖到即可

  • 判定覆盖DC:逻辑代码中的所有判断语句的条件的真假分支都要覆盖一次。即下图的菱形框a和b真假分支都要覆盖
    在这里插入图片描述

  • 条件覆盖CC:针对每一个判断条件内(比如一个if)的每一个独立条件(if中的每个判定条件)都要执行一遍真和假。例如菱形框a有两个条件,需要两个条件的真假都要覆盖

  • 条件判定组合覆盖CDC:同时满足判定覆盖和条件覆盖。
    在这里插入图片描述

  • 路径覆盖:逻辑代码中的所有可行路径都覆盖了,覆盖层级最高。
    在这里插入图片描述

练习题

【2022】白盒测试技术的各种覆盖方法中,(33)具有最弱的错误发现能力。
A.判定覆盖
B.语句覆盖
C.条件覆盖
D.路径覆盖

答案B

【2022】针对月收入小于等于3500元免征个人所得税的需求,现分别输入3499,3500和3501进行测试,则采用的测试方法(16)。
A、判定覆盖
B、边界值分析
C、路径覆盖
D、因果图

答案B

【2023】对采用面向对象方法开发的系统进行测试时,通常从不同层次进行测试。测试类中定义的每个方法属于()层。
A. 算法
B. 类
C. 模板
D. 系统

答案B

运行与维护

系统转换

系统转换是指新系统开发完毕,投入运行,取代现有系统的过程,需要考虑多方面的问题,以实现与老系统的交接,有以下三种转换计划:

  • 直接转换:现有系统被新系统直接取代了,风险很大,适用于新系统不复杂,或者现有系统已经不能使用的情况。优点是节省成本,只适合小系统。
  • 并行转换:新系统和老系统并行工作一段时间,新系统经过试运行后再取代,若新系统在试运行过程中有问题也不影响现有系统的运行,风险极小,在试运行过程中还可以比较新老系统的性能,适用于大型系统。缺点是耗费人力和时间资源,难以控制两个系统间的数据转换。
  • 分段转换:分期分批逐步转换,是直接和并行转换的集合,将大型系统分为多个子系统,依次试运行每个子系统,成熟一个子系统,就转换一个子系统。同样适用于大型项目,只是更耗时,而且现有系统和新系统间混合使用,需要协调好接口等问题。

数据转换与迁移:将数据从旧数据库迁移到新数据库中。有三种方法:系统切换前通过工具迁移、系统切换前采用手工录入、系统切换后通过新系统生成

系统维护

系统维护是整个系统开发过程中耗时最长的,系统的可维护性可以定义为维护人员理解、改正、改动和改进这个软件的难易程度,其评价指标如下:

  • 易分析性。软件产品诊断软件中的缺陷或失效原因或识别待修改部分的能力。
  • 易改变性。软件产品使指定的修改可以被实现的能力,实现包括编码、设计和文档的更改。
  • 稳定性。软件产品避免由于软件修改而造成意外结果的能力。
  • 易测试性。软件产品使已修改软件能被确认的能力。

系统维护包括硬件维护、软件维护和数据维护,其中软件维护类型如下:

  • 正确性维护:发现了bug而进行的修改。
  • 适应性维护:由于外部环境发生了改变,被动进行的对软件的修改和升级。
  • 完善性维护:基于用户主动对软件提出更多的需求,修改软件,增加更多的功能,使其比之前的软件功能、性能更高,更加完善。
  • 预防性维护:对未来可能发生的问题进行预防性的修改。
练习题

【2021年】系统可维护性是指维护人员理解、改正、改动和改进软件系统的难易程度,其评价指标不包括(36)。
A.可理解性
B.可测试性
C.可修改性
D.一致性

答案D

【2022年】软件交付给用户之后进入维护阶段,根据维护具体内容的不同将维护分为不同的类型其中“采用专用的程序模块对文件或数据中的记录进行增加、修改和删除等操作”的维护属于()。
A.程序维护
B.数据维护
C.代码维护
D.设备维护

答案B

【2023年】在软件系统交付给用户使用后,为了使用户界面更友好,对系统的图形输出进行改进,该行为属于()维护。
A.改正性
B.适应性
C.改善性
D.预防性

答案C

项目管理

软件项目估算方法主要分为成本估算法、COCOMO模型、COCOMO模型Ⅱ和outnam模型成本估算方法:

  • 自顶向下估算:又称类比估算法,确定一个总金额,再向下分摊到每一个功能点。
  • 自底向上估算:从底层功能点开始估算成本,向上累加。
  • 差别估算法:与以前项目比较,找出不同点重新估算,相同点则直接估算。
  • 其他估算法之专家估算:聘请专家以其经验对项目整体费用进行估算。

COCOMO模型:常见的软件规模估算方法。常用的代码行分析方法作为其中一种度量估计单位,以代码行数估算出每个程序员工作量,累加得软件成本。

COCOMOII模型:COCOMO的升级,也是以软件规模作为成本的主要因素,考虑多个成本驱动因子。

Putnam估算模型:一种动态多变量模型,假设在软件开发的整个生存周期中工作量有特定的分布

项目进度管理

软件项目进度管理的目的:确保软件项目在规定的时间内按期完成。

项目管理基本原则:划分、相互依赖、时间分配、工作量确认、确定责任、明确输出结果、确定里程碑

项目管理进度安排:为监控软件项目的进度计划和工作的实际进展情况,表示各项任务之间进度的相互依赖关系,需要采用图示的方法。

  • Gatt图:又称为横道图,横轴表示时间,纵轴表示活动,以时间顺序表示活动,能反应活动间的并行关系,但无法反应活动之间的依赖关系,因此也难以清晰的确定关键任务和关键路径
    在这里插入图片描述

  • PERT图:类似于前趋图,是有向图,反应活动之间的依赖关系,有向边上标注活动运行的时间,但无法反应活动之间的并行关系
    在这里插入图片描述

练习题

【2022年】下图是一个软件项目的活动图,其中顶点表示项目里程碑,连接顶点的边表示包含的活动,边上的数字表示完成该活动所需要的天数。则关键路径长度为(17)。若在实际项目进展中,在其他活动都能正常进行的前提下,活动(18)一旦延期就会影响项目的进度。
在这里插入图片描述
(17)
A.34
B.47
C.54
D.58
(18)
A.A→B
B.C→f
C.D→F
D.F→H

答案D B
关键路径:A->C->F->I->J

【2023年】下图是一个软件项目的活动图,其中顶点表示项目里程碑,连接顶点的边表示活动,则里程碑(17)在关键路径上,关键路径长度为(18)
在这里插入图片描述
(17)
A.B
B.E
C.G
D.I
(18)
A.15
B.17
C.19
D.23

答案B D
关键路径:A->C->E->H->J->K

软件配置管理

软件配置管理(SCM)的作用:为了减少在软件开发中因为需求变更所带来的混乱,以及让变更所产生的错误达到最小并且最有效地提高生产率。
基线:软件开发过程中特定的点,是项目生存期各开发阶段末尾的特定点,又称为里程碑,反应阶段性成果。
软件配置项:是软件工程中产生的信息项,是配置管理的基本单位,它包含了我们软件开发过程中的所有产出
物,主要包括六种类型:

  • 环境类:系统开发环境
  • 定义类:需求分析与系统定义阶段
  • 设计类:设计阶段
  • 编码类:编码及单元测试阶段
  • 测试类:系统测试完成后的工作
  • 维护类:维护阶段

即产品组成部分的工作成果+项目管理和机构支撑过程域产生的文档。

变更控制:变更控制是一项最重要的软件配置任务。软件开发过程中的每一次修改都要纳入变更,以防止版本混乱,需借助于配置数据库和基线的概念。

配置数据库

  • 开发库:专供开发人员使用,其中的信息可能做频繁修改,对其控制相当宽松
  • 受控库:在生存期某一阶段工作结束时发布的阶段产品,这些是与软件开发工作相关的计算机可读信息和人工可读信息。软件配置管理正是对受控库中的各个软件项进行管理,受控库也称为软件配置库
  • 产品库:在开发的软件产品完成系统测试后,作为最终产品存入产品库,等待交付用户或现场安装。

风险管理

软件风险两个特性:不确定性(可能发生也可能不发生),损失(发生会产生恶性后果)

软件风险分类:

  • 项目风险:威胁到项目计划,如果项目风险发生,有可能拖延项目的进度和增加项目的成本。比如管理上的风险、沟通上的风险、范围上的风险
  • 技术风险:威胁到要开发软件的质量和交付时间,如果技术风险发生,开发工作就变得很困难或者不可能,指设计、实现、接口、验证和维护等方面的潜在问题。
  • 商业风险:威胁到要开发软件的生存能力,包括下面五种:
    • 市场风险。开发了一个没有人真正需要的优良产品或系统。
    • 策略风险。开发的产品不再符合公司的整体商业策略。
    • 销售风险。开发了一个销售部门不知道如何去销售的产品。
    • 管理风险。由于重点的转移或人员的变动而失去了高级管理层的支持。
    • 预算风险。没有得到预算或人员的保证。
练习题

【2021年】在风险管理中,通常需要进行风险监测,其目的不包括(17)。
A.消除风险
B.评估所预测的风险是否发生
C.保证正确实施了风险缓解步骤
D.收集用于后续进行风险分析的信息

答案A

【2022年】以下关于风险管理的叙述中,不正确的是(19)。
A.承认风险是客观存在的,不可能完全避免
B.同时管理所有的风险
C.风险管理应该贯穿整个项目管理过程
D.风险计划本身可能会带来新的风险

答案B

软件质量

软件的质量特性

讨论软件质量首先要了解软件的质量特性,目前已经有多种软件质量模型来描述软件质量特性,例如ISO/EC9126软件质量模型和McCall软件质量模型
ISO/IEC9126软件质量模型:质量特性和子特性
在这里插入图片描述
McCll软件质量模型从软件产品的运行、修正和转移3个方面确定了11个质量特性
在这里插入图片描述

练习题

【2019年】在ISO/IEC9126软件质量模型中,软件质量特性()包含质量子特性安全性。
A.功能性
B.可靠性
C效率
D.可维护性

答案A

【2018年】在ISO/IEC9126软件质量模型中,可靠性质量特性是指在规定的一段时间内和规定的条件下,软件维持在其性能水平有关的能力,其质量子特性不包括()。
A.安全性
B.成熟性
C.容错性
D.易恢复性

答案A

【2021年】在ISO/IEC软件质量模型中,可移植性是指与软件可从某环境移到另一环境的能力有关的一组属性,其子特性不包括()。
A.适应性
B.易测试性
C.易安装性
D.易替换性

答案B

软件评审

提高软件质量和可靠性的技术大致可分为两类:

  • 避开错误,即在开发的过程中不让差错潜入软件的技术
  • 容错技术,即对某些无法避开的差错,使其影响减至最小的技术
    软件容错技术:容错就是软件遇到错误的处理能力,实现容错的手段主要是冗余,冗余是指对于实现系统规定功能是多余的那部分资源,包括硬件、软件、信息和时间。由于加入了这些资源,有可能使系统的可靠性
    得到较大的提高,包括四种冗余技术:
  • 结构冗余
  • 信息冗余
  • 时间冗余
  • 冗余附加技术

软件容错技术

结构冗余:结构冗余是通过在系统中添加额外的硬件或软件组件来提高系统的可靠性和容错能力。这种冗余可以分为静态、动态和混合冗余三种类型。

  • 静态冗余:静态冗余是指在系统中添加多个相同的组件,通过表决和比较来选择正确的输出。例如,在航空航天领域中,多个发动机可以通过表决和比较来确保系统的可靠性。
  • 动态冗余:动态冗余是指在系统中添加多个相同的组件,但是只有一个组件在工作,其他组件处于待机状态。当工作
    组件发生故障时,备用组件会立即接管工作。例如,在服务器领域中,多个硬盘可以通过RAD技术实现动态冗余,以提高数据的可靠性。
  • 混合冗余:混合冗余是指将静态和动态冗余技术结合起来使用,以提高系统的可靠性和容错能力。例如,在核电站中,反应堆控制系统可以采用混合冗余技术,以确保系统的可靠性。

软件度量

软件度量用于对产品及开发产品的过程进行度量,软件的两种属性:

  • 外部属性:指面向管理者和用户的属性,可直接测量,一般为性能指标,比如成本、效益、开发人员的生产率。
  • 内部属性:指软件产品本身的的属性,如可靠性、可维护性等,只能间接测量。

软件度量有两种分类方法:

  • 第一种分类:将软件度量分为面向规模的度量、面向功能的度量和面向人的度量
  • 第二种分类:将软件度量分为生产率度量、质量度量和技术度量

软件复杂度的度量方法:McCabe度量法:又称为环路复杂度

  • 假设有向图中有向边数为m,节点数为n,则此有向图的环路复杂度为m-n+2
  • 封闭空间数量+1
  • 判断数量+1

练习题

【2023】以下流程图中,至少需要(34)个测试用例才能覆盖所有路径。采用McCabe方法计算程序复杂度为(35)
在这里插入图片描述

(34)
A.3
B.4
C.5
D.6
(35)
A.2
B.3
C.4
D.5

答案B B

软件工具与开发环境

软件工具

软件工具:用来辅助软件开发、运行、维护、管理和支持等过程中的活动的软件称为软件工具
软件工具的分类:

  • 软件开发工具:需求分析工具、设计工具、编码与排错工具、测试工具等。
  • 软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工程工具。
  • 软件管理和软件支持工具:项目管理工具、配置管理工具、软件评价工具、软件开发工具的评价和选择

软件开发环境:支持软件产品开发的软件系统,它由软件工具集和环境集成机制构成。

环境集成

环境集成机制分类:

  • 数据集成:为各种相互协作的工具提供统一的数据模式和数据接口规范,以实现不同工具之间的数据交换。
  • 界面集成:指环境中的工具的界面使用统一的风格,采用相同的交互方法,提供一种相似的视感效果,这样可以减少用户学习不同工具的开销。
  • 控制集成:用于支持环境中各个工具或开发活动之间的通信、切换、调度和协同工作,并支持软件开发过程的描述执行与转换。

面向对象

面向对象基本概念

对象:基本的运行实体,为类的实例,封装了数据和行为的整体,如学生、汽车等真实存在的实体。对象具有清晰的边界、良好定义的行为和可扩展性。

消息:对象之间进行通信的一种构造称为消息。

类:是对象的抽象,定义了一组大体相似的对象结构,定义了数据和行为。包括实体类(用于对必须存储的信息和相关行为建模的类,是需要长久保存且一直存在的类)、边界类(系统内部与系统外部的业务主角之间进行交互建模的类)、控制类(用于对一个或几个用例所特有的控制行为进行建模,在用例执行过
程中被动出现的特定行为的类)。在领域类模型中会涉及描述类自身情况的属性与操作,还会有描述类与类之间的关联,但不会有对象层次的内容。

继承:父类和子类之间共享数据和方法的机制。是类之间的一种关系。

多态:不同的对象收到同一个消息时产生完全不同的反应。包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。多态由继承机制支持。

覆盖(重写):子类在原有父类接口的基础上,用适合于自己要求的实现去置换父类中的相应实现。即在子类中重定义一个与父类同名同参的方法。

重载:与覆盖要区分开,函数重载与子类父类无关,且函数是同名不同参数。

封装:一种信息隐蔽技术,其目的是使对象的使用者和生产者分离,也就是使其他开发人员无需了解所要使用的软件组件内部的工作机制,只需知道如何使用组件。

静态类型是指一个对象的类型在编译时就确定;动态类型指对象类型在运行时才能确定。

静态绑定(静态分配)是基于静态类型的,在程序执行前方法已经被绑定:
动态绑定是基于动态类型的,运行时根据变量实际引用的对象类型决定调用哪个方法,动态绑定支持多态。

面向对象分析

面向对象分析:是为了确定问题域,理解问题。

包含五个活动:认定对象(按自然存在的实体确定对象)、组织对象(分析对象关系,抽象成类)、对象间的相互作用(描述各对象在应用系统中的关系)、确定对象的操作(操作,如创建增加删除等)、定义对象的内部信息(属性)
面向对象设计:是设计分析模型和实现相应源代码,在目标代码环境中这种源代码可被执行。设计问题域的解决方案。
面向对象程序设计:用面向对象程序设计语言实现设计方案。详见案例分析部分。
面向对象测试:与普通测试步骤并无不同。可分为四个层次:

  • 算法层(测试类中定义的每个方法,类似单元测试)
  • 类层(测试同一个类中所有方法与属性的相互作用,特有的模块测试
  • 模板层(测试一组协同工作的类之间的相互作用,类似集成测试)
  • 系统层(类似系统测试)

面向对象设计原则

()单一责任原则:是让一个类只做一件事情,不要把太多的任务放在一个类里。这样做的好处是,当你需要修改某个功能时,只需要关注一个类,而不用担心影响其他功能。

(2)开放封闭原侧:意味着你可以扩展现有的代码,但不需要修改已有的代码。你应该允许新功能的添加,而不会影响到已经运行良好的功能。

(3)里氏替换原则:强调子类应该能够替换父类而不会影响程序的正确性。换句话说,你应该能够使用子类的实例来替代父类的实例,而不引发错误。

(4)依赖倒置原则:强调抽象应该依赖于细节,而不是相反。高层模块不应该直接依赖于低层模块的细节,而应该通过抽象进行交互。

(5)接口分离原则:强调客户端不应该被强制依赖它们不需要的方法。接口应该只包含客户端需要的方法,避免造成沉余和不必要的复杂性。

练习题

【2021P)ava语言符合的特征有()和自动的垃圾回收处理
①采用即时编译
②采用静态优化编译
③对象在堆空间分配
④对象在栈空间分配
A.①③
B.①④
C.②③
D.②④

答案A

【2021】面向对象分析时,执行的活动顺序通常是()。
A认定对象、组织对象、描述对象的相互作用、确定对象的操作
B认定对象、定义属性、组织对象、确定对象的操作
C认定对象、描述对象间的相互作用、确定对象的操作、识别包
D识别类及对象、识别关系、定义属性、确定对象的操作

答案A
堆(heap):内存中区域最大,对象都是放在堆中的,而函数在python中也是对象,所以函数就存储在堆内存中!
栈(stack):运行代码时就在栈内存中运行,因此它的内存空间不会太大;每个程序开始运行时,都会分配一个执行栈让程序去执行(当有多线程程序时,就会有多个执行栈); 基本数据类型是存储在栈里的。它是前进后出(FILO)或者后进先出(LIFO)

UML

UML是统一建模语言,和程序设计语言并无关系。
UML三个要素:UML的基本构造块、支配这些构造块如何放置在一起的规则和运用与整个语言的一些公共机制
UML的基本构造块包括:事物(对模型中最具有代表性的成分的抽象)、关系(把事务结合在一起)、(聚集了相关的事物)。
UML中有四种事物:结构事物、行为事物、分组事物、注释事物
结构事物:模型的静态部分,如类、接口、用例、构件等;如右图示例:

在这里插入图片描述

关系

  • 依赖:一个事物的语义依赖于另一个事物的语义的变化而变化
  • 关联:是一种结构关系,描述了一组链,链是对象之间的连接。分为组合和聚合,都是部分和整体的关系,其中组合事物之间关系更强。两个类之间的关联,实际上是两个类所扮演角色的关联,因此,两个类之间可以有多个由不同角色标识的关联。
  • 泛化:一般/特殊的关系,子类和父类之间的关系
  • 实现:一个类元指定了另一个类元保证执行的契约。
    在这里插入图片描述

类图

类图:静态图,为系统的静态设计视图,展现一组对象、接口、协作和它们之间的关系。
多重度:指的是不同类之间的联系,类似于数据库设计的表与表的关系
在这里插入图片描述

用例图

用例图:静态图,展现了一组用例、参与者以及它们之间的关系
用例图中的参与者是人、硬件或其他系统可以扮演的角色;用例是参与者完成的一系列操作。
用例之间的关系:包含(include)、扩展(extend)、泛化(generalize)
在这里插入图片描述

序列图

序列图:即顺序图,动态图,是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。
同步消息(进行阻塞调用,调用者中止执行,等待控制权返回,需要等待返回消息,用实心三角箭头表示)、异步消息(发出消息后继续执行,不引起调用者阻塞,也不等待返回消息,由空心箭头表示示)、返回消息(由从右到左的虚线箭头表示)三种。
在这里插入图片描述

设计模式

创建型

速记口诀:单抽元件厂
在这里插入图片描述

结构型

速记口诀:外侨组员带配饰
在这里插入图片描述

行为型

速记口诀:观摩(模)对(迭)策,责令解放(访),戒(介)忘台(态)
在这里插入图片描述
在这里插入图片描述

练习题

【2023年】44-45、在某招聘系统中,要求实现求职简历自动生成功能。简历的基本内容包括求职者的姓名、性别、年龄及工作经历等。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。针对此需求,设计如下所示类图。该设计采用了(44)模式,由xx实例指定创建对象的种类,声明一个复制自身的接口,并且通过复制这些Resume xx WorkExperience的对象来创建新的对象。该模式属于(45)模式
在这里插入图片描述
(44)
A.单例(Singleton)
B.抽象工厂(Abstract Factory)
C.生成器(Builder)
D.原型(Prototype)
(45)
A.混合型
B.行为型
C.结构型
D.创建型

答案D D

【2022年】在某系统中,不同级别的日志信息记录方式不同,每个级别的日志处理对象根据信息级别高低,采用不同方式进行记录。每个日志处理对象检查消息的级别,如果达到它的级别则进行记录,否则不记录;然后将消息传递给它的下一个日志处理对象。针对此需求,设计如下所示类图。该设计模式采用(44)模式使多个前后连接的对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。该模式属于(45)模式,该模式适用于(46)。
在这里插入图片描述

A.责任链(Chain of Responsibility)
B.策略(Strategy)
C.过滤器(Filter)
D.备忘录(Memento)

A.行为型类
B.行为型对象
C.结构型类
D.结构型对象

A.不同的标准过滤一组对象,并通过逻辑操作以解耦的方式将它们链接起来
B.可处理一个请求的对象集合应被动态指定
C.必须保存一个对象在某一个时刻的状态,需要时它才能恢复到先前的状态
D.一个类定义多种行为,并日以多个条件语句的形式出现

答案A B B
最后一题有争议,个人觉得A也正确
责任链(Chain of Responsibility)设计模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式是行为型对象模式,适用于以下条件:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

【2023年】18、()模式可以给对象动态地添加一些额外的职责,而不改变该对象的结构。
A.装饰(Decorator)
B.外观(Facade)
C.组合(Composite)
D.享元(Flyweight)

答案A

【2023年】46-47、某旅游公司欲开发一套软件系统,要求能根据季节、节假日等推出不同的旅行定价包,如淡季打折、一口价等。实现该要求适合采用(46)模式,该模式的主要意图是(47)。
A.策略(Strategy)
B.状态(State)
C.观察者(Observer)
D.命令(Command)

A.将一个请求封装为对象,从而可以用不同的请求对客户进行参数化
B.当一个对象的状态发生改变时,依赖于它的对象都得到通知并被自动更新
C.允许一个对象在其内部状态改变时改变它的行为
D.定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

答案A D

算法

算法基础知识

算法的复杂度:

  • 时间复杂度是指程序运行从开始到结束所需要的时间。
  • 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小

常见的对算法执行所需时间的度量:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)

上述的时间复杂度,经常考到,需要注意的是,时间复杂度是一个大概的规模表示,一般以循环次数表示,O(n)说明执行时间是n的正比,另外,log对数的时间复杂度一般在查找二叉树的算法中出现。渐进符号O表示一个渐进变化程度,实际变化必须小于等于O括号内的渐进变化程度。

四大经典算法

分治法

对于一个规模为n的问题,若该问题可以容易地解决则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。

步骤:分解(将原问题分解成一系列子问题) – 求解(递归地求解各子问题,若子问题足够小,则直接求解) --合并(将子问题的解合并成原问题的解)。
凡是涉及到分组解决的都是分治法(二分查找、归并排序、求阶乘、斐波那契数列等)。

递归:指子程序(函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的常用方法。
递归两个基本要素:边界条件(确定递归何时终止,即递归出口)、递归模式(大问题如何分解成小问题,即递归体)
在这里插入图片描述

回溯法

回溯法(Backtracking)是一种选优的暴力搜寻法。但是,由于暴力,回溯法的时间复杂度较高,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

一般用于解决迷宫类的问题。其思路不难理解,想象一下你在走一个迷宫,当在一个路口有A,B,C三条岔路的时候你要怎么办呢?大家可以很容易地想到先尝试道路A,如果走不通就回到这个路口尝试道路B,如果还走不通就尝试道路C,这就是一个典型地应用回溯法的例子。如果将目光着眼于整个迷宫,就可以发现这个迷宫其实就是一颗多叉树,每个路口就是一个节点,每个路口的岔路就是这个节点的子树,在这颗多叉树上应用深度优先搜索就是回溯法。
在这里插入图片描述

动态规划法

动态规划法(Dynamic Programming):在求解问题中,对于每一步决策,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解,以每一步都是最优解来保证全局是最优解。

本质也是将复杂的问题划分成一个个子问题,与分治法不同的是分治法中的每个子问题都是相同的,而动态规划法中的每个子问题间不是相互独立的,并且不全都相同

此算法会将大量精力放在前期构造表格上面,其会对每一步,列出各种可能的答案,这些答案会存储起来,最终要得出某个结果时,是通过查询这张表来得到的。动态规划法不但每一步最优,全局也最优

总结:动态规划一定是具备了以下三个特点:

  • 把原来的问题分解成了几个相似的子问题。(强调“相似子问题”)
  • 所有的子问题都只需要解决一次。(强调“只解决一次”)
  • 储存子问题的解。(强调“储存”)

贪心法

贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不比为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。

局部贪心,只针对当前的步骤取最优,而非整体考虑

判断此类算法,就看算法是否是每一步都取最优,并且整体题意没有透露出最终结果是最优的。

总结

分治法特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔

回溯法特征:系统的搜索一个问题的所有解或任一解。
经典问题:N皇后问题、迷宫、背包问题

动态规划法(用于求最优解):划分子问题,并把子问题结果使用数组/散列表存储,利用查询子问题结果构造最终问题
经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列

贪心法(用于求满意解)特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
经典问题:背包问题、多机调度、找零钱问题

练习题

【2022年】39-40、考虑下述背包问题的实例。有5件物品,背包容量为100,每件物品的价值和重量如下表所示,并已经按照物品的单位重量价值从大到小排好序,根据物品单位重量价值大优先的策略装入背包中,则采用了()设计策略。考虑0/1背包问题(每件物品或者全部放入或者全部不装入背包)和部分背包问题(物品可以部分装入背包),求解该实例,得到的最大价值分别为()。
在这里插入图片描述

A.分治
B.贪心
C.动态规划
D.回溯

A.605和630
B.605和605
C.430和630
D.630和430

答案B C
0/1背包问题:取最大价值是10,8,6即50+200+180=430,对应重量是5+25+30=60,编号4的45重量已经放不进去
部分背包问题:取最大值10,8,6即50+200+180=430,对应重量是5+25+30=60。100-60=40,编号4还可以放入40个即430+40*5=630
| 编号 | 价值/重量 |
|–|–|
| 1 | 50/5=10 |
| 2 | 200/25=8 |
| 3 | 180/30=6 |
| 4 | 225/45=5 |
| 5 | 200/50=4 |

【2023年】11、采用贪心策略求解()问题,一定可以得到最优解。
A.分数背包
B.0-1背包
C.旅行商
D.最长公共子序列

答案A

  • A. 分数背包:
    分数背包问题允许你选择每个物品的一部分(即非整数个),而不是整个物品或完全不选。在这个问题中,贪心策略是有效的。具体地,我们可以根据每个物品的单位重量价值(即价值除以重量)进行排序,然后尽可能多地选择单位重量价值最高的物品,直到达到背包的容量限制。由于可以分割物品,这种贪心选择策略可以保证得到最优解。
  • B. 0-1背包:
    0-1背包问题要求你只能选择每个物品的全部或完全不选。在这个问题中,贪心策略并不总是能得到最优解。因为贪心策略可能会错过某些组合,这些组合的总价值可能高于任何贪心选择的结果。动态规划是解决0-1背包问题的常用方法。
  • C. 旅行商(TSP, Traveling Salesman Problem):
    旅行商问题要求找到一条最短的路径,使得旅行商能够访问每个城市一次并返回起点。这是一个著名的NP难问题,意味着没有已知的多项式时间算法可以保证找到最优解。贪心策略在这里通常不适用,因为它可能会陷入局部最优解而无法找到全局最优解。
  • D.最长公共子序列
    最长公共子序列问题要求找到两个(或多个)序列共有的、长度最长的子序列,且这个子序列在原始序列中的相对顺序需要保持不变。
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yoyo勰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值