首页 > 题库 > 软件设计师

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】某工程计算中经常要完成多个矩阵相乘(链乘)的计算任务,对矩阵相乘进行以下说明。(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bnxp需要m*n*p次行乘法运算的次数决定、乘法运算,即时间复杂度为O(m*n*p)。(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵A15×100,A2100*8,A38x50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50=6000次乘法运算,若按A1*(A2*A3)计算,则需要进行100*8*50+5*100*50=65000次乘法运算。矩阵链乘问题可描述为:给定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[i][j]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2**Aj+1的最优的计算代价。trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2**Aj+1的最优计算顺序对应的划分位置,即k。(2)函数cmm#define N100 int cost[N[N];int trace[N][N]; int cmm(int n,int 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)  ;             tempCost = -1;             for(k = i;  (2) ;k++){                    temp=  (3)  ;                 if(tempCost==-1 || tempCost>temp){                                    tempCost = temp;                    tempTrace=k;                 }             }             cost[i][j] = tempCost;             (4)  ;        }     }     return cost[0][n-1]; } 

查看试题

阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】在软件系统中,通常都会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图6-1所示的类图。Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。Caretaker负责从Memento中恢复状态。图6-1 类图【Java代码】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(){ retum state;}    public Memento saveStateToMemento( ){        return (1);    }   public void getStateFromMemento(Memento Memento){      state =(2);   }}class CareTaker{    private List<Memento> mementoList= new ArrayList<Memento>();    public(3){        mementoList.add(state);    }    public (4){        return memensoList.get(index);    }}class MementoPaneDems{    public static void main(String[] args) {        Originator originator =new Originator();        CareTaker careTaker=new careTaker();        originator.setState("State #1");        originator.setState("State #2");        careTaker.add( (5) );        originator.setState("State #3");        careTaker.add( (6) );        originator.setState("State #4");        System.out.println("Current State"+originator.getState());        originator.getStateFromMemento(careTaker.get(0));        System.out.println("Frist saved State"+originator.getState());        originator.getStateFromMemento(careTaker.get(1));        System.out.println("Second saved State"+originator.getState());    }}

查看试题

阅读下列说明和C++代码。将应填入(n)处的字句写在答题纸的对应栏内。【说明】在软件系统中,通常不会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图5-1所示的类图。Memento 包含了要被恢复的状态。Originator创建并在Memento中存储状态。Caretaker负责从Memento中恢复状态。图5-1 类图【C++代码】#include #include #include using namespace std;class Memento{private:string state;public:Memento(string state){ this->state=state; }string getState(){ return state; }}class Originator{private:string state;public:void setState(string state){this>sate=state;}string getState(){return state;}Memento saveStateToMemento(){return (1)}void getStateFromMemento(Memento Memento){state (2)}class CareTaker{private:vector mementoList;pubilc:viod(3){mementoList.push back(state)(4);return mementoList(index);}int mian(){Originator*originator=new Originator();CareTaker*careTaker=new CareTaker();originator->setState("State #1");originator->setState("State #2");careTaker->add(_(5)_);originator->setState("State #3");careTaker->add((6));originator->setState("State #4");cout <<"Current State:"<<"+" <<originator->getState( )<<endl;originator->getStateFromMemento(careTaker->get(0);cout<<"First saved State:"<<originator->getStatee( )<<endl;originator->getStateFromMemento(careTaker->get(1);cout<<"second save State"<<"+" <<originator>getState( )<<endl;return 0;}

查看试题

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】工程计算中经常要完成多个矩阵相乘的计算任务,对矩阵相乘进行以下说明。(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bxp"需要m*n*p次行乘法运算的次数决定、乘法运算,即时间复杂度为O(m*n*p)。(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵AI5×100,A2100*8,A38x50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50-6000次乘法运算;陌阵链乘问题可描述为:给定n个矩阵对较大的n,可能的计算顺序数量非常庞大,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*...*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*.…*Ak和Ak+1*Ak+2*...*An两个子问题,则该最优解应该包含A1*A2*...*Ak的一个最优计算顺序和Ak+1*Ak+2*...*An的一个最优计算顺序。据此构造递归式,其中,cost【jj】表示Ai+1*Ai+2**Aj+1的最优计算的计算代价。最终需要求解cost[O][n-1。【C代码】算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算个矩阵、4个矩阵、..…、个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的语言实现。(1)主要变量说明n:矩阵数seq【】:矩阵维数序列cos【J【:二维数组,长度为n*n,其中元素cost【】口】表示Ai+1*Ai+2*...*Aj+1的最优的计算代价race【0:二维数组,长度为n*n,其中元素trace【i】【】表示Ai+1*Ai+2*...*Aj+1的最算对应的划分位置,即k(2)函数cmm ine N100 ostf[N[N];return cost[0][]【问题3】(3分)考虑实例n=4,各个矩阵的维数为A1为15*5,A2为5*10,A3为10*20,A4为20*25,即维度序列为15,5,10,20和25。则根据上述C代码得到的一个最优计算顺序为(7)(用加括号方式表示计算顺序),所需要的乘法运算次数为(8)

查看试题

阅读下列说明和C代码,回答问题至问题3,将解答写在答题纸的对应栏内。【说明】工程计算中经常要完成多个矩阵相乘的计算任务,对矩阵相乘进行以下说明。(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bxp"需要m*n*p次行乘法运算的次数决定、乘法运算,即时间复杂度为O(m*n*p)。(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵AI5×100,A2100*8,A38x50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50-6000次乘法运算,若按A1*(A2*A3)计算,则需要进行100*8*50+5*100*50=65000次乘法运算。陌阵链乘问题可描述为:给定n个矩阵对较大的,可能的计算顺序数量非常庞大,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2**An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2**An两个子问题,则该最优解应该包含A1*A2**Ak的一个最优计算顺序和Ak+1*Ak+2**An的一个最优计算顺序。据此构造递归式,其中,cost【jj】表示Ai+1*Ai+2*Aj+1的最优计算的计算代价。最终需要求解cost[O][n-1]。【C代码】算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算个矩阵、4个矩阵、…、个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的语言实现。(1)主要变量说明n:矩阵数seq【】:矩阵维数序列cos【J【:二维数组,长度为n*n,其中元素cost【】口】表示Ai+1*Ai+2**Aj+1的最优的计算代价race【0:二维数组,长度为n*n,其中元素trace【i】【】表示Ai+1*Ai+2**Aj+1的最算对应的划分位置,即k(2)函数cmm ine N100ost[N[N]return cost [n-1]

查看试题

阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】某公司欲开发一款外卖订餐系统,集多家外卖平台和商户为一体,为用户提供在线浏览餐品、订餐和配送等服务。该系统的主要功能是:1.入驻管理。用户注册、商户申请入驻,设置按时间段接单数量阈值等。系统存储商户/用户信息。2.餐品管理。商户对餐品的基本信息和优惠信息进行发布、修改、删除。系统存储相关信息。3.订餐。用户浏览商户餐单,选择餐品及数量后提交订餐请求。系统存储订餐订单。4.订单处理。收到订餐请求后,向外卖平台请求配送。外卖平台接到请求后发布配送单,由平台骑手接单,外卖平台根据是否有骑手接单返回接单状态。若外卖平台接单成功,系统给支付系统发送支付请求,接收支付状态。支付成功,更新订单状态为已接单,向商户发送订餐请求并由商户打印订单,给用户发送订单状态;若支付失败,更新订单状态为下单失败,向外卖平台请求取消配送,向用户发送下单失败。若系统接到外卖平台返回接单失败或超时未返回接单状态,则更新订单状态为下单失败,向用户发送下单失败。5.配送。商户备餐后,由骑手取餐配送给用户。送达后由用户扫描骑手出示的订单上的配送码后确认送达,订单状态更改为已送达,并发送给商户。6.订单评价。用户可以对订单餐品、骑手配送服务进行评价,推送给对应的商户、所在外卖平台,商户和外卖平台对用户的评价进行回复。系统存储评价。现采用结构化方法对外卖订餐系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。图1-1 上下文数据流图图1-2 0层数据流图

查看试题

暂未登录

成为学员

学员用户尊享特权

老师批改作业做题助教答疑 学员专用题库高频考点梳理

本模块为学员专用
学员专享优势
老师批改作业 做题助教答疑
学员专用题库 高频考点梳理
成为学员