零、bfs有關
解決問題:邊權只有0與1的最短路
演算法的整體框架與一般的廣搜類似,只是在每個節點沿分支拓展時稍作改變。如果這條分支邊權為0,則從隊首入隊,否則從隊尾入隊。這樣我們能保證,任意時刻廣搜佇列中節點對應的距離值都有「兩端性」和「單調性」,每個節點第一次被訪問時,就能得到從左上角到該節點的最短距離。
例題:[usaco08jan]telephone lines s
一、迭代加深dfs
當搜尋深度達到約束值卻還沒找到可行解時結束搜尋。如果我們在乙個深度約束下沒有搜尋到答案,那麼答案一定在更深的位置,那麼就把約束深度調整到更深,然後再次搜尋,直到搜尋到答案為止。
估價函式:在實際運用中,如果沒有乙個合適的方法來剪枝,迭代加深搜尋也會很容易超時。好在迭代加深搜尋有乙個比較特殊的剪枝方法,就是對當前的情況通過乙個樂觀估計函式進行預估,如果發現即使在最好的情況下搜尋到當前的最深深度限制也沒辦法得到答案,那麼就及時退出來實現剪枝。這個其實叫做可行性剪枝。也是下文的ida*。
二、a*
優化優先佇列bfs。這裡真正要用到上面提到的估價函式。這裡有個要求:設當前狀態\(u\)到目標估計值\(f(u)\),實際得出\(g(u)\),必須滿足\(f(u)。即估計值是更優的。
這個演算法的關鍵就在於設計優秀的估價函式。
三、ida*
考慮優化迭代加深的dfs,利用和a* 一樣的思路。a* 的思路有乙個缺陷,空間消耗大而且每次對堆操作花費\(o(\log n)\)時間。所以對迭代加深dfs拓展成類似a* 的形式就是ida*。
關鍵點來了:綜合一下迭代加深和a*,得出限制:若當前深度+未來估計步數》深度限制,就回溯。
練習:p1379 八數碼難題
p4467 [scoi2007]k短路
p2324 [scoi2005]騎士精神
四、極大極小搜尋法 與 alpha-beta剪枝
適用範圍:博弈題。
部落格推薦
極大極小搜尋法:正方形代表自己的選擇,圓形代表對方的選擇。每個節點表示對我的利益值。正方形的值即為兒子中最大值,圓形為兒子中最小值。
b總是選擇候選方案中的最小值,而a總是選擇候選方案中的最大值,極小極大的名字也就源於此。該演算法使用深度優先搜尋(depth first search)遍歷決策樹來填充樹中間節點的利益值,葉子節點的利益值通常是通過乙個利益評估函式計算。
alpha-beta剪枝:假設α為下界,β為上界,對於α ≤ n ≤ β:
若 α ≤ β 則n有解。 若 α > β 則n無解。初始設定α為負無窮大,β為正無窮大。 每次回溯的時候,父親節點的α或β值進行修改即可。這樣就可以剪掉很多無用狀態。
練習:poj 1085 三角點格棋
五、跳舞鏈(dancing links)
適用問題:求解精確覆蓋問題。
部落格推薦
部落格推薦
主要是通過新建雙向鍊錶來完成回溯。
可以把dancing links的求解過程表述如下
dancing函式的入口
判斷head.right=head?,若是,輸出答案,返回true,退出函式。
獲得head.right的元素c
標示元素c
獲得元素c所在列的乙個元素
標示該元素同行的其餘元素所在的列首元素
獲得乙個簡化的問題,遞迴呼叫daning函式,若返回的true,則返回true,退出函式。
若返回的是false,則回標該元素同行的其餘元素所在的列首元素,回標的順序和之前標示的順序相反
獲得元素c所在列的下乙個元素,若有,跳轉到步驟6
若沒有,回標元素c,返回false,退出函式。
練習p4929 【模板】舞蹈鏈(dlx)
搜尋的技巧
如圖,如果想要的不是自己想要的結果,可以使用 這個減號即可對指定內容進行排除.用 or 或 邏輯進行搜尋 or站內搜尋 這裡寫描述 在輸入框輸入 site 關鍵字 就會在輸入的 內進行站內關鍵字搜尋 善用 星號 這裡寫描述 原諒我比較懶,就拿這個說吧,這個其實是應該放到第五個裡的,想想了放到了這,搜...
奇怪的電梯 bfs搜尋
呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第ii層樓 1 le i le n 1 i n 上有乙個數字k i 0 le k i le n ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按...
Lucene搜尋優化技巧 索引篇
索引 1 t.termtext 替換為new string t.termbuffer 0,t.termlength 2 stringreader 和tokenstream物件都需要close 3 索引時document只用乙個 field只用幾個 乙個document物件對應多個field例項 fi...