半年前在POJ上遇到過一次剪枝的題目,那時(shí)覺得剪枝好神秘。。。今天在網(wǎng)上查了半天資料,終于還是摸索到了一點(diǎn)知識(shí),但是相關(guān)資料并不多,在我看來,剪枝是技巧,而不是方法,也就是說,可能一點(diǎn)實(shí)用的小技巧,讓程序可以少判斷一點(diǎn),這就是剪枝,剪枝無處不在,
搜索的進(jìn)程可以看作是從樹根出發(fā),遍歷一棵倒置的樹—-搜索樹的過程。而所謂的剪枝,顧名思義,就是通過某種判斷,避免一些不必要的遍歷過程,形象的說,就是減去了搜索樹中的某些“枝條”,故稱剪枝。
(杭電課件上是這么說的:即剪去解答樹上已被證明不可能存在可行解或最優(yōu)解的子樹.)
既然采用了搜索,剪枝就顯得十分的必要,即使就簡(jiǎn)簡(jiǎn)單單的設(shè)一個(gè)檻值,或多加一兩條判斷,就可對(duì)搜索的效率產(chǎn)生驚人的影響。例如N后問題,假如放完皇后再判斷,則僅僅只算到7,就開始有停頓,到了8就已經(jīng)超過了20秒,而如果邊放邊判斷,就算到了10,也沒有停頓的感覺。所以,用搜索一般都就要剪枝。
剪枝至少有兩方面,一是從方法上剪枝,如采用分枝定界,啟發(fā)式搜索等,適用范圍比較廣;二是使用一些小技巧,這類方法適用性雖不如第一類,有時(shí)甚至只能適用一道題,但也十分有效,并且?guī)缀趺康李}都存在一些這樣那樣的剪枝技巧,只是每題有所不同而已。
剪枝的原則:
1.正確性:必須保證不丟失正確的結(jié)果。
2.準(zhǔn)確性:能夠盡可能多的減去不能通向正解的枝條
3.高效性:在很多時(shí)候,為了加強(qiáng)優(yōu)化的效果,我們會(huì)增加一些判斷,這樣對(duì)程序效率也帶來了副作用,所以要考慮剪枝的高效性,否則得不償失。
最后說一下:剪枝在搜索中用的是非常的廣泛的。
(
參照杭電課件第47頁一句話:
ACMer們:
為了ACM事業(yè),努力地剪枝吧?。?br>)
題目我不多說,HDOJ 1010就是一個(gè)很好的剪枝題目。
HDOJ 1010解答:
http://www.wutianqi.com/?p=1345
另外,杭電的課件–搜索篇里面也講了搜索與剪枝。
posted on 2010-09-19 15:12
Tanky Woo 閱讀(2142)
評(píng)論(0) 編輯 收藏 引用