搜尋專題
1.什麼是搜素?
搜尋演算法是利用計算機的高效能來有目的地窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。
相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移(按照要求拓展)到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案(目標的狀態)。
2.搜尋演算法
廣度優先搜尋(bfs)
深度優先搜尋(dfs)
bfs
基本思想:從初始狀態s 開始,利用規則,生成所有可能的狀態。構成的下一層節點,檢查是否出現目標狀態g,若未出現,就對該層所有狀態節點,分別順序利用規則。
生成再下一層的所有狀態節點,對這一層的所有狀態節點檢查是否出現g,若未出現,繼續按上面思想生成再下一層的所有狀態節點,這樣一層一層往下展開。直到出現目標狀態為止。
具體過程:
1 每次取出佇列首元素(初始狀態),進行拓展
2 然後把拓展所得到的可行狀態都放到佇列裡面
3 將初始狀態刪除
4 一直進行以上三步直到隊列為空。
框架:while not queue.empty ()
begin
可加結束條件
tmp = queue.top ()
從tmp迴圈拓展下乙個狀態next
if 狀態next合法 then
begin
生成新狀態next
next.step = tmp.step + 1
queue.pushback (next)
endqueue.pop ()
enddfs
基本思想:從初始狀態,利用規則生成搜尋樹下一層任乙個結點,檢查是否出現目標狀態,若未出現,以此狀態利用規則生成再下一層任乙個結點,再檢查,重複過程一直到葉節點(即不能再生成新狀態節點),當它仍不是目標狀態時,回溯到上一層結果,取另一可能擴充套件搜尋的分支。採用相同辦法一直進行下去,直到找到目標狀態為止。
具體實現過程
1 每次取出棧頂元素,對其進行拓展。
2 若棧頂元素無法繼續拓展,則將其從棧中彈出。繼續1過程。
3 不斷重複直到獲得目標狀態(取得可行解)
或棧為空(無解)。
框架:(1)遞迴實現:
function dfs (int step, 當前狀態)
begin
可加結束條件
從當前狀態迴圈拓展下乙個狀態next
if 狀態next合法 then
dfs (step + 1, next ))
end(2)非遞迴實現
非遞迴實現:
while not stack.empty ()
begin
tmp = stack.top()
從tmp拓展下乙個未拓展的狀態next
if 沒有未拓展狀態(到達葉節點) then
stack.pop()
else if 狀態next合法 then
stack.push(next)
end二分搜尋演算法
簡單定義:在乙個單調有序的集合中查詢元素,每次將集合分為左右兩部分,判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。
時間複雜度:o (logn),優於直接順序查詢o(n)
查詢連續 函式的寫法:
//x:待查詢的值,caculate():所要查詢的函式,在這裡單調遞增
//需保證查詢的值在區間範圍內
double low=「區間下界」,high=「區間上界」,mid;
while(high - low > 1.0e-6)
void solve(void)
}專題感悟:
(1)演算法真是無窮無盡的
(2)做題的過程中感覺到「理論和實踐之間還有很遠的距離」
(3)思考問題要靈活一點
(4)在做這個專題的題目時,感覺很多題到了最後其實考驗的是數學功底。雖然大一自己學的是數學分析,但是還是覺得數學水平不夠
(5)寫出**之後要考慮如何優化,盡可能的減少演算法的時間複雜度
(6)自己太弱了,被題目虐的很慘!!!
個人總結報告(二)
部落格班級 作業要求 homework 11633 姓名張樂曉 學號31801122 組號第4小組 院系浙大城市學院計算機系 在這一階段,我完成的內容主要是同時性加工測試的實現,介面文件的編寫以及小組總結報告。介面文件 在這一階段,我完成了自己負責的測試部分的開發,同時與後端溝通完成一些需要的介面的...
C 總結報告
經過大約一周的時間,程式設計a課程逐漸接近了尾聲。下面將介紹一下心得。t1 輸入乙個百分制的成績t,將其轉換成對應的等級。這道題並不難,我們只需要利用條件語句if就能輕而易舉的完成這道題。另外,作為第一題,這道題並沒有出現所謂的陷阱。下面讓我們看一下源 includeusing namespace ...
年度總結報告
2021.1.21 此3個月間,我完成了3個練習,兩個與c 程式設計相關,乙個與linux系統相關,其餘時間閱讀學習了 c primer plus 6th.ed 都是在打牢專業基礎。總的來說,我接觸到c 物件導向的特性 c 繼承和多型的機制 c 標準多執行緒庫 不同的c 編碼風格 qt的gui介面設...