TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ THỊ CÓ HƯỚNG ĐƯỢC BIỂU DIỄN BỞI DANH SÁCH KỀ VÀ ỨNG DỤNG VÀO SẮP XẾP TÔPÔ

17 1.4K 1
TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ THỊ CÓ HƯỚNG ĐƯỢC BIỂU DIỄN BỞI DANH SÁCH KỀ VÀ ỨNG DỤNG VÀO SẮP XẾP TÔPÔ

Đ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

TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ THỊ CÓ HƯỚNG ĐƯỢC BIỂU DIỄN BỞI DANH SÁCH KỀ VÀ ỨNG DỤNG VÀO SẮP XẾP TÔPÔ

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Viện Công nghệ Thông tin Truyền thông BÀI TẬP LỚN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI: TÌM KIẾM THEO CHIỀU SÂU TRÊN ĐỒ THỊ CÓ HƯỚNG ĐƯỢC BIỂU DIỄN BỞI DANH SÁCH KỀ VÀ ỨNG DỤNG VÀO SẮP XẾP TƠPƠ NHĨM Giáo viên hướng dẫn: PGS Nguyễn Đức Nghĩa Cấu trúc liệu giải thuật HÀ NỘI – 2010 NỘI DUNG A- B- Định nghĩa ADT I- Đồ thị II-Danh sách kề Bài tốn tìm kiếm theo chiều sâu đồ thị có hướng biểu diễn danh sách kề I-Phát biểu toán II-Ứng dụng tốn tìm kiếm theo chiều sâu C- Ứng dụng tốn tìm kiếm theo chiều sâu đồ thị có hướng biểu diễn danh sách kề vào tốn xếp tơpơ A-Định nghĩa ADT Cấu trúc liệu giải thuật I-Đồ thị 1.Khái niệm đồ thị Đồ thị G cấu trúc rời rạc bao gồm hai tập - Tập đỉnh V(G) tập hữu hạn khác rỗng - Tập cạnh E(G) tập hữu hạn tập rỗng cặp (u,v) u,v ∈V Kí hiệu G=(V,E) Các loại đồ thị Phụ thuộc vào kiểu cạnh nối số lượng cạnh nối hai đỉnh mà ta phân biệt loại đồ thị khác 2.1 Đồ thị vô hướng Đơn (đa) đồ thị vô hướng G = (V,E) cặp gồm: - Tập đỉnh V tập hữu hạn phần tử, phần tử gọi đỉnh - Tập cạnh E tập (họ) thứ tự dạng (u, v), u, v ∈ V, u≠v 2.2 Đồ thị có hướng Đơn (đa) đồ thị có hướng G = (V,E) cặp gồm: Tập đỉnh V tập hữu hạn phần tử, phần tử gọi đỉnh Tập cung E tập (họ) có thứ tự dạng (u, v), u, v ∈ V, u≠v 3.Biểu diễn đồ thị 3.1.Biểu diễn đồ thị ma trận kề 3.2.Biểu diễn đồ thị danh sách kề 3.3.Biểu diễn đồ thị danh sách cạnh 4.Các thao tác thường gặp xử lý đồ thị - incidentEdge(v)- duyệt đỉnh kề đỉnh v - areAdjacent(v,w)- trả lại giá trị true v w kề - insertVertex(z)-bổ sung đỉnh z - insertEdge(v)-bổ sung cạnh e=(v,w) - removeVertex(v)-loại bỏ đỉnh v - removeEdge(e)-loại bỏ cạnh e Các thuật tốn duyệt đồ thị 5.1.Thuật tốn tìm kiếm theo chiều rộng (BFS) 5.2.Thuật tốn tìm kiếm theo chiều sâu (DFS) II-Danh sách kề Với đỉnh v cất giữ danh sách đỉnh kề với Cấu trúc liệu giải thuật -Là mảng Ke gồm có | V| danh sách -Mỗi đỉnh có danh sách -Với u ∈V, Ke[u] bao gồm tất đỉnh kề u Ví dụ a) Biểu diễn đồ thị vô hướng G=(V,E) sử dung danh sách kề u v w v u w w u v x z y v z x y t b) Bộ nhớ đòi hỏi = a|V|+2b|E| Biểu diễn đồ thị có hướng G=(V,E) sử dụng danh sách kề a b b e c b c d e b f f Bộ nhớ địi hỏi = a|V|+b|E| Có thể sử dụng mô tả C sau để biểu diễn danh sách kề #define MAX_ VERTICES 500 Typedef struct node*node_ptr; Typedef struct node { int vertex; node_ptr link; } node; node_ptr graph[MAX_VERTICES]; B-Bài tốn tìm kiếm theo chiều sâu đồ thị có hướng biểu diễn danh sách kề Cấu trúc liệu giải thuật I-Phát biểu tốn 1.Ý tưởng chung cho thuật tốn tìm kiếm -Trong q trình thực hịện thuật tốn , đỉnh có ba trạng thái sau: + Chưa thăm thể màu trắng + Đã thăm (nhưng chưa duyệt xong) thể màu xám + Đã duyệt xong thể màu đen Thuật tốn tìm kiếm theo chiều sâu (depth first search) Input: G=(V,E) – đồ thị vơ hướng có hướng Output: Với v ∈V d[v]= thời điểm bắt đầu thăm(v chuyển từ màu trắng sang xám) f[v]= thời điểm kết thúc thăm(v chuyển từ màu xám sang đen) π[v]: từ đỉnh ta đến thăm đỉnh v Rừng tìm kiếm theo chiều sâu(gọi tắt rừng DFS – Forest of depth-first trees): Gπ=(V,Eπ), Eπ={(π[v] , v): v∈V π[v] ≠ null} 2.1.thuật tốn tìm kiếm theo chiều sâu đỉnh u DFS-Visit(u) 1.color[u] ← GRAY 2.time ← time+1 3.d[u] ← time 4.for v ∈ Adj[u] if color[v]=WHITE then π [v] ←u DFS-Visit(v) 8.color[u]← BLACK 9.f[u] ← time ← time+1 2.2.thuật toán theo chiều sâu đồ thị G DFS(G) for u ∈V[G] color[u] ← white π[u] ← NULL Time ← for u ∈V[G] if color[u] = white then DFS-Visit(u) Quá trình thực thuật tốn trình diễn hình minh hoạ sau Cấu trúc liệu giải thuật u v w 1/ / / / / / x y z u v DFS(u): Thăm đỉnh u DFS(n) w DFS(v): thăm đỉnh v 1/ 2/ / DFS(u) DFS(v) / / x y u v / z w DFS(y): thăm đỉnh y 1/ 2/ DFS(u) / DFS(v) / 3/ / x y z DFS(y) Cấu trúc liệu giải thuật u v w DFS(y): thăm đỉnh y 1/ 2/ DFS(u) / DFS(v) 4/ 3/ / x y z DFS(y) DFS(x) u v w Kết thúc thăm đỉnh x 1/ 2/ DFS(u) / DFS(v) 4/5 3/ x y / z DFS(y) DFS(x) Cấu trúc liệu giải thuật u v w Kết thúc thăm đỉnh y 1/ 2/ DFS(u) / DFS(v) 4/5 3/6 / x y z DFS(y) DFS(x) u v w Kết thúc thăm đỉnh v 1/ 2/7 DFS(u) / DFS(v) 4/5 3/6 / x y z DFS(y) DFS(x) Cấu trúc liệu giải thuật u v w Kết thúc thăm đỉnh u 1/8 2/7 DFS(u) / DFS(v) 4/5 3/6 / x y z DFS(y) DFS(x) u v w DFS(w): Thăm đỉnh w 1/8 2/7 9/ 4/5 3/6 / x y z u v w DFS(z): Thăm đỉnh z 1/8 2/7 9/ 4/5 3/6 10/ x y z Cấu trúc liệu giải thuật u v w Kết thúc thăm đỉnh z 1/8 2/7 9/ 4/5 3/6 10/11 x y z u v w 1/8 2/7 9/12 4/5 3/6 10/11 x y z Kết thúc thăm đỉnh w Kết thúc DFS(G) Rừng tìm kiếm gồm cây: DFS(u) DFS(w) u v w 1/8 2/7 9/12 4/5 3/6 10/11 x y DFS(u) z DFS(w) 3.Các tính chất DFS 10 Cấu trúc liệu giải thuật - Rừng DFS phụ thuộc vào thứ tự đỉnh duỵêt vòng lặp for duyệt đỉnh DFS(G) DFS_Visit(u) - Để gỡ đệ quy sử dụng ngăn xếp Và nói, điểm khác biệt DFS với BFS đỉnh thăm DFS cất giữ vào ngăn xếp thay hàng đợi BFS - Các khoảng thời gian thăm [d[v],f[v]] (parenthesis structure) đỉnh có cấu trúc lồng 4.Cấu trúc lồng (parenthesis structure) Định lý: Với u,v xảy tình sau: 1.d[u] < f[u] < d[v] < f[v] d[v] < f[v] < d[u] < f[u] ( nghĩa hai khoảng thời gian thăm u v dời nhau) u v khơng có quan hệ tổ tiênhậu duệ 2.d[u] < d[v] < f[v] < f[u] ( nghĩa khoảng thời gian thăm v lồng khoảng thời gian thăm u) v hậu duệ u 3.d[v] < d[u] < f[u] < f[v] (nghĩa khoảng thời gian thăm u lồng khoảng thời gian thăm v) u hậu duệ v Ví dụ: Xét việc thực thuật tốn tìm kiếm theo chiều sâu đồ thị cho hình vẽ 2/15 3/14 a b 4/5 c DFS(s) Tree 1/16 s 8/9 t d 11/12 e 6/13 Time stamps: d[]/t[] f 7/10 Hình vẽ sau minh hoạ cho định lý cấu trúc lồng nhau: 11 Cấu trúc liệu giải thuật s a b c e f d t 10 11 12 (s (a (b (c c) (e (f (t t) f) (d d) 13 14 e) 15 16 b) a) s) 5.Độ phức tạp DFS -Thuật toán thăm đỉnh v∈ V lần →Θ (|V|) - Với đỉnh v duyệt qua tất đỉnh kề, với đỉnh kề thực thao tác với thời gian số Do việc duyệt qua tất đỉnh thời gian Σv∈V|neighbors[v]| =Θ (|E|) - Tổng cộng Θ(|V|)+Θ (|E|) = Θ (|V|+|E|), hay Θ (|V|2) Như vậy, DFS có độ phức tạp BFS 6.Phân loại cạnh DFS tạo cách phân loại cạnh đồ thị cho: - Cạnh cây(Tree edge): cạnh mà theo từ đỉnh ta đến thăm đỉnh - Cạnh ngược (Back edge): từ cháu (descendent) đến tổ tiên(ancestor) - Cạnh tới (Forward edge): từ tổ tiên đến hậu duệ - Cạnh vịng (Cross edge): cạnh nối hai đỉnh ko có quan hệ họ hàng Để nhận biết cạnh (u,v) thuộc loại cạnh nào, ta dựa vào màu đỉnh v lần đầu cạnh (u,v) khảo sát Cụ thể, màu đỉnh v làp 12 Cấu trúc liệu giải thuật Trắng (u,v) cạnh Xám (u,v) cạnh ngược Đen (u,v) cạnh tới vòng Trong trường hợp để phân biệt cạnh tới cạnh vòng ta cần xét xem hai đỉnh u v có quan hệ họ hàng hay không nhờ sử dụng kết định lý cấu trúc lồng Nhiều ứng dụng DFS đòi hỏi nhận biết cạnh cạnh ngược, Hơn nữa, đồ thị vô hướng, DFS sản sinh hai loại cạnh khẳng định định lý sau - Định lý: G đồ thị vô hướng, DFS sản sinh cạnh cạnh ngược II-Ứng dụng thuật tốn tìm kiếm theo chiều sâu (DFS) • • • • • Tính liên thơng đồ thị Tìm đường từ s đến t Phát chu trình Kiểm tra tính liên thông mạnh Định hướng đồ thị C- Ứng dụng thuật tốn tìm kiếm theo chiều sâu đồ thị có hướng sử dụng danh sách kề vào toán xếp tơpơ I- Phát biểu tốn Bài tốn đặt : Cho đồ thị có hướng khơng có chu trình G=(V,E) tìm cách xếp đỉnh cho có cạnh (u,v) u phải trước v thứ tự (nói cách khác, cần tìm cách đánh số đỉnh đồ thị cho cung đồ thị hướng từ đỉnh có số nhỏ đến đỉnh có số lớn hơn) II-Thuật tốn xếp tơpơ Thuật tốn viết vắn tắt sau: Thực DFS(G), đỉnh duyệt xong ta đưa vào đầu danh sách lien kết (điều có nghĩa đỉnh kết thúc thăm muộn đầu danh sách hơn) Danh sách lien kết thu kết thúc DFS(G) cho ta thứ tự cần tìm TopoSort(G) for u∈ V color[u]=white; //khởi tạo 13 Cấu trúc liệu giải thuật L = new(linked_list); //khởi tạo danh sách liên kết rỗng for u∈ V if (color[u] == white) TopVisit(u); return L // L cho thứ tự cần tìm TopVisit(u){ 2 color[u] = gray; //bắt đầu tìm kiếm từ u for v ∈ Adj(u) //đánh dấu u thăm if (color[v]==white)TopVisit(v); Nạp u vào đầu danh sách L // u duyệt xong Cài đặt C void DFS(int vertex) { //printf(" %d ", vertex); pListIt p; color[vertex] = GRAY; // visited for (p = adjacencyList[vertex]; p != NULL; p = p -> p_next) if (!color[p -> value]) { ancient[p->value] = vertex; distance[p->value] = distance[vertex] +1; p->type = TREE_EDGE; DFS(p -> value); } else { if( color[p->value] == GRAY) { p->type = BACK_EDGE; isCircle = true; // print the circle printf(" \n Circle: "); int l = vertex; while(l != p->value) { printf( " %d ", l); l = ancient[l]; 14 Cấu trúc liệu giải thuật } printf( " %d ", l); } else if (distance[p->value] > distance[vertex]) { p->type = AHEAD_EDGE ; } else p->type = CROSS_EDGE ; } // add to the topological order ++atPos; topological_order[n-atPos] = vertex; color[vertex] = BLACK; } A B D A B 1/ D 1/ 2/ C E Linked list:∅ A C E Linked list:∅ B D 1/ A B D 1/4 15 Cấu trúc liệu giải thuật /3 C E Linked list: A C E Linked list: 2/3 1/4 2/3 E D E B D 5/ 1/4 C A B D 5/ 1/4 /3 6/ 2/3 E C E Linked list: A 2/3 Linked list: 1/4 2/3 1/4 2/3 D E D E B D 5/ 1/4 A B D 5/8 1/4 16 Cấu trúc liệu giải thuật 6/7 /3 C 6/7 E 2/3 C Linked list: E Linked list: 6/7 1/4 C 2/3 D E 5/8 6/7 1/4 2/3 B C D E A B D A B D 9/ 5/8 1/4 9/10 5/8 1/4 6/7 /3 C 6/7 E 2/3 C Linked list: E Linked list: 5/8 6/7 1/4 B C D 2/3 E 9/10 5/8 6/7 1/4 2/3 A B C D E III-Đánh giá độ phức tạp thuật tốn Thời gian tính TopoSort(G) O(|V|+|E|) 17 Cấu trúc liệu giải thuật 18 ... I- Đồ thị II -Danh sách kề Bài tốn tìm kiếm theo chiều sâu đồ thị có hướng biểu diễn danh sách kề I-Phát biểu toán II -Ứng dụng toán tìm kiếm theo chiều sâu C- Ứng dụng tốn tìm kiếm theo chiều sâu. .. mạnh Định hướng đồ thị C- Ứng dụng thuật toán tìm kiếm theo chiều sâu đồ thị có hướng sử dụng danh sách kề vào toán xếp tơpơ I- Phát biểu tốn Bài tốn đặt : Cho đồ thị có hướng khơng có chu trình... 3 .Biểu diễn đồ thị 3.1 .Biểu diễn đồ thị ma trận kề 3.2 .Biểu diễn đồ thị danh sách kề 3.3 .Biểu diễn đồ thị danh sách cạnh 4.Các thao tác thường gặp xử lý đồ thị - incidentEdge(v)- duyệt đỉnh kề

Ngày đăng: 10/04/2016, 14:10

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan