You are on page 1of 10

20.

3 Tìm kiếm theo chiều sâu đầu tiên

Như tên gọi của nó, tìm kiếm đầu tiên theo chiều sâu tìm kiếm "sâu hơn" trong biểu đồ

bất cứ khi nào có thể. Tìm kiếm ưu tiên chiều sâu khám phá các cạnh nhiều nhất

Đỉnh V được phát hiện gần đây vẫn còn các cạnh chưa được khám phá rời khỏi nó.

Khi tất cả các cạnh của v đã được khám phá, tìm kiếm "backtrack" để

Khám phá các cạnh rời khỏi đỉnh mà từ đó V được phát hiện. Này

Quá trình tiếp tục cho đến khi tất cả các đỉnh có thể truy cập được từ bản gốc

Nguồn đỉnh đã được phát hiện. Nếu bất kỳ đỉnh nào chưa được khám phá vẫn còn,

Sau đó, tìm kiếm đầu tiên theo chiều sâu chọn một trong số chúng làm nguồn mới, lặp lại

Tìm kiếm từ nguồn đó. Thuật toán lặp lại toàn bộ quá trình này cho đến khi

Nó đã phát hiện ra mọi đỉnh.

Như trong tìm kiếm đầu tiên theo chiều rộng, bất cứ khi nào tìm kiếm theo chiều sâu đầu tiên phát
hiện ra một

đỉnh V trong quá trình quét danh sách liền kề của một đỉnh đã được phát hiện

Vertex U, nó ghi lại sự kiện này bằng cách đặt thuộc tính tiền nhiệm của V v.π cho bạn.

Không giống như tìm kiếm đầu tiên theo chiều rộng, có đồ thị con tiền nhiệm tạo thành một cây,

Tìm kiếm đầu tiên theo chiều sâu tạo ra một biểu đồ con tiền nhiệm có thể chứa

một số cây, vì việc tìm kiếm có thể lặp lại từ nhiều nguồn.

Do đó, chúng tôi xác định đồ thị con tiền nhiệm của tìm kiếm đầu tiên theo chiều sâu

hơi khác so với tìm kiếm đầu tiên theo chiều rộng: nó luôn bao gồm

tất cả các đỉnh, và nó chiếm nhiều nguồn. Cụ thể, đối với một

Tìm kiếm đầu tiên theo chiều sâu, đồ thị con tiền nhiệm là Gπ = (V, Eπ), trong đó

Eπ = {(v.π, v) : v ∈ V và v.π ≠ NIL}.

Biểu đồ con tiền nhiệm của tìm kiếm đầu tiên theo chiều sâu tạo thành độ sâu đầu tiên

rừng bao gồm một số cây đầu tiên sâu. Các cạnh trong Eπ là cây

Cạnh.

Giống như tìm kiếm đầu tiên theo chiều rộng, tìm kiếm đầu tiên theo chiều sâu tô màu các đỉnh
trong
tìm kiếm để cho biết trạng thái của họ. Mỗi đỉnh ban đầu có màu trắng, có màu xám

khi nó được phát hiện trong tìm kiếm, và bị đen khi nó kết thúc,

Đó là, khi danh sách liền kề của nó đã được kiểm tra hoàn toàn. Này

Kỹ thuật đảm bảo rằng mỗi đỉnh kết thúc ở chính xác một độ sâu đầu tiên

cây, để những cây này rời rạc.

Bên cạnh việc tạo ra một khu rừng đầu tiên có độ sâu, tìm kiếm độ sâu đầu tiên cũng

dấu thời gian trên mỗi đỉnh. Mỗi đỉnh v có hai dấu thời gian: dấu đầu tiên

Dấu thời gian V.D ghi lại khi V được phát hiện lần đầu tiên (và màu xám) và

Dấu thời gian thứ hai V.F ghi lại khi tìm kiếm kết thúc kiểm tra V

