如何快速確定演算法的邊界條件?

如何快速的確定演算法的終止邊界條件,我每次去理解一個演算法時都要在邊界條件上糾結半天,有什麼技巧嗎

拿CocktailSort作例子

public static int[] cocktailSort(int[] src)
{
for(int i = 0 ; i &< src.length/2 ; i++) { for(int j = i ; j &< src.length-i-1 ; j++) { if(src[j] &< src[j+1]) { int temp = src[j]; src[j] = src[j+1]; src[j+1] = temp; } } for(int j = src.length-1-(i+1); j &> i ; j--)
{
if(src[j] &> src[j-1])
{
int temp = src[j];
src[j] = src[j-1];
src[j-1] = temp;
}
}
}
return src;
}


對邊界的考慮和處理是一種技能,是反映能一個人邏輯嚴密性的。一個人鍛煉邏輯嚴密性有速成方法么?沒有。在各種代碼面試的書籍上,邊界討論大多作為一個章節,是需要重點練習的。針對你說的,如何判斷一個演算法的終止邊界條件,演算法是一種調度方式,是思想。實現調度方式的是代碼,看代碼來理解思想,這件事本身就是一種需要長期磨練的技能啊。拿雞尾酒排序來說,思想是遍歷一遍排好最小和最大兩個數,那一共需要遍歷n/2遍。實現上做的小優化,比如你代碼中的

for(int j = src.length-1-(i+1); j &> i ; j--)

這一行,最小的數絕對不是已經排好的最大的那個數,所以從最大的數前面一位開始考慮。這個就是具體實現的時候你對代碼本身的理解了。

總之我想說的是,代碼是載體,演算法的思想是精髓,每一個演算法情況不一樣,思想不一樣,除了鍛煉看代碼,做優化的基礎能力。別無它法。

但是有一些經典題目是可以幫助你迅速提高這種能力的,比如Manacher演算法,KMP,DC3這些經典的演算法實現,自己寫一寫,還有多練ACM的題目,多看各個公司的代碼面試題,都是特別有幫助的。

我自己刷了600+的題目,有了一點點感覺,離大牛還遠。

希望我說的對您有幫助。


可以用一個較小的情況推模擬一下運行


去關注怎樣情況下問題算解決了,而不要在思考邊界條件時惦記過程。最容易理解的例子,漢諾塔問題。


推薦閱讀:

如何用非遞歸、不用棧的方法,實現原位(in-place)的快速排序?
AI 迅速發展,圍棋會有什麼樣的變局?
你所在的領域,理論與實際差得遠不遠?
沃羅諾伊圖(Voronoi Diagram,也稱作Dirichlet tessellation,狄利克雷鑲嵌 )是怎樣的?
嵌入式開發需要演算法嗎?

TAG:演算法 | 推薦演算法 | 排序演算法 | ACM競賽 |