Giải Thuật Lập Trình Bfs Là Gì, Tìm Kiếm Theo Chiều Rộng

Xung quanh vị trí tổng hợp và share những kiến thức và kiến thức và kỹ năng ảnh hưởng tác động tới lời giải nói Kết luận và lý thuyết khoa học máy vi tính nói riêng. Bài Viết: Bfs là gì

Đồ thị — Introduction to Algorithmic Graph Theory

September 26, 2015 in Uncategorized | No comments Trong bài này và loạt bài tiếp theo sau sau tổng thể toàn bộ tất cả chúng ta sẽ làm quen với đồ thị và những thuật toán với đồ thị. Đồ thị là 1 trong những trong đối tượng người tiêu dùng quý khách người dùng tổ hợp (combinatorial object) được điều tra và nghiên cứu và ứng dụng không hề ít trong trong thực tiễn (chắc rằng hơi thừa khi viết điều đó). Phần này tổng thể toàn bộ tất cả chúng ta sẽ: Làm quen với những khái niệm cơ bản gắn với đồ thị Giải pháp thức màn màn biểu diễn đồ thị trong máy vi tính để chúng ta cũng có thể thao tác với nóDuyệt đồ thị theo chiều rộng (Breadth First Tìm kiếm)Duyệt đồ thị theo chiều sâu (Depth First Tìm kiếm) Bạn đọc rất rất có thể bỏ lỡ những phần mà tổng thể toàn bộ tất cả chúng ta đã quen thuộc. Note của Jeff Erickson vẫn chính là tài liệu tham khảo chính của bài này. Những khái niệm Một đồ thị, kí hiệu là $G(V,E)$, gồm hai thành phần: Tập hợp $V$, kể cả những đối tượng người tiêu dùng quý khách người dùng, được gọi là tập hợp những đỉnh (vertex) của đồ thịTập hợp $E subseteq V^2$, gồm 1 cặp những đỉnh, được gọi là tập hợp những cạnh (vertex) của đồ thị Ta sẽ kí hiệu $n,m$ lần lượt là số đỉnh và số cạnh của đồ thị, i.e, $|V| = n, |E|= m$. Số đỉnh của đồ thị đôi khi ta cũng gọi là bậc của đồ thị (order of the graph). Những đỉnh ta sẽ kí hiệu bằng những chữ in thường như $u,v,x,y,z$. Cạnh giữa hai đỉnh $u,v$ rất rất có thể là vô hướng hoặc được đặt theo hướng. Trong điều kiện đầu ta sẽ kí hiệu cạnh là $uv$, còn trong điều kiện sau ta sẽ kí hiệu là $u ightarrow v$ để chỉ rõ vị trí đặt vị trí hướng của cạnh là từ $u$ đến $v$. Đôi khi khi ta nói cạnh thì ta ám chỉ cạnh vô hướng còn với cùng 1 cạnh được đặt theo hướng ta sẽ gọi nó là 1 trong những trong cung (arc). Hình $(1,2)$ của hình sau này màn màn biểu diễn một đồ thị vô hướng (những cạnh là vô hướng) và hình $(3)$ phải của hình sau này màn màn biểu diễn một đồ thị được đặt theo hướng.

*

Một đồ thị vô hướng được gọi là liên thông (connected) nếu tồn tại một đường đi giữa mọi cặp điểm. Một đồ thị được đặt theo hướng gọi là liên thông (yếu) nếu đồ thị vô hướng chiếm được từ đồ thị đó bằng chiêu thức thức bỏ lỡ vị trí đặt vị trí hướng của cạnh là liên thông. Một đồ thị được đặt theo hướng gọi là liên thông mạnh (strongly connected) nếu tồn tại một đường đi được đặt theo hướng giữa mọi cặp điểm. Hiển nhiên nếu một đồ thị được đặt theo hướng liên thông mạnh thì nó cũng liên thông yếu. Mặc dù thế điều ngược lại chưa chắc đúng (ví dụ?). Ví dụ đồ thị $(1)$ phía bên dưới đó chính là không liên thông, đồ thị $(2)$ liên thông, đồ thị $(3)$ liên thông yếu (nhưng không mạnh) và đồ thị $(4)$ liên thông mạnh.

Xem Ngay:  Hyperventilation Là Gì - Nghĩa Của Từ Hyperventilation
*