Danh sách liền kề (và bôi đen v). Những dấu thời gian này cung cấp quan trọng

thông tin về cấu trúc của biểu đồ và nói chung là hữu ích

trong lý luận về hành vi của tìm kiếm chiều sâu đầu tiên.

Quy trình DFS trên trang đối diện ghi lại khi phát hiện ra

đỉnh u trong thuộc tính u.d và khi nó kết thúc đỉnh u trong thuộc tính

U.F. Các dấu thời gian này là các số nguyên từ 1 đến 2 |V|, vì có một

Sự kiện khám phá và một sự kiện kết thúc cho mỗi |V| Đỉnh. Cho

mọi đỉnh u,

Đỉnh u là TRẮNG trước thời gian u.d, XÁM giữa thời gian u.d và thời gian

u.f, và BLACK sau đó. Trong quy trình DFS, đồ thị đầu vào G

có thể không được định hướng hoặc chỉ đạo. Thời gian biến đổi là một biến toàn cục

được sử dụng để đánh dấu thời gian. Hình 20.4 minh họa tiến trình của DFS trên

đồ thị thể hiện trong Hình 20.2 (nhưng với các đỉnh được gắn nhãn bằng chữ cái

chứ không phải là những con số).

DFS (G)

1 cho mỗi đỉnh u ∈ G.V

2 u.color = TRẮNG

3 U.π = NIL
4 lần = 0

5 cho mỗi đỉnh u ∈ G.V

6 nếu you.color == TRẮNG

7 DFS-TRUY CẬP (G, u)

DFS-TRUY CẬP (G, u)

1 lần = thời gian + 1 // đỉnh trắng u vừa được phát hiện

2 u.d = thời gian

3 màu u = XÁM

4 cho mỗi đỉnh v trong G.Adj[u]// khám phá từng cạnh (u, v)

5 nếu v.color == TRẮNG

6 v.π = u

7 DFS-TRUY CẬP (G, v)

8 lần = thời gian + 1

9 u.f = thời gian

10 u.color = ĐEN // làm đen u; Nó đã hoàn thành

Quy trình DFS hoạt động như sau. Các đường thẳng 1–3 vẽ tất cả các đỉnh

trắng và khởi tạo các thuộc tính π của chúng thành NIL. Dòng 4 đặt lại toàn cục

bộ đếm thời gian. Các dòng 5–7 lần lượt kiểm tra từng đỉnh trong V và, khi a

đỉnh trắng được tìm thấy, truy cập nó bằng cách gọi DFS-VISIT. Theo mọi cuộc gọi của

DFS-VISIT(G, u) ở dòng 7, đỉnh u trở thành gốc của một cây mới trong

khu rừng đầu tiên sâu thẳm. Khi DFS trả về, mọi đỉnh u đã được

Chỉ định thời gian khám phá U.D và thời gian kết thúc U.F.

Trong mỗi lần gọi DFS-VISIT(G, u), đỉnh u ban đầu có màu trắng. Dòng 1–3

Tăng thời gian biến toàn cục, ghi lại giá trị mới của thời gian dưới dạng

Discovery Time U.D, và sơn màu xám U. Các đường thẳng 4–7 kiểm tra từng đỉnh v

Liền kề với bạn và đệ quy truy cập V nếu nó có màu trắng. Như dòng 4 xem xét từng

đỉnh v ∈ Adj[u], tìm kiếm độ sâu đầu tiên khám phá cạnh (u, v). Cuối cùng

Sau mỗi cạnh rời khỏi U đã được khám phá, các dòng thời gian gia tăng 8–10,
Ghi lại thời gian hoàn thành trong U.F và sơn chữ U màu đen.

Kết quả tìm kiếm theo chiều sâu đầu tiên có thể phụ thuộc vào thứ tự

đường thẳng 5 của DFS kiểm tra các đỉnh và theo thứ tự trong đó dòng 4

