日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记忆化搜索的研究

發布時間:2025/6/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记忆化搜索的研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



記憶化搜索:

?

算法上依然是搜索的流程,但是搜索到的一些解用動態規劃的那種思想和模式作一些保存。

一般說來,動態規劃總要遍歷所有的狀態,而搜索可以排除一些無效狀態。

更重要的是搜索還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。

記憶化算法在求解的時候還是按著自頂向下的順序,但是每求解一個狀態,就將它的解保存下來,以后再次遇到這個狀態的時候,就不必重新求解了。這種方法綜合了搜索和動態規劃兩方面的優點,因而還是很有實用價值的。上傳/更換附件動態規劃的另一種實現形式——記憶化搜索的應用。

?

動態規劃和記憶化搜索:

?

動態規劃:就是一個最優化問題,先將問題分解為子問題,并且對于這些分解的子問題自身就是最優的才能在這個基礎上得出我們要解決的問題的最優方案,要不然的話就能找到一個更優的解來替代這個解,得出新的最優自問題,這當然是和前提是矛盾的。動態規劃不同于 貪心算法,因為貪心算法是從局部最優來解決問題,而動態規劃是全局最優的。用動態規劃的時候不可能在子問題還沒有得到最優解的情況下就做出決策,而是必須等待子問題得到了最優解之后才對當下的情況做出決策,所以往往動態規劃都可以用 一個或多個遞歸式來描述。而貪心算法卻是先做出一個決策,然后在去解決子問題。這就是貪心和動態規劃的不同。

一般遇到一個動態規劃類型的問題,都先要確定最優子結構,還有重疊子問題,這兩個是動態規劃最大的特征,然后就是要寫 動態規劃的?狀態方程,這個步驟十分十分的重要的,寫動歸方程是需要一定的經驗的,這可以通過訓練來達到目的。接著就是要自底向上的求解問題的,先將最小規模的子問題的最優解求出,一般都用一張表來記錄下求得的解,到后來遇到同樣的子問題的時候就可以直接查表得到答案,最后就是通過一步一步的迭代得出最后問題的答案了。

我的理解最重要的東西就是一定會要一個數組或者其他的存儲結構存儲得到的子問題的解。這樣就可以省很多時間,也就是典型的空間換時間

動態規劃的一種變形就是記憶化搜索,就是根據動歸方程寫出遞歸式,然后在函數的開頭直接返回以前計算過的結果,當然這樣做也需要一個存儲結構記下前面計算過的結果,所以又稱為記憶化搜索。

?

記憶化搜索/遞歸式動態規劃:

?

1.記憶化搜索的思想

????記憶化搜索的思想是,在搜索過程中,會有很多重復計算,如果我們能記錄一些狀態的答案,就可以減少重復搜索量

2、記憶化搜索的適用范圍

????根據記憶化搜索的思想,它是解決重復計算,而不是重復生成,也就是說,這些搜索必須是在搜索擴展路徑的過程中分步計算的題目,也就是“搜索答案與路徑相關”的題目,而不能是搜索一個路徑之后才能進行計算的題目,必須要分步計算,并且搜索過程中,一個搜索結果必須可以建立在同類型問題的結果上,也就是類似于動態規劃解決的那種。

也就是說,他的問題表達,不是單純生成一個走步方案,而是生成一個走步方案的代價等,而且每走一步,在搜索樹/圖中生成一個新狀態,都可以精確計算出到此為止的費用,也就是,可以分步計算,這樣才可以套用已經得到的答案

3、記憶化搜索的核心實現

?????a.?首先,要通過一個表記錄已經存儲下的搜索結果,一般用哈希表實現

?????b.狀態表示,由于是要用哈希表實現,所以狀態最好可以用數字表示,常用的方法是把一個狀態連寫成一個p進制數字,然后把這個數字對應的十進制數字作為狀態

