试题六(共15分)
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
在软件系统中,通常都会给用户提供取消、不确定或者错误操作的选择,允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图6-1所示的类图。Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。Caretaker负责从Memento中恢复状态。
【Uava代码】
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
Public(3)
mementoLstadd如aney
}
public (4)
return memensoLint get (imdat
}
}
class MementoPaneDems{
pubic static voiid main(Stringf]
Ohgiator aniginutor-te Origmrfy
CareThker careTukeznwCmiie)
aniginuntorseStte(State1#)
orginxtorsCSuat(State2#);
careThiket add_(5)
oiginatoseSated"(State 3")
careTaker add (6)_
originutor_setState(State#4)
(1) new Memento(state)
(2) Memento.getState()
(3) void add(Memento state)
(4) Memento get(int index)
(5) care Taker.add(originator.saveState ToMemento()
(6) care Taker.add(originator.saveState ToMemento()


某工程计算中经常要完成多个矩阵相乘(链乘)的计算任务,对矩阵相乘进行以下说明。
(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 的一个最优计算顺序。据此构造递归式:
(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];
}
阅读下列说明和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:
void(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;
}