của DFS-VISIT thăm những người hàng xóm của một đỉnh. Những cuộc viếng thăm khác nhau này

Đơn đặt hàng có xu hướng không gây ra vấn đề trong thực tế, bởi vì nhiều

Các ứng dụng của tìm kiếm chiều sâu đầu tiên có thể sử dụng kết quả từ bất kỳ chiều sâu đầu tiên
nào

tìm kiếm.

Hình 20.4 Tiến trình của thuật toán tìm kiếm chiều sâu đầu tiên DFS trên đồ thị có hướng. Các cạnh

được phân loại khi chúng được khám phá: các cạnh cây được dán nhãn T, cạnh sau B, cạnh về phía
trước F và chữ thập

cạnh C. Dấu thời gian trong các đỉnh cho biết thời gian khám phá/thời gian kết thúc. Các cạnh cây là

được tô sáng màu xanh lam. Các điểm nổi bật màu cam biểu thị các đỉnh có thời gian khám phá
hoặc kết thúc thay đổi

và các cạnh được khám phá trong từng bước.

Thời gian chạy của DFS là bao nhiêu? Các vòng lặp trên các dòng 1–3 và các dòng

5-7 DFS mất thời gian Θ (V), không bao gồm thời gian để thực hiện các cuộc gọi đến

CHUYẾN THĂM DFS. Như chúng tôi đã làm cho tìm kiếm đầu tiên theo chiều rộng, chúng tôi sử
dụng tổng hợp

Phân tích. Thủ tục DFS-VISIT được gọi chính xác một lần cho mỗi

đỉnh v ∈ V, vì đỉnh u mà DFS-VISIT được gọi phải

có màu trắng và điều đầu tiên DFS-VISIT làm là sơn đỉnh u màu xám.

Trong quá trình thực hiện DFS-VISIT (G, v), vòng lặp trong dòng 4–7 thực thi

|Adj[v]| lần. Kể từ σv∈V |Adj[v]| = Θ(E) và DFS-VISIT được gọi một lần

trên mỗi đỉnh, tổng chi phí thực hiện các đường 4–7 của DFS-VISIT là Θ (V +

E). Do đó, thời gian chạy của DFS là Θ (V + E).

Thuộc tính của tìm kiếm theo chiều sâu đầu tiên
Tìm kiếm theo chiều sâu đầu tiên mang lại thông tin có giá trị về cấu trúc của một

đồ thị. Có lẽ thuộc tính cơ bản nhất của tìm kiếm chiều sâu đầu tiên là

Đồ thị con tiền nhiệm Gπ thực sự tạo thành một rừng cây, vì

Cấu trúc của những cây đầu tiên có chiều sâu phản ánh chính xác cấu trúc của

các cuộc gọi đệ quy của DFS-VISIT. Nghĩa là, u = v.π nếu và chỉ khi DFS-

VISIT (G, v) đã được gọi trong quá trình tìm kiếm danh sách liền kề của bạn.

Ngoài ra, đỉnh v là hậu duệ của đỉnh u trong khu rừng sâu đầu tiên

Nếu và chỉ khi V được phát hiện trong thời gian u có màu xám.

Một thuộc tính quan trọng khác của tìm kiếm chiều sâu đầu tiên là khám phá đó

và thời gian hoàn thành có cấu trúc dấu ngoặc đơn. Nếu thủ tục DFS-VISIT

đã in dấu ngoặc đơn trái "(u" khi nó phát hiện ra đỉnh u và đến

In dấu ngoặc đơn bên phải "U)" khi nó kết thúc U, sau đó in

biểu thức sẽ được hình thành tốt theo nghĩa là dấu ngoặc đơn là

lồng nhau đúng cách. Ví dụ: tìm kiếm theo chiều sâu đầu tiên của Hình 20.5 (a)

tương ứng với dấu ngoặc đơn thể hiện trong Hình 20.5(b). Các

