閱讀下列說明和C++代碼。將應(yīng)填入(n)處的字句寫在答題紙的對(duì)應(yīng)欄內(nèi)。
【說明】
在軟件系統(tǒng)中,通常不會(huì)給用戶提供取消、不確定或者錯(cuò)誤操作的選擇,允許將系統(tǒng)恢復(fù)到原先的狀態(tài)?,F(xiàn)使用備忘錄(Memento)模式實(shí)現(xiàn)該要求,得到如圖5-1所示的類圖。Memento 包含了要被恢復(fù)的狀態(tài)。Originator創(chuàng)建并在Memento中存儲(chǔ)狀態(tài)。Caretaker負(fù)責(zé)從Memento中恢復(fù)狀態(tài)。
圖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;
}
某工程計(jì)算中經(jīng)常要完成多個(gè)矩陣相乘(鏈乘)的計(jì)算任務(wù),對(duì)矩陣相乘進(jìn)行以下說明。
(1)兩個(gè)矩陣相乘要求第一個(gè)矩陣的列數(shù)等于第二個(gè)矩陣的行數(shù),計(jì)算量主要由進(jìn)行乘法運(yùn)算的次數(shù)決定,假設(shè)采用標(biāo)準(zhǔn)的矩陣相乘算法,計(jì)算Amxn*Bnxp需要m*n*p次行乘法運(yùn)算的次數(shù)決定、乘法運(yùn)算,即時(shí)間復(fù)雜度為O(m*n*p)。
(2)矩陣相乘滿足結(jié)合律,多個(gè)矩陣相乘時(shí)不同的計(jì)算順序會(huì)產(chǎn)生不同的計(jì)算量。以矩陣A15×100,A2100*8,A38x50三個(gè)矩陣相乘為例,若按(A1*A2)*A3計(jì)算,則需要進(jìn)行5*100*8+5*8*50=6000次乘法運(yùn)算,若按A1*(A2*A3)計(jì)算,則需要進(jìn)行100*8*50+5*100*50=65000次乘法運(yùn)算。
矩陣鏈乘問題可描述為:給定n個(gè)矩陣,對(duì)較大的n,可能的計(jì)算順序數(shù)量非常龐大,用蠻力法確定計(jì)算順序是不實(shí)際的。經(jīng)過對(duì)問題進(jìn)行分析,發(fā)現(xiàn)矩陣鏈乘問題具有最優(yōu)子結(jié)構(gòu),即若A1*A2**An的一個(gè)最優(yōu)計(jì)算順序從第k個(gè)矩陣處斷開,即分為A1*A2*…*Ak和Ak+1*Ak+2*...*An兩個(gè)子問題,則該最優(yōu)解應(yīng)該包含 A1*A2*…*Ak的一個(gè)最優(yōu)計(jì)算順序和 Ak+1*Ak+2*...*An 的一個(gè)最優(yōu)計(jì)算順序。據(jù)此構(gòu)造遞歸式:
(2)函數(shù)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];
}