『壹』 演算法的評價指標包括正確性、可讀性、()、時間復雜性、空間復雜性等
健壯性
演算法的評價指標包括正確性、可讀性、健壯性、時間復雜性、空間復雜性等
『貳』 演算法的正確性如何檢驗
我這學期也正在學數據結構,學的那個暈那,寫的只是代碼而已,也就是說是編程的思路。如果你要證明,那就得用具體的程序帶入吧。我師傅說,數據結構是編程的重心,最重要了。所以好好學吧。
『叄』 如何證明這種歐幾里得演算法的正確性
歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數.其計算原理依賴於下面的定理:
定理:gcd(a,b) = gcd(b,a
mod b)
證明:a可以表示成a = kb +
r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a,
d|b,而r = a - kb,因此d|r
因此d是(b,a
mod b)的公約數
假設d 是(b,a
mod b)的公約數,則
d | b ,d
|r ,但是a = kb +r
因此d也是(a,b)的公約數
因此(a,b)和(b,a mod
b)的公約數是一樣的,其最大公約數也必然相等,得證
歐幾里德演算法就是根據這個原理來做的,其演算法用C++語言描述為:
int
Gcd(int a,int b)
{
if(b ==
0)
return a;
return
Gcd(b,a % b);
}
當然你也可以寫成迭代形式:
int
Gcd(int a,int b)
{
while(b !=
0)
{
int r = b;
b = a % b;
a =
r;
}
return
a;
}
本質上都是用的上面那個原理.
補充:
擴展歐幾里德演算法是用來在已知a,
b求解一組x,y使得a*x+b*y=Gcd(a,b)(解一定存在,根據數論中的相關定理).擴展歐幾里德常用在求解模線性方程及方程組中.下面是一個使
用C++的實現:
int
exGcd(int a,int b,int &x,int
&y)
{
if(b ==
0)
{
x = 1;
y = 0;
return a;
}
int r =
exGcd(b,a % b,x,y);
int t =
x;
x =
y;
y = t - a
/ b * y;
return
r;
}
把這個實現和Gcd的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德演算法的精髓.
可以這樣思考:
對於a' = b,
b' = a % b 而言,我們求得 x,y使得 a'x + b'y = Gcd(a',b')
由於b' = a
% b = a - a / b * b (註:這里的/是程序設計語言中的除法)
那麼可以得到:
a'x + b'y
= Gcd(a',b') ===>
bx + (a - a / b * b)y = Gcd(a',b') = Gcd(a,b)
===>
ay +b(x - a / b*y) = Gcd(a,b)
因此對於a和b而言,他們的相對應的p,q分別是
y和(x-a/b*y).
在網上看了很多關於不定方程方程求解的問題,可都沒有說全,都只說了一部分,看了好多之後才真正弄清楚不定方程的求解全過程,步驟如下:
求a * x
+ b * y = n的整數解.
1、先計算Gcd(a,b),若n不能被Gcd(a,b)整除,則方程無整數解;否則,在方程兩邊同時除以Gcd(a,b),得到新的不定方程a'
* x + b' * y = n',此時Gcd(a',b')=1;
2、利用上面所說的歐幾里德演算法求出方程a' * x + b' * y = 1的一組整數解x0,y0,則n' * x0,n' *
y0是方程a' * x + b' * y = n'的一組整數解;
3、根據數論中的相關定理,可得方程a'
* x + b' * y = n'的所有整數解為:
x = n' * x0 + b' * t
y = n' * y0 - a' * t
(t為整數)
上面的解也就是a * x + b * y = n 的全部整數解.
步驟如下:
擴展歐幾里德演算法-求解不定方程,線性同餘方程:
解不定方程ax + by = n的步驟如下:
(1)計算gcd(a,b).若gcd(a,b)不能整除n,則方程無整數解;否則,在方程的兩邊同除以gcd(a,b),
得到新的不定方程a'x + b'y = n',此時gcd(a',b') = 1
(2)求出不定方程a'x + b'y = 1的一組整數解x0,y0,則n'x0,n'y0是方程a'x + b'y = n'的一組整數解.
(3)根據&@^%W#&定理,可得方程a'x + b'y = n'的所有整數解為:
x = n'x0 + b't
y = n'y0 - a't
(t為整數)
這也就是方程ax + by = n的所有整數解
利用擴展的歐幾里德演算法,計算gcd(a,b)和滿足d = gcd(a,b) = ax0 + by0的x0和y0,
也就是求出了滿足a'x0 + b'y0 = 1的一組整數解.因此可得:
x = n/d * x0 + b/d * t
y = n/d * y0 - a/d * t
(t是整數)
program oujilide;
var i,j,a,b,c,d,x,y:longint;
function gcd(a,b:longint):longint;
var i:longint;
begin
if a=0 then exit(b);
if b=0 then exit(a);
gcd:=gcd(b,a mod b);
end;
procere extend_gcd(a,b:longint;var x,y:longint);
var i,j:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit
end;
extend_gcd(b,a mod b,x,y);
i:=x;
x:=y;
y:=i-(a div b)*x;
end;
begin
assign(input,'oujilide.in');
reset(input);
assign(output,'oujilide.out');
rewrite(output);
read(a,b,c);
d:=gcd(a,b);
if c mod d=0 then begin a:=a div d; b:=b div d; c:=c div d; end
else begin writeln('No answer!'); exit; end;
extend_gcd(a,b,x,y);
x:=c*x;
y:=c*y;
writeln(x,' ',y);
end.
『肆』 在演算法正確性的基礎上,演算法設計的首要目的是
最小化演算法復雜度,分為空間復雜度和時間復雜度。簡單說就是在演算法能夠得到正確結果的前提下,演算法運行佔用的存儲越少越好,演算法執行時間越小越好。
『伍』 求Kruskal演算法正確性證明b
證明:令G為任何一個與Kruskal演算法產生的樹F不同的樹。考慮構造F的過程。令e為第一次選的一條不屬於G的邊。如果我們將e加入G,我們會得到一個圈C。這個圈不完全包含在F裡面,因此在C中有一條不屬於F的邊f。如果我們將e加入G並刪除f,我們就得到了一個新的樹H。
我們想要證明H不比G貴。這意味著e不比f貴。用反證法。假設f比e便宜。
現在考慮這樣一個問題:為什麼Kruskal演算法選擇了f而不是e呢?唯一的原因只可能是f被排除了,即f與加入e之前被選入F的邊會形成一個圈。但是所有這些已經被選的邊都是G的邊,因為e為第一次選的一條不屬於G的邊。又f本身屬於G,所以G就包含了一個圈,這是不可能的(G是樹)。這個矛盾證明了H不比G貴。
因此我們可以用H來代替G,而且H比G更接近F(即H與F有更多相同的邊)。如果H不是F,重復以上步驟,我們得到一系列與H越來越接近的不比G貴的樹。這個過程遲早會以F終結,這就證明了F不比G貴。
Kruskal演算法的正確性也就得證。
『陸』 驗證lamport's algorithm演算法的正確性,即該演算法是否能保證
演算法(Algorithm)是解題的步驟,可以把演算法定義成解一確定類問題的任意一種特殊的方法。在計算機科學中,演算法要用計算機演算法語言描述,演算法代表用計算機解一類問題的精確、有效的方法。演算法+數據結構=程序,求解一個給定的可計算或可解的問題,不同的人可以編寫出不同的程序,來解決同一個問題,這里存在兩個問題:一是與計算方法密切相關的演算法問題;二是程序設計的技術問題。演算法和程序之間存在密切的關系。
『柒』 衡量演算法正確性的標准通常是
在設備的設計製造中,因為種種原因,不可能完全達到設計所要達到的理想狀態。比如設計時的計算、設備零件加工送的行為誤差、設備組裝中的操作、以及設備在運行中的磨損等等,所以,一台設備最終完成,其所達到的狀態於設計時所想達到的狀態之間是有一定的差異的。這種不同越少,做達到的精度就會越高,而要使這種差異縮小就要求在各個環節中的誤差減少,相應的,誤差越小,兩種狀態的差異就越小,精度就會越高。這是基於這之間的關系,通常就會用誤差作為衡量精度的標准。
『捌』 請教prim演算法正確性的證明
為了減少不必要的麻煩,可以不妨設圖中所有邊的權重都不同,這樣最小生成樹是唯一的
然後直接用反證法就行了
如果Prim演算法得到G,而最小生成樹是T
設在生成G的過程中第一次產生的不在T中的邊是e,而在G中去掉e得到的兩個連通分支記為V1和V2,那麼e連接了V1和V2
把e加入T之後會出現環,在這個環裡面V1的頂點和V2的頂點至少還被另一條邊f連接(否則T本身就不連通了),由Prim演算法的貪心策略可知e比f權重低,那麼在T裡面把f換成e可得一個總權重更小的生成樹,與T的最小性矛盾
(因為最小生成樹的總權重的邊的權重的連續函數,對於有權重重復出現的情況可以利用連續性取極限,這樣即使最小生成樹不唯一仍然可以保證Prim演算法生成的樹具有最小權重)
『玖』 求問正確性也是衡量演算法的標准嗎
清華大學版的《數據結構》教材上是這么說的,你可以有保留意見,畢竟這不能算嚴格的科學問題,但是考試時是另外一回事。
我是這么理解的,並非所有的問題都能找到精確的演算法,比如
有一些數值計算方面的問題,不同的演算法效率和精度可能會有
差異,當要求精度很高時,可能效率高的演算法就會出現問題,
正確性不能保證;另外,有很多演算法,它可能會有自身的適
應范圍和條件,如有一些排序演算法,可能會要求不能有重復元素,
當有重復元素時,可能會出錯,因此該演算法在某些場合是正確
的,而在另外的場合可能不正確,這也許就是所謂的正確性吧。