Ta còn tồn tại thể phối kết hợp chiêu thức thức màn màn biểu diễn danh sách kề với một trong những kết cấu dữ liệu khác. Chi tiết cụ thể cụ thể chi tiết, thay thế sửa chữa vì áp dụng danh sách kết nối để màn màn biểu diễn những đỉnh kề với cùng 1 đỉnh $u$, ta còn tồn tại thể áp dụng bảng băm hoặc kết cấu cây để màn màn biểu diễn. Trong khuôn khổ những content nội dung bài viết ở đây, ta ít áp dụng (hoặc không áp dụng) những kết cấu như vậy. Không chỉ có vậy ta rất rất có thể màn màn biểu diễn đồ thị bằng chiêu thức thức liệt kê tổng thể toàn bộ toàn diện những cặp $(u,v)$ đồng tình $uv in E$. Giải pháp thức màn màn biểu diễn này còn tồn tại bộ hãy nhờ rằng $O(m)$. Mặc dù thế, việc tiến hành triển khai thực hiện những thao tác cơ bản trong chiêu thức thức màn màn biểu diễn này sẽ khá tốn kém. Nhiều lúc, ta rất rất có thể phối kết hợp chiêu thức thức màn màn biểu diễn này với chiêu thức thức màn màn biểu diễn danh sách kề để tận dụng điểm vượt trội của tổng thể toàn bộ hai chiêu thức thức màn màn biểu diễn mà bộ nhớ vẫn chính là tuyến tính. Duyệt đồ thịProblem 1: Cho một đồ thị $G(V,E)$ và một đỉnh $s in V$, in ra những đỉnh $v$ đồng tình tồn tại một đường đi từ $s$ tới $v$. Ta gọi bài toán trên là bài toán duyệt đồ thị khởi hành điểm xuất phát điểm từ một đỉnh $s$. Để dễ dàng và đơn giản và đơn giản, ta sẽ giả sử đồ thị là liên thông. Tình huống đồ thị không liên thông sẽ tiến hành triển khai mở rộng ở cuối phần này. Giải pháp thức thức chung để duyệt đồ thị như sau: Ta sẽ sử dụng 2 loại nhãn để gán cho những đỉnh của đồ thị: chưa thăm (unvisited) và đã thăm (visited). Bắt đầu tổng thể toàn bộ toàn diện những đỉnh được lưu lại là chưa thăm (unvisited). Ta sẽ bảo dưỡng một tập hợp $C$ (tiến hành triển khai tập $C$ thế nào ta sẽ tìm hiểu sau), mở đầu khởi tạo rỗng. Ta sẽ tiến hành triển khai thực hiện lặp 2 bước sau: Mang ra một đỉnh $u$ trong $C$ (sách vở và giấy tờ giấy tờ thủ tục Remove$(C)$ sau này). Khắc ghi $u$ là đã thăm (visited). Đưa những hàng xóm của $u$ có nhãn chưa thăm vào trong $C$. Sách vở và giấy tờ giấy tờ thủ tục Add$(C,v)$ sau này sẽ đưa đỉnh $v$ vào trong tập $C$. Thuật toán dừng khi $C = emptyset$. Giả mã như sau: GenericGraphTraverse($G(V,E),s$): mark all vertices unvisited Add$(C,s)$ while $C ot= emptyset$ $u leftarrow$ Remove$(C)$ $ll(*)gg$ if $u$ is unvisited mark $u$ visited for all $uv in E$ và $v$ is unvisited $ll(**)gg$ Add$(C,v)$Remark: Một đỉnh rất rất có thể được đưa không hề ít lần vào tập $C$ (chính vì như vậy $C$ không phải là tập hợp vì có không ít phần tử giống nhau). Ví dụ xét 3 đỉnh $u,v,w$ đôi một kề nhau. Đỉnh $u$ được lôi ra từ $C$ trước tiên; lưu lại $u$ là đã thăm. Ngay thông suốt, $v$ và $w$ sẽ tiến hành triển khai đem vào $C$. Tiếp theo sau sau, lấy $v$ thoát thoát ra khỏi $C$ và lưu lại $v$ là đã thăm. Hiện tại ta lại liên tục đưa $w$ vào $C$ một đợt tiếp nhữa vì theo giả mã trên, $w$ là hàng xóm của $v$ và có nhãn chưa thăm. Ở chỗ này, ta sẽ không kiểm tra xem một đỉnh đã địa chỉ nơi trưng bày trong $C$ hay chưa trước khi đem vào $C$. Xem Ngay: Acorn Là Gì – Acorn Trong Tiếng Tiếng Việt Từ giả mã trên, ta thấy cảm nhận, tập $C$ lưu những đỉnh kề với tối thiểu một đỉnh đã thăm. Điều tra nghiên cứu thuật toán: Giả sử rằng ta sử dụng một kết cấu để tiến hành triển khai $C$ làm thế nào để cho việc thêm vào hoặc lấy một đỉnh bất kể (dòng $(*)$ và dòng sau cùng) được tiến hành triển khai thực hiện trong năm $O(1)$ (ví dụ nếu thưc thi $C$ bằng danh sách kết nối thì thêm vào hoặc lôi ra đỉnh ở đầu danh sách rất rất có thể được tiến hành triển khai thực hiện trong năm $O(1)$). Ta có một trong những nhận định sau: Những đỉnh đã được lấy thoát thoát ra khỏi $C$ và bị lưu lại là đã thăm thì nó sẽ bị ảnh hưởng tác động không bao giờ được đưa trở lại tập $C$ nữa.Những lần đỉnh $v$ được đem vào $C$, một hàng xóm của chính bản thân mình nó sẽ bị ảnh hưởng tác động bị lưu lại là đã thăm. Cho nên vì thế chính vì như vậy, đỉnh $v$ sẽ ảnh hưởng tác động đem vào $C$ không thật $d(v)$ lần.Mỗi một khi lấy một đỉnh $u$ thoát thoát ra khỏi $C$, ta sẽ duyệt qua tổng thể toàn bộ toàn diện những hàng xóm của $u$. Thao tác làm việc này mất thời gian $O(d(u))$. Theo nhận định 1, phép duyệt này chỉ được tiến hành triển khai thực hiện tối đa 1 lần. Từ những nhận định trên, ta suy ra tổng thời gian thống kê giám sát của thuật toán là $O(sum_{u in V}d(u)) = O(m)$. Trong điều kiện đồ thị không liên thông, ta phải duyệt qua từng thành phần liên thông một. Do đồ thị có tối đa $n$ thành phần liên thông, ta có: Nếu ta tiến hành triển khai $C$ bằng danh sách kết nối thì chắc rằng không sống sót gì mượt mà cả. Mặc dù thế, nếu ta tiến hành triển khai $C$ bằng hàng đợi (Queue) hoặc ngăn xếp (Stack) thì ta sẽ chiếm được 1 trong những các tính chất mượt mà từ đồ thị. Tình huống ta tiến hành triển khai $C$ bằng hàng đợi, ta gọi thuật toán là duyệt theo chiều rộng (Breath First Tìm kiếm – BFS). Tình huống ta tiến hành triển khai $C$ bằng ngăn xếp, ta gọi thuật toán là duyệt theo chiều sâu (Depth First Tìm kiếm – DFS). Sau đây ta sẽ thảo luận cả hai thuật toán. Thuật toán duyệt theo chiều rộng BFS Như đã nói trên, thuật toán BFS sẽ tiến hành triển khai $C$ bằng hàng đợi. Ta sẽ thay sách vở và giấy tờ giấy tờ thủ tục Add$(C,v)$ bằng sách vở và giấy tờ giấy tờ thủ tục Enqueue$(C,v)$ và sách vở và giấy tờ giấy tờ thủ tục Remove$(C)$ bằng sách vở và giấy tờ giấy tờ thủ tục Dequeue$(C)$. Ngoài khung cơ bản như thuật toán ở trên cao cao, ta sẽ gán cho mỗi đỉnh $v$ một nhãn $d$. Chi phí của $d$, như ta sẽ đề ra sau này, là khoảng tầm chừng chiêu thức thức ngắn nhất từ $s$ tới $v$. Giả mã như sau: BFS($G(V,E),s$): for each $v in V$ $d leftarrow +infty$ $Cleftarrow$ an empty Queue Enqueue$(C,s)$ $d leftarrow 0$ while $C ot= emptyset$ $u leftarrow$ Dequeue$(C)$ if $u$ is unvisited mark $u$ visited for all $uv in E$ và $v$ is unvisited $ll(**)gg$ Enqueue$(C,v)$ $d leftarrow d+1$Code của giả mã bằng C:#define UNVISITED 0#define VISITED 1#define TRUE 1#define FALSE 0#define INFTY 1000000// the vertex list data structure, it is a linked listtypedef struct vlistvlist;vlist **G;int n;// the number of veritcesint m;// the number of edgesint *D; // the distance of vertices from BFSint* mark; // an array to mark visited verticestypedef struct Queue{int *storage;int back, front;}Queue;void bfs(int s)printf(“executing bfs….. “);D = (int *)(malloc(n*sizeof(int)));int i = 0;for(; i v;if(mark == UNVISITED)D = D+1;enqueue(Q,v);runner = runner->next;}}printf(“done bfs “);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////THE QUEUE INTERFACES////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Queue *init_queue(int size)Queue *Q = malloc(sizeof(Queue));Q->storage = (int *)malloc(size*sizeof(int));Q->front = 0;Q->back = -1;return Q;void enqueue(Queue *Q, int elem)int dequeue(Queue *Q)if(is_queue_empty(Q)) printf(“nothing to dequeue “);exit(0);int elem = Q->storagefront>;Q->front++;return elem;int is_queue_empty(Queue* Q)Ví dụ ta tiến hành triển khai thuật toán trên với đồ thị trong hình bên trái và kết qủa chiếm được trong hình phía ở ở bên phải. Những số ứng với những đỉnh tương ứng là nhãn của không ít đỉnh đó. Những cạnh màu đỏ laf những cạnh mà $v$ có nhãn unvisited ở dòng $(**)$ được thăm bởi BFS.