Định lý sau đây cung cấp một cách khác để mô tả dấu ngoặc đơn

cấu trúc.

Định lý 20.7 (Định lý trong ngoặc đơn)

Trong bất kỳ tìm kiếm sâu đầu tiên nào của đồ thị (có hướng hoặc không định hướng) G = (V, E),

Với hai đỉnh u và v bất kỳ, chính xác là một trong ba đỉnh sau

Điều kiện giữ:

Các khoảng [U.D, U.F] và [V.D, V.F] hoàn toàn rời rạc, và cả hai đều không

u cũng không v là hậu duệ của người kia trong khu rừng sâu đầu tiên,

Khoảng [U.D, U.F] được chứa hoàn toàn trong khoảng [v.d,

v.f], và bạn là hậu duệ của v trong một cây đầu tiên sâu, hoặc

Khoảng [v.d, v.f] được chứa hoàn toàn trong khoảng [u.d,

u.f], và V là hậu duệ của bạn trong một cái cây đầu tiên sâu.
Bằng chứng Chúng tôi bắt đầu với trường hợp u.d < v.d. Chúng tôi xem xét hai

Các trường hợp phụ, theo V.D có < U.F hay không. Trường hợp con đầu tiên xảy ra khi

V.D < U.F, do đó V được phát hiện trong khi U vẫn còn màu xám, ngụ ý

Rằng V là hậu duệ của bạn. Hơn nữa, vì v được phát hiện sau u, tất cả

Các cạnh đi của nó được khám phá, và V đã kết thúc, trước khi tìm kiếm

trở về và kết thúc U. Do đó, trong trường hợp này, khoảng [v.d, v.f] là

hoàn toàn nằm trong khoảng [U.D, U.F]. Trong trường hợp phụ khác, u.f

< v.d, và bởi bất bình đẳng (20.4), u.d < u.f < v.d < v.f, và do đó

Các khoảng [U.D, U.F] và [V.D, V.F] rời rạc. Bởi vì các khoảng thời gian là

rời rạc, không có đỉnh nào được phát hiện trong khi đỉnh kia có màu xám, và như vậy

Cả hai đỉnh đều không phải là hậu duệ của đỉnh kia.

Hình 20.5 Thuộc tính của tìm kiếm theo chiều sâu đầu tiên. (a) Kết quả của một cuộc tìm kiếm đầu
tiên theo chiều sâu của một hướng đi

đồ thị. Các đỉnh được đánh dấu thời gian và các loại cạnh được biểu thị như trong Hình 20.4. (b)
Khoảng thời gian cho

Thời gian khám phá và thời gian kết thúc của mỗi đỉnh tương ứng với dấu ngoặc đơn được hiển thị.

Mỗi hình chữ nhật kéo dài khoảng thời gian được đưa ra bởi thời gian khám phá và kết thúc của
tương ứng

đỉnh. Chỉ có các cạnh cây được hiển thị. Nếu hai khoảng chồng lên nhau, thì một khoảng được lồng
trong khoảng kia,

và đỉnh tương ứng với khoảng nhỏ hơn là hậu duệ của đỉnh tương ứng

đến lớn hơn. (c) Đồ thị của phần (a) được vẽ lại với tất cả các cạnh cây và phía trước đi xuống

trong một cây đầu tiên sâu và tất cả các cạnh sau đi lên từ một hậu duệ đến một tổ tiên.

Trường hợp v.d < u.d cũng tương tự, với vai trò của u và v

đảo ngược trong lập luận trên.


Hệ quả 20.8 (Làm tổ của các khoảng thời gian của con cháu)

Đỉnh v là hậu duệ thích hợp của đỉnh u trong khu rừng sâu đầu tiên cho a

Đồ thị G (có hướng hoặc không định hướng) khi và chỉ khi u.d < v.d < v.f < u.f.

Chứng minh ngay lập tức từ Định lý 20.7.