????c.在每一狀態搜索的開始,高效的使用哈希表搜索這個狀態是否出現過,如果已經做過,直接調用答案,回溯

????d.如果沒有,則按正常方法搜索

4、記憶化搜索是類似于動態規劃的,不同的是,它是倒做的“遞歸式動態規劃”。

?

?

?下面POJ 1691 paint a borad的題目:

?

先用普通的深度優先搜索來解答。

在這道題中需要注意的是:

1、如何記錄某個矩形的信息,這里包括了坐標、顏色、是否涂色、上方矩形的個數、下方有哪幾個矩形。

這些都是從便于程序設計的角度抽象出來的。

2、為了得到最少使用刷子的次數,涂色策略應該為:把當前可以涂色的矩形全部涂色。

3、還需要注意如何通過坐標判斷:緊鄰的處于上方的矩形

?

[cpp]?view plaincopy
  • /*?
  • ?*??POJ1691?Paint?a?board?
  • ?*??按照規則給board涂油漆,求出最少使用刷子的次數??
  • ?*??思路:原本想使用廣度搜索,但由于搜索樹的不同父節點的子節點之間存在關聯關系,?
  • ?*??????????使用BFS不是很方便處理,所以使用深度搜索。??
  • */??
  • ??
  • #include<iostream>??
  • //#include<fstream>??
  • #include<cstdio>??
  • #include<cstring>??
  • #define?MAX_NUM?15???
  • using?namespace?std;???
  • ??
  • typedef?struct?rect{??
  • ??????
  • ????int?x1,y1;??
  • ????int?x2,y2;??
  • ????int?color;??
  • ????bool?isPainted;??
  • ??????????
  • }Rect;??
  • ??
  • //保存所有矩形的數組,下標從1開始???
  • Rect?rectArray[MAX_NUM+1];??
  • //rectUp記錄某個矩形上面有多少個緊鄰的矩形?rectDown用于保存當前矩形下面緊鄰的是哪幾塊矩形???
  • int?rectUp[MAX_NUM+1],rectDown[MAX_NUM+1][MAX_NUM+1];??
  • //minBrushes?記錄最少使用刷子的次數?rectNum?記錄當前board中的矩形數量???
  • int?minBrushes,rectNum;??
  • ??
  • ??
  • //為當前可著色的矩形著色???
  • void?color(int?c){??
  • ??????
  • ????for(int?i=1?;i<=?rectNum?;?i++)??{??
  • ??????????
  • ????????if(?rectArray[i].color!=c?||?rectArray[i].isPainted?||?rectUp[i]?)??continue?;??
  • ????????rectArray[i].isPainted?=?true?;??
  • ????????for(int?j=1?;?j<=?rectNum?;?j++?){??
  • ??????????????
  • ????????????if(?rectDown[i][j]?)????rectUp[j]--?;??
  • ????????}??
  • ????}??
  • ??????
  • }??
  • ??
  • ??
  • //深度搜索的核心算法???
  • void?depthSearch(int?brushes){??
  • ??????
  • ????int?i,j,k?;???
  • ??????
  • ????if(?brushes?>=?minBrushes?)??return?;????????????????//剪枝1?:如果超過當前的搜索到的最少的使用刷子次數???
  • ??????
  • ????for(?i=1?;?i<=rectNum?;?i++){????????????????????????//尋找還沒有被涂色的矩形???
  • ??????????
  • ????????if(?false?==?rectArray[i].isPainted)??
  • ????????????break;??
  • ????}??
  • ??????
  • ????if(?i?==?rectNum?+1?){??????????????????????????????//如果所有的矩形都被涂色,則返回???
  • ??????????
  • ????????minBrushes?=?brushes?;??
  • ????????return?;??
  • ????}??
  • ??????
  • ????//用于保存臨時狀態???
  • ????bool?tmp_isPainted[MAX_NUM+1];??
  • ????int?tmp_rectUp[MAX_NUM+1],tmp_rectDown[MAX_NUM+1][MAX_NUM+1];??
  • ??????
  • ????for(?i=1?;?i<=rectNum?;?i++)?{??
  • ??????????
  • ????????if(?rectArray[i].isPainted?||?rectUp[i]?)???continue?;??
  • ??????????
  • ????????//狀態備份???
  • ????????for(?j?=1?;?j<=rectNum?;?j++){??
  • ??????????????
  • ????????????tmp_rectUp[j]?=?rectUp[j]?;??
  • ????????????tmp_isPainted[j]?=?rectArray[j].isPainted?;??
  • ????????????for(k=1?;?k<=rectNum?;?k++){??
  • ??????????????????
  • ????????????????tmp_rectDown[j][k]?=?rectDown[j][k];??
  • ????????????}??
  • ????????}??
  • ??????????
  • ????????color(?rectArray[i].color?);??
  • ??????????
  • ????????depthSearch(?brushes?+1?);??
  • ??????????
  • ????????//狀態還原???
  • ????????for(?j?=1?;?j<=rectNum?;?j++){??
  • ??????????????
  • ????????????rectUp[j]?=?tmp_rectUp[j]?;??
  • ????????????rectArray[j].isPainted??=??tmp_isPainted[j]?;??
  • ????????????for(k=1?;?k<=rectNum?;?k++){??
  • ??????????????????
  • ?????????????????rectDown[j][k]?=?tmp_rectDown[j][k];??
  • ????????????}??
  • ????????}??
  • ??????????
  • ????}??
  • ??????????
  • ??????
  • }??
  • ??
  • ??
  • int?main(){??
  • ??????
  • ????//ifstream?in("test.txt");??
  • ??????
  • ????//testCase?測試例子的數量??
  • ????int?testCase;??
  • ????int?i,j;??
  • ??????
  • ????cin>>testCase?;??
  • ??????
  • ????for(i=0?;i<testCase?;?i++){??
  • ??????????
  • ????????cin>>rectNum?;??
  • ??????????
  • ????????//初始化全局數組??
  • ????????memset(?rectUp?,?0?,sizeof(rectUp))?;??
  • ????????memset(?rectDown?,?0?,?sizeof(rectDown)?);??
  • ??????????
  • ??????????
  • ????????for(j=1?;?j<=rectNum?;?j++){??
  • ????????????//注意:坐標順序為(y,x)不是(x,y)???
  • ????????????cin>>rectArray[j].x1>>rectArray[j].y1>>rectArray[j].x2>>rectArray[j].y2>>rectArray[j].color;??
  • ????????????rectArray[j].isPainted?=?false?;??
  • ????????}??
  • ??????????
  • ????????for(i=1?;?i<=rectNum?;?i++?){??
  • ??????????????
  • ????????????for(?j=1?;?j<=rectNum?;j++){??
  • ??????????????????
  • ????????????????if(?i!=j?&&?(?rectArray[j].x2?==?rectArray[i].x1)?&&???
  • ????????????????????/*?
  • (?rectArray[i].y1<=?rectArray[j].y1?&&?rectArray[i].y2>=?rectArray[j].y2)*/??
  • ????????????????????????!(rectArray[j].y2?<=?rectArray[i].y1?||?rectArray[j].y1?>=?rectArray[i].y2)){??
  • ??????????????????????????
  • ????????????????????????rectUp[i]++;????????????//rect?j?is?upon?rect?i??
  • ????????????????????????rectDown[j][i]=1?;??????//rect?i?is?under?rect?j??
  • ????????????????????}??
  • ????????????}??
  • ????????}??
  • ??????????
  • ????????minBrushes?=?MAX_NUM?;??
  • ????????depthSearch(0);??
  • ????????cout<<minBrushes<<endl;??
  • ????}??
  • ??????
  • ????return??0;??
  • }??
  • ?

    通過這道題可以看到dfs搜索算法的特點是這樣的:

    ?

    核心的搜索算法一般使用遞歸的形式,而且遞歸函數的參數往往直接和問題的求解對象有一定的關聯。還有就是,在搜索算法函數的開頭一般先放上剪枝條件,這樣主要是起到回溯的作用,否則的話,函數就會無限遞歸了。可以發現對深度搜索進行合適的剪枝可以大大提高搜索的效率。另外,在執行遞歸之前,一般先對當前的局面狀態進行保存,在遞歸函數返回時,在進行恢復。這有點類似于回溯算法的特點。其實dfs函數的參數表示的就是局面的一種狀態。

    ?

    ?

    下面對于這個問題使用記憶化搜索算法:


    總結

    以上是生活随笔為你收集整理的记忆化搜索的研究的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩欧美自拍 | 国产精品情侣呻吟对白视频 | a√在线观看 | 日本学生初尝黑人巨免费视频 | 天天爽一爽 | 91大神福利视频 | 欧美香蕉 | 91看片免费 | 美女激情网 | 成人精品在线视频 | 精品91av | 午夜精品久久久久久毛片 | 韩国三级免费 | 欧美性猛交xxxx乱大交 | 日韩欧美在线视频免费观看 | 久久久性色精品国产免费观看 | 好吊妞这里只有精品 | 国产精品综合久久久久久 | 日本成人免费在线视频 | 三级国产在线观看 | 国产91熟女高潮一区二区 | 欧美日韩亚洲国产一区 | 禁漫天堂在线 | 黄色在线观看免费视频 | 亚洲精品一区久久久久久 | 久操不卡| 中文字幕3页 | 国产精品国产三级国产专区51区 | 日韩精品啪啪 | 久久人人爽人人爽人人片亚洲 | 91嫩草香蕉 | 女生鸡鸡软件 | jizz免费| 少妇高潮惨叫久久久久 | 人妻精品一区二区三区 | 男女做爰猛烈刺激 | 日本人妻伦在线中文字幕 | 涩漫天堂 | 91在线无精精品白丝 | 欧美女优一区 | 91在线观看免费高清 | 俄罗斯色片 | 天天av天天操 | 国产精品主播一区二区 | 韩国甜性涩爱 | 国产女教师bbwbbwbbw | 日本成人在线视频网站 | 日本在线 | 欧美被狂躁喷白浆精品 | 国产成人精品在线观看 | 日本成人在线免费视频 | 夜夜草av | 亚洲国产二区 | 黄色在线免费看 | 99热热 | 国产精品综合久久久久久 | 亚洲欧美精品午睡沙发 | 成人看片黄a免费看视频 | 亚洲一区二区三区视频在线 | 黄av网 | 日本亲与子乱xxx | 秋霞久久精品 | 超碰最新网址 | 午夜在线观看一区 | 欧美视频在线观看免费 | 精品一区二三区 | 亚洲精品国产成人无码 | 羽月希奶水一区二区三区 | 爱情岛论坛自拍亚洲品质极速最新章 | 国产精品二 | 亚洲一区二区天堂 | 色悠久久综合 | 日韩激情小视频 | 亚洲com| 97久久超碰 | 成人毛片100部免费看 | 国产传媒欧美日韩 | 北岛玲av在线| 丰满女人又爽又紧又丰满 | 污视频网站在线播放 | 成人性生活视频 | 久久久无码18禁高潮喷水 | 岛国片在线播放 | 国久久久 | 无码一区二区三区免费视频 | 福利一区在线观看 | 亚洲精品欧美日韩 | 一区二区免费播放 | 91看片就是不一样 | 午夜视频网 | 日本激情免费 | 中文字幕在线观看视频免费 | 视频在线观看一区二区 | 国产内射老熟女aaaa∵ | 午夜激情视频在线 | 亚洲色图综合网 | 午夜tv影院| 蜜臀视频一区二区 | 久久天堂av综合合色蜜桃网 |