1. 數據結構題目,廣度優先和深度優先
(一)深度優先搜索的特點是:
(1)從上面幾個實例看出,可以用深度優先搜索的方法處理的題目是各種
各樣的。
有的搜索深度是已知和固定的,如例題2-4,2-5,2-6;有的是未知的,如例題2-7、例題2-8;
有的搜索深度是有限制的,但達到目標的深度是不定的。
但也看到,無論問題的內容和性質以及求解要求如何不同,它們的程序結構
都是相同的,即都是深度優先演算法(一)和深度優先演算法(二)中描述的演算法結
構,不相同的僅僅是存儲結點數據結構和產生規則以及輸出要求。
(2)深度優先搜索法有遞歸以及非遞歸兩種設計方法。一般的,當搜索深度較小、問題遞歸方式比較明顯時,用遞歸方法設計好,它可以使得程序結構更簡捷易懂。當搜索深度較大時,如例題2-5、2-6。當數據量較大時,由於系統堆棧容量的限制,遞歸容易產生溢出,用非遞歸方法設計比較好。
(3)深度優先搜索方法有廣義和狹義兩種理解。廣義的理解是,只要最新產生的結點(即深度最大的結點)先進行擴展的方法,就稱為深度優先搜索方法。在這種理解情況下,深度優先搜索演算法有全部保留和不全部保留產生的結點的兩種情況。而狹義的理解是,僅僅只保留全部產生結點的演算法。本書取前一種廣義的理解。
不保留全部結點的演算法屬於一般的回溯演算法范疇。
保留全部結點的演算法,
實際上是在資料庫中產生一個結點之間的搜索樹,
因此也屬於圖搜索演算法的范疇。
(4)不保留全部結點的深度優先搜索法,由於把擴展望的結點從資料庫中彈出刪除,這樣,一般在資料庫中存儲的結點數就是深度值,因此它佔用的空間較少,所以,當搜索樹的結點較多,用其他方法易產生內存溢出時,深度優先搜索不失為一種有效的演算法。
(5)從輸出結果可看出,深度優先搜索找到的第一個解並不一定是最優解。例如例題2-8得最優解為13,但第一個解卻是17。如果要求出最優解的話,一種方法將是後面要介紹的動態規劃法,另一種方法是修改原演算法:把原輸出過程的地方改為記錄過程,即記錄達到當前目標的路徑和相應的路程值,並與前面已記錄的值進行比較,保留其中最優的,等全部搜索完成後,才把保留的最優解輸出。
二、廣度優先搜索法的顯著特點是:
(1)在產生新的子結點時,深度越小的結點越先得到擴展,即先產生它的子結點。為使演算法便於實現,存放結點的資料庫一般用隊列的結構。
(2)無論問題性質如何不同,利用廣度優先搜索法解題的基本演算法是相同的,但資料庫中每一結點內容,產生式規則,根據不同的問題,有不同的內容和結構,就是同一問題也可以有不同的表示方法。
(3)當結點到跟結點的費用(有的書稱為耗散值)和結點的深度成正比時,特別是當每一結到根結點的費用等於深度時,用廣度優先法得到的解是最優解,但如果不成正比,則得到的解不一定是最優解。這一類問題要求出最優解,一種方法是使用後面要介紹的其他方法求解,另外一種方法是改進前面深度(或廣度)優先搜索演算法:找到一個目標後,不是立即退出,而是記錄下目標結點的路徑和費用,如果有多個目標結點,就加以比較,留下較優的結點。把所有可能的路徑
都搜索完後,才輸出記錄的最優路徑。
(4)廣度優先搜索演算法,一般需要存儲產生的所有結點,占的存儲空間要比深度優先大得多,因此程序設計中,必須考慮溢出和節省內存空間得問題。
(5)比較深度優先和廣度優先兩種搜索法,廣度優先搜索法一般無回溯操作,即入棧和出棧的操作,所以運行速度比深度優先搜索演算法法要快些。
總之,一般情況下,深度優先搜索法佔內存少但速度較慢,廣度優先搜索演算法佔內存多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。因此在選擇用哪種演算法時,要綜合考慮。決定取捨
2. 數據結構深度優先遍歷:
圖的深度優先遍歷類似於樹的前序遍歷。首先訪問出發點a,並將其標記為已訪問過;然後依次從a出發搜索a的每個鄰接點b,c,e。若b未曾訪問過,則以b為新的出發點繼續進行深度優先遍歷,直至圖中所有和源點a有路徑相通的頂點(亦稱為從源點可達的頂點)均已被訪問為止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重復上述過程,直至圖中所有頂點均已被訪問為止。
所以從a出發,找a的下一個點,a下一個點有b、c、e,首先到b,再以b為源點,再看b有沒有下一個點,發現b的下一個點是e,再以e為源點,e的下一個點是d,再以d為源點,下一個點是f,再以f的下一個點是c。
這樣全部的點都得到了,該序列就是該圖的深序優先遍歷。即abedfc,選A。
這里剛好一次就全部遍歷了,要是沒有下一個點的話,還要回到上一個點,繼續查找其它點。以此類推。
希望我的回答對您有幫助~如果有不清楚的可以繼續問我。
3. 深度優先搜索和廣度優先搜索反映在數據結構上的差別是什麼
深優
演算法框架(遞歸基本演算法)
Procere DFS(dep);
begin
For i:=1 to max_i do {共有max_i種可能情況}
If 某種可能符合條件 then begin
採用這種可能情況;
if 達到目標 then 輸出
else dfs(dep+1);
把這種情況取消;
end;
end;
廣優
一. 演算法框架
Program BFS;
初始化,存儲初始狀態(記錄初始結點);
設隊列首指針closed=0;隊列尾指針open:=1;
repeat
首指針closed後移一格,取其所指向的結點;
for r:=1 to max_r do
begin
if子結點符合條件 且 子結點沒有重復擴展 then
begin
尾指針open加1;把新結點存入隊列尾;
記錄相關信息;
if 達到目標 then 輸出且結束;
end;
until closed>=open(隊列空)
加分啊!!!
4. 實現圖的廣度優先搜索演算法需使用的輔助數據結構是什麼
廣度優先用隊列,深度優先用棧。簡單說明如下:
廣度優先:當一個節點被加入回隊列時,要標記答為已遍歷,遍歷過程中,對於隊列第一個元素,遍歷其所有能夠能一步達到的節點,如果是標記未遍歷的,將其加入隊列,從第一個元素出發所有能一步直接達到的節點遍歷結束後將這個元素出列。
深度優先:當遍歷到某個節點A時,如果是標記未遍歷,將其入棧,遍歷它能夠一步直接達到的節點,如果是標記未遍歷,將其入棧且標記為已遍歷,然後對其進行類似A的操作,否則找能夠一步直接達到的節點進行類似操作。直到所有能夠一步直接達到的節點都已遍歷,將A出棧。
這里使用「能夠能一步達到的節點」而非「與其相鄰的節點」是考慮到有向圖因素。
具體可以找個圖,然後使用廣度和深度演算法搜索一遍,每步自己手工修改隊列和棧就明白怎麼回事了。
5. 數的深度優先遍歷使用什麼數據結構
我幫你復習一下圖的知識:
深度優先遍歷:
深度優先就是從樹的某個節點開始搜索,查看它所有的領結點,如果這個鄰接點的無其他鄰接點,則忽略該節,再次訪問下個節,以此類推,一直到訪問到的鄰接點再沒有其它的鄰接點為止,這個節點就是開始,然後依此回退。訪問中要將訪問過的節點作標記。
廣度優先遍歷:
廣度優先就是從樹的某個節點開始搜索,將他的所有的節點先用隊列機制保存,找完節點後,處理隊列中的節點,處理時,如果某個節點又有鄰接點就進隊列,以此訪問完整個樹,這個訪問相當與二叉樹的層次遍歷訪問。
我的語言表達能力有限,不知能否看懂。
所以這題,依次往下跑,到H時跑不動了,所以H是頭,然後到I,依次類推,跟二叉樹訪問用後續法差不多。
D項很容易得到。
其實這題用排除法,直接選D。