Định lý tiếp theo đưa ra một đặc tính quan trọng khác về khi

Một đỉnh là hậu duệ của một đỉnh khác trong khu rừng sâu đầu tiên.

Định lý 20.9 (Định lý đường trắng)

Trong rừng đầu tiên có độ sâu của đồ thị (có hướng hoặc không định hướng) G = (V, E),

Đỉnh V là hậu duệ của đỉnh U khi và chỉ khi tại thời điểm u.d rằng

Tìm kiếm phát hiện ra U, có một con đường từ U đến V bao gồm hoàn toàn màu trắng

Đỉnh.

Chứng minh ⇒: Nếu v = u, thì đường đi từ u đến v chỉ chứa đỉnh u,

vẫn có màu trắng khi U.D nhận được một giá trị. Bây giờ, giả sử rằng v là một

Hậu duệ đúng nghĩa của bạn trong khu rừng sâu đầu tiên. Theo hệ quả 20.8, u.d <

V.D, và vì vậy V là màu trắng tại thời điểm U.D. Vì v có thể là bất kỳ hậu duệ nào của bạn, tất cả

Các đỉnh trên con đường đơn giản độc đáo từ U đến V trong khu rừng sâu đầu tiên

có màu trắng tại thời điểm U.D.

⇐: Giả sử có một đường đi của các đỉnh màu trắng từ u đến v tại thời điểm

U.D, nhưng V không trở thành hậu duệ của bạn trong cây đầu tiên sâu.

Không mất tính tổng quát, giả sử rằng mọi đỉnh khác với v dọc

Con đường trở thành hậu duệ của bạn. (Nếu không, hãy để v là gần nhất

Đỉnh cho bạn dọc theo con đường không trở thành hậu duệ của bạn.) Hãy để w

Là tiền thân của V trong đường dẫn, để W là hậu duệ của U (W và

u trên thực tế có thể là cùng một đỉnh). Bởi Hệ quả 20.8, w.f ≤ u.f. Bởi vì v

phải được phát hiện sau khi u được phát hiện, nhưng trước khi w kết thúc, U.D <

v.d < w.f ≤ U.f. Định lý 20.7 sau đó ngụ ý rằng khoảng [v.d, v.f] là
chứa hoàn toàn trong khoảng [U.D, U.F]. Theo hệ quả 20.8, v

Dù sao cũng phải là hậu duệ của ngươi.

Phân loại các cạnh

Bạn có thể lấy thông tin quan trọng về biểu đồ bằng cách phân loại nó

cạnh trong quá trình tìm kiếm độ sâu đầu tiên. Ví dụ: Mục 20.4 sẽ hiển thị

rằng đồ thị có hướng là tuần hoàn nếu và chỉ khi tìm kiếm theo chiều sâu đầu tiên mang lại kết quả

không có cạnh "lưng" (Lemma 20.11).

Rừng đầu tiên độ sâu Gπ được tạo ra bởi tìm kiếm độ sâu đầu tiên trên đồ thị

G có thể chứa bốn loại cạnh:

1. Mép cây là rìa trong rừng sâu Gπ. Cạnh (u, v) là một

Cạnh cây nếu V lần đầu tiên được phát hiện bằng cách khám phá cạnh (u, v).

2. Các cạnh sau là các cạnh (u, v) nối một đỉnh u với một

Tổ tiên V trong một cây đầu tiên sâu. Chúng tôi xem xét các vòng lặp tự động, mà

có thể xảy ra trong đồ thị có hướng, là cạnh sau.

3. Các cạnh phía trước là các cạnh không phải cây (u, v) nối một đỉnh

Bạn đến một hậu duệ thích hợp V trong một cây đầu tiên sâu.

4. Các cạnh chéo là tất cả các cạnh khác. Chúng có thể đi giữa các đỉnh trong

cùng một cây đầu tiên sâu, miễn là một đỉnh không phải là tổ tiên