Xem Ngay:  Phẩm Chất đạo đức Là Gì, Khái Niệm Phẩm Chất đạo đức
*

Ngoài sách vở và giấy tờ giấy tờ thủ tục lặp DFS sử dụng ngăn xếp như trên, chắc rằng một trong các những số tổng thể toàn bộ tất cả chúng ta cũng tương đối quen thuộc với sách vở và giấy tờ giấy tờ thủ tục tiến hành triển khai DFS sử dụng đệ quy sau:Code của giả mã bằngvoid recursive_dfs(int s){printf(“visiting %d “,s);mark = VISITED;// loop through neighbors of sint v = 0;for(; v Ta thấy cảm nhận chiêu thức thức đầu tuần dễ dàng và đơn giản và đơn giản hơn do không phải tiến hành triển khai Stack. Mặc dù thế, chiêu thức thức này sẽ sử dụng nhiều Call Stack của máy vi tính và trong điều kiện độ sâu đệ quy to rất rất có thể để cho Stack Overflow.Phát hiện những thành phần liên thôngmột trong các các những ứng dụng dễ dàng và đơn giản và đơn giản nhất để duyệt đồ thị là phát hiện ra những thành phần liên thông. Để phát hiện ra những thành phần liên thông của đồ thị (vô hướng), ta tiến hành triển khai thực hiện lặp lại thao tác sau: chọn một đỉnh chưa thăm $u$ và tiến hành triển khai thực hiện thăm những đỉnh trong thành phần liên thông chứa $u$. Sách vở và giấy tờ giấy tờ thủ tục về sau trả lại số thành phần liên thông của đồ thị đầu vào $G(V,E)$.ConnecteComponents($G(V,E)$): mark all vertices unvisited $count leftarrow 0$ for all vertices $sin V$ if $s$ is unvisited GraphTraversal($G(V,E),s$) $countleftarrow count+1$ return $count$Code C:int connected_component(){memset(mark, UNVISITED, (n+1)*sizeof(int)); // mark all vertices unvisitedint s = 0;int count = 0;for(; s Code đầy đủ thốn: list-representation, matrix-representation. Xem Ngay: Hướng đối Tượng Là Gì, Lập Trình Hướng đối Tượng Tham khảo Jeff Erickson, Graph Lecture Note, UIUC. Diestel, Reinhard. Graph theory. 2005. Grad. Texts in Math (2005). Cormen, Thomas H.; Leiserson, Charles E., Rivest, Ronald L., Stein, Clifford. Introduction to Algorithms (2nd ed.), Chapter 23. MIT Press và McGraw-Hill (2001). ISBN 0-262-03293-7. Thể Loại: Giải bày Kiến Thức Cộng Đồng

Xem Ngay:  Reader Là Gì - Reader Nghĩa Là Gì Trong Tiếng Việt

Bài Viết: Giải Thuật Lập Trình Bfs Là Gì, Tìm Kiếm Theo Chiều Rộng Thể Loại: LÀ GÌ Nguồn Blog là gì: https://hethongbokhoe.com Giải Thuật Lập Trình Bfs Là Gì, Tìm Kiếm Theo Chiều Rộng

Leave a Reply

Your email address will not be published.