2022年上半年软件设计师下午试题

news2025/1/10 11:17:36

【试题四】(共15分)

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

工程计算中经常要完成多个矩阵相乘的计算任务,对矩阵相乘进行以下说明。

(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bnxp需要m*n*p次乘法运算,即时间复杂度为O(m*n*p)。

(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵A1_{_{5*100}},A2_{_{100*8}},A3_{_{8*50}}三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50=6000次乘法运算,若按A1*(A2*A3)计算,则需要进行100*8*50+ 5*100*50=65000次乘法运算。

矩阵链乘问题可描述为:给定n个矩阵,矩阵Ai的维数为Pi-1×Pi其中i=1, 2,..., n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2**An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2**An两个子问题,则该最优解应该包含A1*A2**Ak的一个最优计算顺序和Ak+1*Ak+2**An的一个最优计算顺序。据此构造递归式:

其中,cost[i][j]表示Ai+1*Ai+2*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。

C代码算法实现,采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的语言实现:

(1)主要变量说明

n:矩阵数

seq:矩阵维数序列

cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*...*Aj+1的最优的计算代价

trace[][]:二维数组,长度为n*n,其中元素costcost
 

 

#include<stdio.h>
#include<stdlib.h>
#define N 100

int cost[N][N];//元素cost[i][j]表示Ai+1*Ai+2*...*Aj+1的最优的计算代价
int trace[N][N];//trace[i][j]表示Ai+1*Ai+2*...*Aj+1的最优计算对应的划分位置,即k(2)函数cmm

int cmm1(int n, int seq[]) {
	//seq:矩阵维数序列
	int tempCost;
	int tempTrace;
	int i, j, k, p;
	int temp;
	for (i=0; i < n; i++) { 
  		cost[i][i] =0; 
	}
	for (p= 1; p < n; p++) {
		for (i= 0; i<n-p ; i++) {//填空1 
			j=i+p;	//填空2		
			tempCost=-1;
			for (k= i; k<j ; k++) {
				temp = cost[i][k]+cost[k+1][j]+seq[i]*seq[k+1]*seq[j+1];//填空3
				if (tempCost == -1 || tempCost > temp) {
				  tempCost = temp;
				  tempTrace=k;//填空4
				}
				cost[i][j] = tempCost;
				trace[i][j]=tempTrace;
			}
		}	
	}
	return cost[0][n - 1];
}


int main(){
	//A1为15*5,A2为5*10,A3为10*20,A4为20*25
	int seq[]={15,5,10,20,25};
	int cmm=cmm1(4,seq);
	printf("%d\n",cmm);
	return 0;
}

问题1(8分)

根据以上说明和C代码,填写C代码中的空(1)~(4)。

问题2(4分)

根据以上说明和C代码,该问题采用了( 5 )算法设计策略,时间复杂度为( 6 )(用O符号表示)。

问题3(3分)

考虑实例n=4,各个矩阵的维数为A1为15*5,A2为5*10,A3为10*20,A4为20*25,即维度序列为15,5,10,20和25。则根据上述C代码得到的一个最优计算顺序为( 7 )(用加括号方式表示计算顺序),所需要的乘法运算次数为( 8 )。 

 

试题六(共15分)

阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。

在软件系统中,通常会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图5-1所示的类图。Memento 包含了要被恢复的状态。Originator创建并在Memento中存储状态。Caretaker负责从Memento中恢复状态。

【JAVA代码】

 

package test_2022_1;
import java.util.*;

class Memento {
    private String state;
    public Memento (String state) {this.state=state;}
    public String getState() {return state; }

}

class Originator{
    private String state;
    public void setState (String state) {this.state=state; }
    public String getState() { return state; }
    public Memento saveStateToMemento() {
        return new Memento(state);//填空1
    }

    public void getStateFromMemento(Memento Memento){
        state = Memento.getState() ;//填空2
    }

}

class CareTaker {
    public void add(Memento state){
        mementoList.add(state);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }

}

class MementoPatternDemo{

    public static void main (String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());//填空5
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());//填空5
        originator.setState("State #4");
    }
}

public class MementoDemo{

}

 

 

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

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

相关文章

适合广告行业使用的企业网盘工具

Zoho Workdrive 是一款非常适合广告行业使用的企业网盘工具&#xff0c;它可以帮助广告行业进行高效、有序的项目管理。作为一名广告行业从业者&#xff0c;你是否遇到过以下问题&#xff1f; 2.文件无法有效共享 团队合作效率低下客户需求无法及时满足 这些问题都会严重影响项…

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)

一、Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 发送者可以向多个订阅者发送消息&#xff0c;订阅者可以收到多个发送者送来的消息&#xff0c;也就是是说发送者和订阅者是多对多的关系 实例…

MATLAB中资源管理器无法安装资源解决方法详细教程

摘要&#xff1a;介绍使用MATLAB获取附加功能时出现“续订软件维护服务”的界面问题解决方案&#xff0c;即使用预先从官网下载的安装包文件&#xff0c;直接运行离线安装文件后会自动弹出附加功能管理界面&#xff0c;这时可以安装该附加工具&#xff0c;详细过程见以下介绍。…

ProtoBuf原理

一、文章 https://zhuanlan.zhihu.com/p/404782892 二、测试 1.test.proto syntax "proto3";package proto; option go_package "./;proto";message Msg{uint32 age1 1;sint32 age2 2;string name 3;bytes data 4; }2.main.go package mainimpor…

