Professional Documents
Culture Documents
Tìm kiếm theo chiều sâu (mục 20.3 Depth-first search, từ trang 736)
Tìm kiếm theo chiều sâu (mục 20.3 Depth-first search, từ trang 736)
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
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 đó
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
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
DFS (G)
2 u.color = TRẮNG
3 U.π = NIL
4 lần = 0
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)
6 v.π = u
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
là
đượ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
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
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 +
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.
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
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
▪
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.
Đị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.
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.
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
⇐: 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
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
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ả
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ị
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à
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-
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.
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:
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à
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
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.