演算法正確性
A. 衡量演算法正確性的標准通常是
在設備的設計製造中,因為種種原因,不可能完全達到設計所要達到的理想狀態。比如設計時的計算、設備零件加工送的行為誤差、設備組裝中的操作、以及設備在運行中的磨損等等,所以,一台設備最終完成,其所達到的狀態於設計時所想達到的狀態之間是有一定的差異的。這種不同越少,做達到的精度就會越高,而要使這種差異縮小就要求在各個環節中的誤差減少,相應的,誤差越小,兩種狀態的差異就越小,精度就會越高。這是基於這之間的關系,通常就會用誤差作為衡量精度的標准。
B. 演算法的評價指標包括正確性、可讀性、________、時間復雜性、空間復雜性等。
A
C. 請教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演算法生成的樹具有最小權重)
D. 演算法的正確性如何檢驗
我這學期也正在學數據結構,學的那個暈那,寫的只是代碼而已,也就是說是編程的思路。如果你要證明,那就得用具體的程序帶入吧。我師傅說,數據結構是編程的重心,最重要了。所以好好學吧。
E. 求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演算法的正確性也就得證。
F. 演算法的評價指標包括正確性、可讀性、()、時間復雜性、空間復雜性等
健壯性
演算法的評價指標包括正確性、可讀性、健壯性、時間復雜性、空間復雜性等
G. 演算法的評價指標有哪些
時間復雜度和空間復雜度。
1、時間復雜度
演算法的時間復雜度是指執行演算法所需要的計算工作量。一般來說,計算機演算法是問題規模n 的函數f(n),演算法的時間復雜度也因此記做。
T(n)=Ο(f(n))
因此,問題的規模n 越大,演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度(Asymptotic Time Complexity)。
2、空間復雜度
演算法的空間復雜度是指演算法需要消耗的內存空間。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。
空間復雜度記做S(n)=O(f(n))。比如直接插入排序的時間復雜度是O(n^2),空間復雜度是O(1) 。而一般的遞歸演算法就要有O(n)的空間復雜度了,因為每次遞歸都要存儲返回信息。一個演算法的優劣主要從演算法的執行時間和所需要佔用的存儲空間兩個方面衡量。
(7)演算法正確性擴展閱讀:
演算法的方法:
1、遞推法
遞推是序列計算機中的一種常用演算法。它是按照一定的規律來計算序列中的每個項,通常是通過計算機前面的一些項來得出序列中的指定項的值。其思想是把一個復雜的龐大的計算過程轉化為簡單過程的多次重復,該演算法利用了計算機速度快和不知疲倦的機器特點。
2、遞歸法
程序調用自身的編程技巧稱為遞歸(recursion)。一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。
一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
注意:
(1) 遞歸就是在過程或函數里調用自身.
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
H. 求問正確性也是衡量演算法的標准嗎
清華大學版的《數據結構》教材上是這么說的,你可以有保留意見,畢竟這不能算嚴格的科學問題,但是考試時是另外一回事。
我是這么理解的,並非所有的問題都能找到精確的演算法,比如
有一些數值計算方面的問題,不同的演算法效率和精度可能會有
差異,當要求精度很高時,可能效率高的演算法就會出現問題,
正確性不能保證;另外,有很多演算法,它可能會有自身的適
應范圍和條件,如有一些排序演算法,可能會要求不能有重復元素,
當有重復元素時,可能會出錯,因此該演算法在某些場合是正確
的,而在另外的場合可能不正確,這也許就是所謂的正確性吧。
I. 驗證lamport's algorithm演算法的正確性,即該演算法是否能保證
演算法(Algorithm)是解題的步驟,可以把演算法定義成解一確定類問題的任意一種特殊的方法。在計算機科學中,演算法要用計算機演算法語言描述,演算法代表用計算機解一類問題的精確、有效的方法。演算法+數據結構=程序,求解一個給定的可計算或可解的問題,不同的人可以編寫出不同的程序,來解決同一個問題,這里存在兩個問題:一是與計算方法密切相關的演算法問題;二是程序設計的技術問題。演算法和程序之間存在密切的關系。
J. 怎樣哈夫曼演算法的正確性
代碼如下:
void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[])
/*建立葉結點個數為n,權值數組為weight[]的哈夫曼樹*/
{int i,j,m1,m2,x1,x2;<br/>/*哈夫曼樹hafftree[]初始化,n個葉結點共有2n-1個結點*/<br/>for(i=0;i<2*n-1;i++)<br/>{if(i<n) {hafftree[i].data=data[i];<br/>hafftree[i].weight=weight[i]; /*葉結點*/<br/>}
else {hafftree[i].weight=0; /*非葉結點*/<br/>hafftree[i].data='\0';<br/>}
hafftree[i].parent=0; /*初始化沒有雙親結點*/
hafftree[i].flag=0;
hafftree[i].leftchild=-1;
hafftree[i].rightchild=-1;
}
for(i=0;i<n-1;i++) /*構造哈夫曼樹n-1個非葉結點*/
{m1=m2=MAXVALUE;<br/>x1=x2=0;<br/>for(j=0;j<n+i;j++)<br/>{if(hafftree[j].weight<m1&&hafftree[j].flag==0)<br/>{m2=m1;<br/>x2=x1;<br/>m1=hafftree[j].weight;<br/>x1=j;<br/>}
else if(hafftree[j].weight<m2&&hafftree[j].flag==0)
{m2=hafftree[j].weight;<br/>x2=j;<br/>}
}
hafftree[x1].parent=n+i;
hafftree[x2].parent=n+i;
hafftree[x1].flag=1;
hafftree[x2].flag=1;
hafftree[n+i].weight=hafftree[x1].weight+hafftree[x2].weight;
hafftree[n+i].leftchild=x1;
hafftree[n+i].rightchild=x2;
}
}
void haffmancode(struct haffnode hafftree[],int n,struct haffcode haffcode[])
{/*由n個結點的哈夫曼樹hafftree[]構成的哈夫曼編碼haffcode[]*/
int i,j,child,parent;
struct haffcode newcode;
struct haffcode *cd;
cd=&newcode;
for(i=0;i<n;i++) /*求n個結點的哈夫曼編碼*/
{cd->start=MAXBIT-1; /*不等長編碼的最後一位是n-1*/<br/>cd->weight=hafftree[i].weight;<br/>cd->data=hafftree[i].data; /*取得編碼對應值的字元*/<br/>child=i;<br/>parent=hafftree[child].parent;<br/>while(parent!=0)<br/>{if(hafftree[parent].leftchild==child)<br/>cd->bit[cd->start]=0; /*左孩子編碼為0*/<br/>else<br/>cd->bit[cd->start]=1; /*右孩子編碼為1*/<br/>cd->start--;<br/>child=parent;<br/>parent=hafftree[child].parent;<br/>}
for(j=cd->start+1;j<MAXBIT;j++) /*保存每個葉結點的編碼和等長編碼的起始位*/
haffcode[i].bit[j]=cd->bit[j];
haffcode[i].data=cd->data;
haffcode[i].start=cd->start;
haffcode[i].weight=cd->weight;
}
}