【滤波】多元卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第6章节06-Multivariate-Kalman-Filters&#xff08;多元卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 我们现在准备研究和实现完整的、多…

财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?

全球民宿龙头爱彼迎Airbnb迎来了一个强劲的开端。 美东时间5月9日盘后&#xff0c;爱彼迎发布了2023年第一季度财报。财报显示&#xff0c;爱彼迎一季度营收、净利润、总预订金额都获得了不同程度增长&#xff0c;超出市场预期。美中不足的是&#xff0c;公司预计二季度营收下…

分组卷积和深度可分离卷积

文章目录 一、常规卷积操作二、分组卷积三、深度可分离卷积 一、常规卷积操作 在图中&#xff0c;输入的特征图大小为 H * W * 4 卷积核个数为 2 个&#xff0c;每个卷积核的大小为 K * K * 4 输出的特征图大小为 H’ * W’ * 2 二、分组卷积 &#xff01;&#xff01;&#…

Java 内存模型

JVM 内部使用的 Java 内存模型&#xff0c; 在逻辑上将内存划分为 线程栈&#xff08;thread stacks&#xff09;和堆内存 &#xff08;heap&#xff09;两个部分。 如下图所示&#xff1a; JVM 中&#xff0c;每个正在运行的线程&#xff0c;都有自己的线程栈。 线程栈包含了当…

多表查询~

文章目录 多表查询内连接外连接子查询单行单列多行单列多行多列 多表查询 笛卡尔积:有A,B两个集合 取A,B所有的组合情况 内连接 要想查询某一章表的某个字段&#xff0c;可用 表名.字段名表示 也可以给表起别名 隐式内连接INNER可省略 外连接 外连接分左外连接和右外连接 子查…

堆排序创建

堆排序创建 一、介绍1、什么是堆2、大项堆&#xff08;排序前&#xff09;3、小项堆&#xff08;排序前&#xff09;4、排序思想 二、大项堆排序案例1、流程2、讲解 三、总结 一、介绍 1、什么是堆 堆是一种叫做完全二叉树的数据结构&#xff0c;可以分为大项堆&#xff0c;小…

计算机知识 小tips

目录 什么是R语言&#xff1f; 电脑长期不关机会产生什么影响&#xff1f; nlp是什么&#xff1f; cv是什么&#xff1f; 什么是R语言&#xff1f; R语言是一种用于数据分析和统计建模的编程语言和环境。它由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman于1995年开发而…

【C语言督学训练营 第十三天】栈与循环队列的顺序实现与链式实现

文章目录 前言栈--思想栈--代码实战队列--思想队列--代码实战真题实战&#xff01; 前言 栈与队列是数据结构中最常见的数据结构之一&#xff0c;因其特性往往可以将问题简单化&#xff0c;在使用栈与队列时要牢记&#xff1a;栈&#xff1a;先进后出&#xff0c;队列&#xf…

逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析 crakeme练习 crackme1 学到的知识点&#xff1a; main函数查找方法&#xff1a;运行到EntryPoint -> 第一个call&#xff08;一般在第三行&#xff09…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法&#xff0c;适用性比较高&#xff0c;操作也十分的简单。有的小伙伴想给自己的电脑重装win7&#xff0c;那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料&#xff1a; 系统…

CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM

前言 ctr预估&#xff08;点击率&#xff0c;click-through rate, CTR&#xff09;&#xff0c;指一个user在某个特定的场景下会点击一个item的概率估计&#xff0c;这里的item可以是广告、商品等&#xff0c;是推荐和广告系统中十分重要的模块。另外&#xff0c;这里的user-i…

《程序员面试金典(第6版)》面试题 16.18. 模式匹配(暴力破解 + 剪枝)

题目描述 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。 例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是"a&q…

Redis基础复习

1 Redis基础概述 Redis 是C语言开发的一个开源高性能键值对的内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件等场景&#xff0c;是一种NoSQL(not-only sql,非关系型数据库)的数据库 1.1 参考网站&#xff1a; 官网 中文文档 1.2 安装 linux安装Redis7 1.3 Re…

全新上线!能源行业大型的S/4升级项目——E.ON(意昂)第五次迁移成功完成

意昂集团是一家德国能源集团的控股公司&#xff0c;总部位于埃森。该公司主要活跃在能源网络、能源服务、可再生能源以及德国核电站的运营和退役领域。 意昂于2019年启动了全公司范围内的S/4联合项目&#xff0c;这是SAP大型S/4项目之一&#xff0c;也是能源行业的大型S/4项目。…

linux下mysql如何修改密码,包括本地密码和远程密码。navicat远程登录

当服务器部署mysql,navicat远程访问&#xff0c;修改密码时需要修改两次 1、修改本地登录密码 mysql > SET PASSWORD PASSWORD(123456); mysql > FLUSH PRIVILEGES;重启mysql服务 service mysql restart上面命令如果报错&#xff0c;则采取以下方法&#xff1a; [ro…

SpringBoot基础篇2(整合第三方技术)

一、SpringBoot整合Junit 直接配置的module&#xff0c;默认就可以测试。 SpringBoot整合第三方技术&#xff1a; 1.pom.xml中引入对应的starter&#xff08;有勾选的勾选&#xff0c;没有勾选的选项手动导入。在这里查 查依赖的网站&#xff09; 2.配置相关信息 二、SpringB…