常用算法設(shè)計(jì)方法
寧波高等專科學(xué)校電子系 周*
要使計(jì)算機(jī)能完成人們預(yù)定的工作,首先必須為如何完成預(yù)定的工作設(shè)計(jì)一個(gè)算法,然后再根據(jù)算法編寫程序。計(jì)算機(jī)程序要對(duì)問(wèn)題的每個(gè)對(duì)象和處理規(guī)則給出正確詳盡的描述,其中程序的數(shù)據(jù)結(jié)構(gòu)和變量用來(lái)描述問(wèn)題的對(duì)象,程序結(jié)構(gòu)、函數(shù)和語(yǔ)句用來(lái)描述問(wèn)題的算法。算法數(shù)據(jù)結(jié)構(gòu)是程序的兩個(gè)重要方面。
算法是問(wèn)題求解過(guò)程的精確描述,一個(gè)算法由有限條可完全機(jī)械地執(zhí)行的、有確定結(jié)果的指令組成。指令正確地描述了要完成的任務(wù)和它們被執(zhí)行的順序。計(jì)算機(jī)按算法指令所描述的順序執(zhí)行算法的指令能在有限的步驟內(nèi)終止,或終止于給出問(wèn)題的解,或終止于指出問(wèn)題對(duì)此輸入數(shù)據(jù)無(wú)解。
通常求解一個(gè)問(wèn)題可能會(huì)有多種算法可供選擇,選擇的主要標(biāo)準(zhǔn)是算法的正確性和可靠性,簡(jiǎn)單性和易理解性。其次是算法所需要的存儲(chǔ)空間少和執(zhí)行更快等。
算法設(shè)計(jì)是一件非常困難的工作,經(jīng)常采用的算法設(shè)計(jì)技術(shù)主要有迭代法、窮舉搜索法、遞推法、貪婪法、回溯法、分治法、動(dòng)態(tài)規(guī)劃法等等。另外,為了更簡(jiǎn)潔的形式設(shè)計(jì)和藐視算法,在算法設(shè)計(jì)時(shí)又常常采用遞歸技術(shù),用遞歸描述算法。
一、迭代法
迭代法是用于求方程或方程組近似根的一種常用的算法設(shè)計(jì)方法。設(shè)方程為f(x)=0,用某種數(shù)學(xué)方法導(dǎo)出等價(jià)的形式x=g(x),然后按以下步驟執(zhí)行:
(1) 選一個(gè)方程的近似根,賦給變量x0;
(2) 將x0的值保存于變量x1,然后計(jì)算g(x1),并將結(jié)果存于變量x0;
(3) 當(dāng)x0與x1的差的絕對(duì)值還小于指定的精度要求時(shí),重復(fù)步驟(2)的計(jì)算。
若方程有根,并且用上述方法計(jì)算出來(lái)的近似根序列收斂,則按上述方法求得的x0就認(rèn)為是方程的根。上述算法用C程序的形式表示為:
【算法】迭代法求方程的根
{ x0=初始近似根;
do {
x1=x0;
x0=g(x1); /*按特定的方程計(jì)算新的近似根*/
} while ( fabs(x0-x1)>Epsilon);
printf(“方程的近似根是%f\n”,x0);
}
迭代算法也常用于求方程組的根,令
X=(x0,x1,…,xn-1)
設(shè)方程組為:
xi=gi(X) (I=0,1,…,n-1)
則求方程組根的迭代算法可描述如下:
【算法】迭代法求方程組的根
{ for (i=0;i x[i]=初始近似根;
do {
for (i=0;i y[i]=x[i];
for (i=0;i x[i]=gi(X);
for (delta=0.0,i=0;i if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);
} while (delta>Epsilon);
for (i=0;i printf(“變量x[%d]的近似根是 %f”,I,x[i]);
printf(“\n”);
}
具體使用迭代法求根時(shí)應(yīng)注意以下兩種可能發(fā)生的情況:
(1) 如果方程無(wú)解,算法求出的近似根序列就不會(huì)收斂,迭代過(guò)程會(huì)變成死循環(huán),因此在使用迭代算法前應(yīng)先考察方程是否有解,并在程序中對(duì)迭代的次數(shù)給予限制;
(2) 方程雖然有解,但迭代公式選擇不當(dāng),或迭代的初始近似根選擇不合理,也會(huì)導(dǎo)致迭代失敗。
寧波高等專科學(xué)校電子系 周*
要使計(jì)算機(jī)能完成人們預(yù)定的工作,首先必須為如何完成預(yù)定的工作設(shè)計(jì)一個(gè)算法,然后再根據(jù)算法編寫程序。計(jì)算機(jī)程序要對(duì)問(wèn)題的每個(gè)對(duì)象和處理規(guī)則給出正確詳盡的描述,其中程序的數(shù)據(jù)結(jié)構(gòu)和變量用來(lái)描述問(wèn)題的對(duì)象,程序結(jié)構(gòu)、函數(shù)和語(yǔ)句用來(lái)描述問(wèn)題的算法。算法數(shù)據(jù)結(jié)構(gòu)是程序的兩個(gè)重要方面。
算法是問(wèn)題求解過(guò)程的精確描述,一個(gè)算法由有限條可完全機(jī)械地執(zhí)行的、有確定結(jié)果的指令組成。指令正確地描述了要完成的任務(wù)和它們被執(zhí)行的順序。計(jì)算機(jī)按算法指令所描述的順序執(zhí)行算法的指令能在有限的步驟內(nèi)終止,或終止于給出問(wèn)題的解,或終止于指出問(wèn)題對(duì)此輸入數(shù)據(jù)無(wú)解。
通常求解一個(gè)問(wèn)題可能會(huì)有多種算法可供選擇,選擇的主要標(biāo)準(zhǔn)是算法的正確性和可靠性,簡(jiǎn)單性和易理解性。其次是算法所需要的存儲(chǔ)空間少和執(zhí)行更快等。
算法設(shè)計(jì)是一件非常困難的工作,經(jīng)常采用的算法設(shè)計(jì)技術(shù)主要有迭代法、窮舉搜索法、遞推法、貪婪法、回溯法、分治法、動(dòng)態(tài)規(guī)劃法等等。另外,為了更簡(jiǎn)潔的形式設(shè)計(jì)和藐視算法,在算法設(shè)計(jì)時(shí)又常常采用遞歸技術(shù),用遞歸描述算法。
一、迭代法
迭代法是用于求方程或方程組近似根的一種常用的算法設(shè)計(jì)方法。設(shè)方程為f(x)=0,用某種數(shù)學(xué)方法導(dǎo)出等價(jià)的形式x=g(x),然后按以下步驟執(zhí)行:
(1) 選一個(gè)方程的近似根,賦給變量x0;
(2) 將x0的值保存于變量x1,然后計(jì)算g(x1),并將結(jié)果存于變量x0;
(3) 當(dāng)x0與x1的差的絕對(duì)值還小于指定的精度要求時(shí),重復(fù)步驟(2)的計(jì)算。
若方程有根,并且用上述方法計(jì)算出來(lái)的近似根序列收斂,則按上述方法求得的x0就認(rèn)為是方程的根。上述算法用C程序的形式表示為:
【算法】迭代法求方程的根
{ x0=初始近似根;
do {
x1=x0;
x0=g(x1); /*按特定的方程計(jì)算新的近似根*/
} while ( fabs(x0-x1)>Epsilon);
printf(“方程的近似根是%f\n”,x0);
}
迭代算法也常用于求方程組的根,令
X=(x0,x1,…,xn-1)
設(shè)方程組為:
xi=gi(X) (I=0,1,…,n-1)
則求方程組根的迭代算法可描述如下:
【算法】迭代法求方程組的根
{ for (i=0;i x[i]=初始近似根;
do {
for (i=0;i y[i]=x[i];
for (i=0;i x[i]=gi(X);
for (delta=0.0,i=0;i if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);
} while (delta>Epsilon);
for (i=0;i printf(“變量x[%d]的近似根是 %f”,I,x[i]);
printf(“\n”);
}
具體使用迭代法求根時(shí)應(yīng)注意以下兩種可能發(fā)生的情況:
(1) 如果方程無(wú)解,算法求出的近似根序列就不會(huì)收斂,迭代過(guò)程會(huì)變成死循環(huán),因此在使用迭代算法前應(yīng)先考察方程是否有解,并在程序中對(duì)迭代的次數(shù)給予限制;
(2) 方程雖然有解,但迭代公式選擇不當(dāng),或迭代的初始近似根選擇不合理,也會(huì)導(dǎo)致迭代失敗。