của cái kia, hoặc chúng có thể đi giữa các đỉnh ở độ sâu khác nhau-

cây đầu tiên.

Trong Hình 20.4 và 20.5, nhãn cạnh cho biết các loại cạnh. Hình 20.5(c)

cũng cho thấy cách vẽ lại đồ thị của Hình 20.5 (a) sao cho tất cả các cây

và các cạnh phía trước hướng xuống trong một cái cây đầu tiên sâu và tất cả trở lại
các cạnh đi lên. Bạn có thể vẽ lại bất kỳ biểu đồ nào theo cách này.

Thuật toán DFS có đủ thông tin để phân loại một số cạnh

khi nó gặp phải chúng. Ý tưởng chính là khi một cạnh (u, v) là đầu tiên

Được khám phá, màu sắc của đỉnh V nói lên điều gì đó về cạnh:

1. MÀU TRẮNG biểu thị cạnh cây,

2. XÁM biểu thị cạnh sau và

3. MÀU ĐEN biểu thị cạnh phía trước hoặc chéo.

Trường hợp đầu tiên là ngay lập tức từ đặc điểm kỹ thuật của thuật toán. Cho

Trường hợp thứ hai, quan sát thấy các đỉnh màu xám luôn tạo thành một tuyến tính

chuỗi hậu duệ tương ứng với chồng DFS-VISIT đang hoạt động

lời khẩn cầu. Số đỉnh màu xám nhiều hơn 1 so với độ sâu trong

Khu rừng đầu tiên của đỉnh được phát hiện gần đây nhất. Độ sâu đầu tiên

Tìm kiếm luôn khám phá từ đỉnh màu xám sâu nhất, để một cạnh

Một đỉnh màu xám khác đã đạt đến tổ tiên. Trường hợp thứ ba

xử lý các khả năng còn lại. Bài tập 20.3-5 yêu cầu bạn chỉ ra rằng

Một cạnh như vậy (U, V) là một cạnh phía trước nếu U.D < V.D và một cạnh chéo nếu U.D >

V.D.

Theo định lý sau, các cạnh tiến và chéo không bao giờ

xảy ra trong tìm kiếm đầu tiên theo chiều sâu của một biểu đồ không định hướng.

Định lý 20,10

Trong tìm kiếm sâu đầu tiên của đồ thị không định hướng G, mọi cạnh của G là

hoặc mép cây hoặc mép sau.

Chứng minh Cho (u, v) là một cạnh tùy ý của G, và giả sử không mất

tổng quát rằng U.D < v.d. Sau đó, trong khi u là màu xám, tìm kiếm phải khám phá

và kết thúc v trước khi nó kết thúc U, vì V nằm trong danh sách liền kề của U. Nếu lần đầu tiên

thời gian mà tìm kiếm khám phá cạnh (u, v), nó theo hướng từ u đến v,

Sau đó, V không được phát hiện (màu trắng) cho đến thời điểm đó, nếu không thì việc tìm kiếm

sẽ khám phá cạnh này theo hướng từ V đến bạn. Vậy


(u, v) trở thành cạnh cây. Nếu tìm kiếm khám phá (u, v) đầu tiên trong

Hướng từ v đến u, thì (u, v) là cạnh sau, vì phải có một

Đường đi của mép cây từ U đến V.

Vì (u, v) và (v, u) thực sự là cùng một cạnh trong một không định hướng

đồ thị, chứng minh Định lý 20.10 cho biết cách phân loại cạnh. Khi

tìm kiếm từ một đỉnh, phải có màu xám, nếu đỉnh liền kề là

màu trắng, sau đó cạnh là một cạnh cây. Nếu không, cạnh là cạnh sau.

Hai phần tiếp theo áp dụng các định lý trên về chiều sâu đầu tiên

tìm kiếm.

Hình 20.6 Một đồ thị có hướng để sử dụng trong Bài tập 20.3-2 và 20.5-2.

You might also like