1. Trang chủ
  2. » Tất cả

Bài giảng toán rời rạc tìm kiếm trên đồ thị (version 0 4) trần vĩnh đức

20 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Tìm kiếm trên đồ thị (Version 0 4) Trần Vĩnh Đức HUST Ngày 29 tháng 7 năm 2018 1 / 57CuuDuongThanCong com https //fb com/tailieudientucntt http //cuuduongthancong com?src=pdf https //fb com/tailieudie[.]

CuuDuongThanCong.com Tìm kiếm đồ thị (Version 0.4) Trần Vĩnh Đức HUST Ngày 29 tháng năm 2018 https://fb.com/tailieudientucntt / 57 Tài liệu tham khảo ▶ S Dasgupta, C H Papadimitriou, and U V Vazirani, Algorithms, July 18, 2016 ▶ Chú ý: Nhiều hình vẽ tài liệu lấy tùy tiện mà chưa xin phép CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Nội dung Biểu diễn đồ thị Tìm kiếm theo chiều sâu đồ thị vơ hướng Tìm kiếm theo chiều sâu đồ thị có hướng Thành phần liên thông mạnh CuuDuongThanCong.com https://fb.com/tailieudientucntt Biểu diễn đồ thị dùng Ma trận kề Nếu đồ thị có n = |V| đỉnh v1 , v2 , , , ma trận kề mảng n × n với phần tử (i, j) { có cạnh từ vi tới vj aij = ngược lại Ví dụ CuuDuongThanCong.com v2   1 A = 0 1 v1 v3 https://fb.com/tailieudientucntt / 57 Dùng ma trận kề có hiệu quả? ▶ Có thể kiểm tra có cạnh nối cặp đỉnh cần lần truy cập nhớ ▶ Tuy nhiên, không gian lưu trữ O(n2 ) CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Biểu diễn đồ thị dùng danh sách kề ▶ Dùng mảng Adj gồm |V| danh sách ▶ Với đỉnh u ∈ V, phần tử Adj[u] lưu trữ danh sách hàng xóm u Có nghĩa rằng: Adj[u] = {v ∈ V | (u, v) ∈ E} Ví dụ CuuDuongThanCong.com Adj[0] = {0, 1, 2} Adj[1] = {2} Adj[2] = {1} https://fb.com/tailieudientucntt / 57 Dùng danh sách kề có hiệu quả? ▶ Có thể liệt kê đỉnh kề với đỉnh cho trước cách hiệu ▶ Nó cần khơng gian lưu trữ O(|V| + |E|) Ít O(|V|2 ) nhiều đồ thị cạnh CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Nội dung Biểu diễn đồ thị Tìm kiếm theo chiều sâu đồ thị vơ hướng Tìm kiếm theo chiều sâu đồ thị có hướng Thành phần liên thơng mạnh CuuDuongThanCong.com https://fb.com/tailieudientucntt EALIZETHATTHEORDERINWHICHEDGES WHICHVERTICESAPPEARINTHEARRAYOF H M T E R E CâutinyG.txt hỏi đỉnh đồ thị ta có tớiGraph tinyG.txt đỉnh nào? % thể java T VTừ 13 E 13 vertices, 13 edges 13 Y 0: 5 1: T 2: 0 first adjacent N 3: CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Tìm đường mê cung Algorithms 83 Figure 3.2 Exploring a graph is rather like navigating a maze L K D G H A B C F F E I J J K H B E C G L I A D Hình: Tìm kiếm đồ thị giống tìm đường mê cung 3.2 Depth-first search in undirected graphs 3.2.1 Exploring mazes Depth-first search is a surprisingly versatile linear-time procedure that reveals a wealth of information about a graph The most basic question it addresses is, What CuuDuongThanCong.com parts of the graph are reachable from a given vertex? https://fb.com/tailieudientucntt 10 / 57 procedure explore(G, v) Input: đồ thị G = (V, E); v ∈ V Output: visited(u)=true với đỉnh u đến từ v visited(v) = true previsit(v) for each edge (v, u) ∈ E: if not visited(u): explore(G, u) postvisit(v) CuuDuongThanCong.com https://fb.com/tailieudientucntt 11 / 57 Ví dụ: Kết chạy explore(G, A) A Chapter Figure 3.2 Exploring is rather like navigating a maze Figure 3.4a graph The result of explore(A) on the graph of Figure L K D A B A F E B B G H C F I J F E J K L I J C I E D G C H A For instance, while B was being visited, the edge B − E was n 3.2 Depth-first in undirected graphs was as search yet unknown, was traversed via a call to explore(E ) form a tree (a connected graph with no cycles) and are therefo 3.2.1 Exploring mazesedges were ignored because they led back to familia The dotted CuuDuongThanCong.com https://fb.com/tailieudientucntt 12 / 57 Tìm kiếm theo chiều sâu procedure dfs(G) for all v ∈ V: visited(v) = false for all v ∈ V : if not visited(v): explore(G, v) CuuDuongThanCong.com https://fb.com/tailieudientucntt 13 / 57 during explore(x) and once during explore(y) The overall time for step is therefore O(|E |) and so the depth-first search has a running time of O(|V| + |E |), linear in the size of its input This is as efficient as we could possibly hope for, since it takes this long even just to read the adjacency list Ví dụ: Đồ thị Rừng DFS Figure 3.6 (a) A 12-node graph (b) DFS search forest (a) (b) A B C 1,10 11,22 23,24 A C F D B E 4,9 12,21 D I 5,8 13,20 H 2,3 E F G H I J K L J 14,17 G 6,7 L 18,19 K 15,16 Figure 3.6 shows the outcome of depth-first search on a 12-node graph, once again breaking ties alphabetically (ignore the pairs of numbers for the time being) The outer loop of DFS calls explore three times, on A, C , and finally F As a result, there are three trees, each rooted at one of these starting points Together they constitute a forest CuuDuongThanCong.com https://fb.com/tailieudientucntt 14 / 57 Bài tập Xây dựng rừng DFS cho đồ thị sau với đỉnh lấy theo thứ tự từ điển Vẽ cạnh nét đứt CuuDuongThanCong.com https://fb.com/tailieudientucntt 15 / 57 Rừng vàforest số thành (b) DFSDFS search (b) phần liên thông 1,10 11,22 23,24 A C F B E 4,9 12,21 D I 5,8 13,20 H 2,3 J 14,17 G 6,7 L 18,19 K 15,16 v A B C D E F G H I J ccnum[v] 1 2 2 1 Biến ccnum[v] để xác định thành phần liên thông đỉnh v depth-first search on a 12-node graph, once again re the pairs of numbers for the time being) The CuuDuongThanCong.com https://fb.com/tailieudientucntt 16 / 57 Tính liên thơng đồ thị vô hướng procedure dfs(G) cc = for all v ∈ V: visited(v) = false for all v ∈ V: if not visited(v): cc = cc + explore(G, v) procedure explore(G, v) visited(v) = true previsit(v) for each edge (v, u) ∈ E: if not visited(u): explore(G, u) postvisit(v) procedure previsit(v) ccnum[v] = cc CuuDuongThanCong.com https://fb.com/tailieudientucntt 17 / 57 Bài tập Hãy cài đặt chương trình tìm số thành phần liên thơng đồ thị vô hướng CuuDuongThanCong.com https://fb.com/tailieudientucntt 18 / 57 previsit postvisit ▶ Lưu thời gian lần đầu đến đỉnh mảng pre ▶ Lưu thời gian lần cuối rời khỏi đỉnh mảng post ▶ Để tính hai thơng tin ta dùng đếm clock, khởi tạo 1, cập nhật sau: CuuDuongThanCong.com procedure previsit(v) pre[v] = clock clock = clock + procedure postvisit(v) post[v] = clock clock = clock + https://fb.com/tailieudientucntt 19 / 57 Bài tập Vẽ rừng DFS với số pre post cho đỉnh cho đồ thị sau CuuDuongThanCong.com https://fb.com/tailieudientucntt 20 / 57 ... O(|V|2 ) nhiều đồ thị cạnh CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Nội dung Biểu diễn đồ thị Tìm kiếm theo chiều sâu đồ thị vơ hướng Tìm kiếm theo chiều sâu đồ thị có hướng Thành... đồ thị vơ hướng Tìm kiếm theo chiều sâu đồ thị có hướng Thành phần liên thơng mạnh CuuDuongThanCong.com https://fb.com/tailieudientucntt Biểu diễn đồ thị dùng Ma trận kề Nếu đồ thị có n = |V|... July 18, 201 6 ▶ Chú ý: Nhiều hình vẽ tài liệu lấy tùy tiện mà chưa xin phép CuuDuongThanCong.com https://fb.com/tailieudientucntt / 57 Nội dung Biểu diễn đồ thị Tìm kiếm theo chiều sâu đồ thị vơ

Ngày đăng: 27/02/2023, 07:58