請教prim演算法正確性的證明

2021-03-03 21:00:14 字數 4027 閱讀 4080

1樓:電燈劍客

為了減少不必要的麻煩,可以不妨設圖中所有邊的權重都不同,這樣最小生成樹版是唯權一的

然後直接用反證法就行了

如果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演算法生成的樹具有最小權重)

如何利用迴圈不變式證明演算法部分正確性

2樓:匿名使用者

就是個思想,說明正確演算法的迴圈過程中總是存在一個維持不變的特性,這個特性一直保持到迴圈結束乃至演算法結束,這樣就可以保證演算法的正確了。比方說插入排序,演算法每次迴圈後,前n個數一定是排好序的(n為已經迴圈的次數)。由於這個特性一直成

如何利用迴圈不變數證明演算法的部分正確性

3樓:坎平源廈

理論證明(要考慮種特殊情況),再實驗(用隨機數測試,再做排序誤檢測函式,通量實驗),應該.

如何證明這種歐幾里得演算法的正確性

4樓:蕭甜舔

歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數.其計算原理依賴於下面的定理:

定理:***(a,b) = ***(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***(int a,int b)

當然你也可以寫成迭代形式:

int***(int a,int b)

returna;}

本質上都是用的上面那個原理.

補充:擴充套件歐幾里德演算法是用來在已知a,

b求解一組x,y使得a*x+b*y=***(a,b)(解一定存在,根據數論中的相關定理).擴充套件歐幾里德常用在求解模線性方程及方程組中.下面是一個使

用c++的實現:

&y)int r =

ex***(b,a % b,x,y);

int t =

x;x =

y;y = t - a

/ b * y;

returnr;}

把這個實現和***的遞迴實現相比,發現多了下面的x,y賦值過程,這就是擴充套件歐幾里德演算法的精髓.

可以這樣思考:

對於a' = b,

b' = a % b 而言,我們求得 x,y使得 a'x + b'y = ***(a',b')

由於b' = a

% b = a - a / b * b (注:這裡的/是程式設計語言中的除法)

那麼可以得到:

a'x + b'y

= ***(a',b') ===>

bx + (a - a / b * b)y = ***(a',b') = ***(a,b)

===>

ay +b(x - a / b*y) = ***(a,b)

因此對於a和b而言,他們的相對應的p,q分別是

y和(x-a/b*y).

在網上看了很多關於不定方程方程求解的問題,可都沒有說全,都只說了一部分,看了好多之後才真正弄清楚不定方程的求解全過程,步驟如下:

求a * x

+ b * y = n的整數解.

1、先計算***(a,b),若n不能被***(a,b)整除,則方程無整數解;否則,在方程兩邊同時除以***(a,b),得到新的不定方程a'

* x + b' * y = n',此時***(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)計算***(a,b).若***(a,b)不能整除n,則方程無整數解;否則,在方程的兩邊同除以***(a,b),

得到新的不定方程a'x + b'y = n',此時***(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的所有整數解

利用擴充套件的歐幾里德演算法,計算***(a,b)和滿足d = ***(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 ***(a,b:longint):longint;

var i:longint;

begin

if a=0 then exit(b);

if b=0 then exit(a);

***:=***(b,a mod b);

end;

procedure extend_***(a,b:longint;var x,y:longint);

var i,j:longint;

begin

if b=0 then

begin

x:=1;

y:=0;

exit

end;

extend_***(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:=***(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_***(a,b,x,y);

x:=c*x;

y:=c*y;

writeln(x,' ',y);

end.

承臺深度怎麼算,請教請教

這麼深奧的東西爾等凡人不會 你 不是標800的嗎 的計算方法只知道承臺的長寬,和基礎的深度,怎麼確 承臺底標高不一,挖土一般是按承臺標高相同數最多的來挖。還有一點,不能直接挖到承臺底標高的,需要留置20cm 30cm的土,後面用人工清理。鑽孔灌注樁樁底標高也不一,成孔深度是按樁的深度做的,不能統一。...

華碩b250m a支援超頻嗎,求華碩PRIME B250M A主機板的具體引數。

不支援。b250晶片組的主機板不支援超頻,華碩b250m a主機板cpu供電是3 2項,供電部分沒有散熱片,不如選b250m plus,還便宜一點,4 2項供電,供電部分還有散熱。b250m a一般是電商整機和線下實體店用的比較多,品牌溢價高,不划算。具體介紹 一 超頻簡介 電腦的超頻就是通過計算機...

鐵桶的重量怎麼算,請教鐵桶的重量問題

若是為計算鐵桶自重,那就設法求出鐵皮材質的體積,乘上比重即可。請教鐵桶的重量問題 你們是食品還是化工類呀?鐵桶既有材質又有尺寸型號的不同呀,這個比較難說,建議如下 1.如果鐵桶重量所佔比重不大,建議說服接受淨重 2.如果鐵桶重量所佔比重較大或者客戶不接受,建議統一採用鐵通重量的均值加淨重。裝卸肯定是...