Giáo trình Cấu trúc Dữ liệu và Giải thuật Phần 2 - Tài liệu Chi Tiết Từ Giảng Viên Đại Học ABC

Giáo trình cấu trúc dữ liệu và giải thuật phần 2. Khám phá các cấu trúc dữ liệu nâng cao cùng thuật toán hiệu quả. Tài liệu học tập hữu ích cho sinh viên IT.

Người đăng

Ẩn danh

Thể loại

Giáo trình
173
0
0

Phí lưu trữ

45 Point

Tóm tắt

I. Hướng dẫn tổng quan giáo trình cấu trúc dữ liệu giải thuật 2

Giáo trình Cấu trúc dữ liệu và Giải thuật phần 2 (CTDL&GT 2) là học phần nâng cao, tiếp nối các kiến thức nền tảng đã được giới thiệu ở phần 1. Nội dung học phần này tập trung vào các cấu trúc dữ liệu phi tuyến phức tạp và các kỹ thuật thiết kế giải thuật tinh vi, đóng vai trò then chốt trong việc giải quyết những bài toán quy mô lớn trong khoa học máy tính. Việc nắm vững các khái niệm trong giáo trình này không chỉ là yêu cầu để hoàn thành chương trình học mà còn là nền tảng vững chắc cho các lĩnh vực chuyên sâu như trí tuệ nhân tạo, xử lý dữ liệu lớn, và phát triển hệ thống hiệu năng cao. Học phần này đòi hỏi người học phải có tư duy trừu tượng và khả năng phân tích, đánh giá độ phức tạp thuật toán một cách chính xác. Các chủ đề chính bao gồm cấu trúc dữ liệu cây nâng cao, lý thuyết đồ thị, bảng băm, và các phương pháp thiết kế thuật toán kinh điển như quy hoạch độngthuật toán tham lam. Việc tiếp cận đúng đắn và có hệ thống sẽ giúp người học chinh phục các kiến thức này một cách hiệu quả.

1.1. Mục tiêu và nội dung cốt lõi của học phần CTDL GT 2

Mục tiêu chính của học phần là trang bị cho người học khả năng lựa chọn, thiết kế và triển khai các cấu trúc dữ liệu và giải thuật hiệu quả cho các bài toán phức tạp. Nội dung cốt lõi xoay quanh việc phân tích sâu về các cấu trúc như cây cân bằng AVL, cây đỏ-đen để đảm bảo hiệu suất tìm kiếm tối ưu. Bên cạnh đó, lý thuyết đồ thị được giới thiệu như một công cụ mạnh mẽ để mô hình hóa các mối quan hệ mạng lưới, từ mạng xã hội đến hệ thống giao thông. Người học sẽ được tìm hiểu các thuật toán duyệt, tìm đường đi, và xây dựng cây khung. Cuối cùng, các kỹ thuật như bảng băm (Hash Table) và các phương pháp giải quyết xung đột được trình bày để tối ưu hóa tốc độ truy xuất dữ liệu, đạt tới thời gian tiệm cận O(1).

1.2. Tầm quan trọng của cấu trúc dữ liệu và giải thuật nâng cao

Trong thế giới công nghệ hiện đại, dữ liệu ngày càng lớn và phức tạp. Các cấu trúc dữ liệu cơ bản không còn đủ khả năng đáp ứng về mặt hiệu suất. Đây là lúc các cấu trúc dữ liệu và giải thuật nâng cao thể hiện vai trò không thể thiếu. Ví dụ, các thuật toán trên đồ thị giúp Google Maps tìm đường đi ngắn nhất, hay giúp các mạng xã hội gợi ý kết nối. Cây cân bằng AVLcây đỏ-đen là nền tảng của các hệ quản trị cơ sở dữ liệu, đảm bảo tốc độ truy vấn nhanh chóng ngay cả với hàng tỷ bản ghi. Hiểu và vận dụng thành thạo các kiến thức này là chìa khóa để xây dựng các ứng dụng phần mềm mạnh mẽ, có khả năng mở rộng và đáp ứng yêu cầu thực tiễn.

II. Thách thức khi phân tích và tối ưu độ phức tạp thuật toán

Một trong những thách thức lớn nhất khi nghiên cứu giáo trình cấu trúc dữ liệu và giải thuật phần 2 là việc phải đối mặt với các bài toán có quy mô và độ phức tạp cao hơn hẳn. Không chỉ dừng lại ở việc làm cho chương trình chạy đúng, người học cần phải đảm bảo nó chạy hiệu quả về cả thời gian và không gian bộ nhớ. Đây chính là lúc khái niệm độ phức tạp thuật toán trở thành trung tâm. Việc phân tích không chính xác có thể dẫn đến lựa chọn sai lầm về cấu trúc dữ liệu hoặc giải thuật, khiến ứng dụng trở nên chậm chạp hoặc sụp đổ khi dữ liệu đầu vào tăng lên. Các cấu trúc dữ liệu tuyến tính hay cây nhị phân tìm kiếm thông thường bộc lộ rõ những hạn chế khi phải xử lý các tập dữ liệu động, thường xuyên thay đổi, hoặc có cấu trúc mạng lưới phức tạp. Do đó, nhu cầu tìm kiếm các giải pháp tối ưu hơn trở nên cấp thiết, thúc đẩy sự ra đời của các cấu trúc và kỹ thuật nâng cao.

2.1. Phân tích độ phức tạp thời gian và không gian trong CTDL 2

Trong CTDL&GT 2, việc phân tích độ phức tạp thuật toán không chỉ là tính toán trong trường hợp xấu nhất (worst-case) mà còn phải xem xét trường hợp trung bình (average-case) và tốt nhất (best-case). Người học phải làm quen với các ký hiệu Big O, Big Omega, và Big Theta để mô tả chính xác giới hạn trên, giới hạn dưới và giới hạn chặt của thời gian thực thi. Ví dụ, một thuật toán sắp xếp có thể có độ phức tạp O(N log N) trong trường hợp trung bình nhưng lại là O(N^2) trong trường hợp xấu nhất. Hiểu rõ những khác biệt này giúp đưa ra quyết định lựa chọn thuật toán phù hợp nhất với đặc điểm của dữ liệu đầu vào trong thực tế.

2.2. Hạn chế của cây nhị phân tìm kiếm và cấu trúc tuyến tính

Cấu trúc dữ liệu tuyến tính như mảng hay danh sách liên kết có thời gian tìm kiếm tuần tự O(N), không hiệu quả với dữ liệu lớn. Cây nhị phân tìm kiếm (BST) cải thiện hiệu suất tìm kiếm xuống O(log N), nhưng chỉ khi cây ở trạng thái cân bằng. Trong trường hợp xấu nhất, khi các nút được chèn theo thứ tự tăng dần hoặc giảm dần, BST sẽ bị suy biến thành một danh sách liên kết, và độ phức tạp tìm kiếm quay trở lại O(N). Hạn chế này là động lực chính cho sự phát triển của các cấu trúc dữ liệu cây nâng cao có khả năng tự cân bằng, đảm bảo hiệu suất tìm kiếm luôn ở mức tối ưu.

III. Bí quyết làm chủ cấu trúc dữ liệu cây nâng cao và bảng băm

Để giải quyết các hạn chế của cây nhị phân tìm kiếm cơ bản, giáo trình cấu trúc dữ liệu và giải thuật phần 2 giới thiệu các cấu trúc dữ liệu cây nâng cao. Điển hình là cây cân bằng AVLcây đỏ-đen. Các cấu trúc này duy trì tính cân bằng của cây thông qua các phép xoay phức tạp mỗi khi thêm hoặc xóa một nút, đảm bảo chiều cao của cây luôn ở mức O(log N). Nhờ đó, các thao tác tìm kiếm, chèn, xóa đều có độ phức tạp trong trường hợp xấu nhất là O(log N). Bên cạnh các cấu trúc cây, bảng băm (Hash Table) cung cấp một phương pháp tiếp cận hoàn toàn khác để truy xuất dữ liệu. Bằng cách sử dụng một hàm băm để ánh xạ khóa thành một địa chỉ trong mảng, bảng băm cho phép truy cập, chèn và xóa dữ liệu với độ phức tạp trung bình là O(1), một con số cực kỳ ấn tượng.

3.1. Kỹ thuật tự cân bằng Cây cân bằng AVL và cây đỏ đen

Cây cân bằng AVL là một trong những cây nhị phân tìm kiếm tự cân bằng đầu tiên. Nó duy trì sự cân bằng bằng cách đảm bảo rằng chiều cao của hai cây con của bất kỳ nút nào cũng không chênh lệch quá 1. Khi một thao tác chèn hoặc xóa làm mất tính cân bằng, cây sẽ thực hiện các phép xoay đơn hoặc xoay kép để tái lập lại trạng thái cân bằng. Cây đỏ-đen là một loại cây tự cân bằng khác, sử dụng thuộc tính màu (đỏ hoặc đen) cho các nút và một tập hợp các quy tắc để đảm bảo rằng đường đi dài nhất từ gốc đến lá không dài hơn hai lần đường đi ngắn nhất. Mặc dù các quy tắc của cây đỏ-đen phức tạp hơn, nó lại yêu cầu ít phép xoay hơn trong thực tế so với cây AVL.

3.2. Tối ưu truy xuất với Bảng băm và giải quyết xung đột

Bảng băm (Hash Table) là một cấu trúc dữ liệu cho phép lập chỉ mục và truy xuất dữ liệu cực nhanh. Ý tưởng cốt lõi là sử dụng một hàm băm để chuyển đổi một khóa (key) thành một chỉ số (index) trong một mảng. Tuy nhiên, vấn đề phát sinh khi hai khóa khác nhau được băm vào cùng một chỉ số, hiện tượng này được gọi là xung đột. Có hai phương pháp chính để giải quyết xung đột: địa chỉ mở (open addressing) và kết nối chuỗi (chaining). Địa chỉ mở tìm một vị trí trống khác trong bảng để lưu trữ phần tử, trong khi kết nối chuỗi lưu trữ tất cả các phần tử có cùng chỉ số băm vào một danh sách liên kết tại vị trí đó. Việc lựa chọn hàm băm tốt và phương pháp giải quyết xung đột hiệu quả là yếu tố quyết định hiệu năng của bảng băm.

IV. Phương pháp tiếp cận toàn diện lý thuyết đồ thị và giải thuật

Đồ thị là một cấu trúc dữ liệu tổng quát và mạnh mẽ, có khả năng mô hình hóa hầu hết mọi loại quan hệ. Như định nghĩa trong tài liệu, "Một đồ thị có thể xem là một cấu trúc dữ liệu mà mỗi thành phần dữ liệu của nó có thể có quan hệ với một số tuỳ ý các thành phần dữ liệu trong cấu trúc đó". Lý thuyết đồ thị là một phần không thể thiếu trong giáo trình cấu trúc dữ liệu và giải thuật phần 2. Nó cung cấp nền tảng để giải quyết hàng loạt bài toán thực tế, từ việc tìm đường đi tối ưu trong mạng lưới giao thông đến phân tích các mối quan hệ trong mạng xã hội. Để làm việc với đồ thị, trước tiên cần nắm vững các cách biểu diễn nó, phổ biến nhất là ma trận kề và danh sách kề. Sau đó, việc học các thuật toán cốt lõi như duyệt đồ thị, tìm đường đi ngắn nhất và xây dựng cây khung tối thiểu là cực kỳ quan trọng.

4.1. Khám phá các thuật toán duyệt đồ thị BFS DFS phổ biến

Duyệt đồ thị là thao tác cơ bản để đi qua tất cả các đỉnh của đồ thị. Có hai chiến lược duyệt chính là Duyệt theo chiều rộng (BFS - Breadth-First Search) và Duyệt theo chiều sâu (DFS - Depth-First Search). Thuật toán duyệt đồ thị BFS khám phá các đỉnh theo từng mức, giống như các vòng tròn đồng tâm lan ra từ một đỉnh xuất phát. Nó sử dụng một hàng đợi (Queue) để quản lý các đỉnh sẽ được duyệt tiếp theo. BFS rất hữu ích trong việc tìm đường đi ngắn nhất trên đồ thị không có trọng số. Ngược lại, thuật toán duyệt đồ thị DFS đi sâu vào một nhánh cho đến khi không thể đi tiếp, sau đó quay lui (backtrack) để khám phá các nhánh khác. DFS thường được cài đặt bằng đệ quy hoặc sử dụng một ngăn xếp (Stack) và rất hiệu quả cho các bài toán như kiểm tra tính liên thông hay phát hiện chu trình.

4.2. Giải bài toán tìm đường đi ngắn nhất Dijkstra Bellman Ford

Bài toán tìm đường đi ngắn nhất là một trong những ứng dụng quan trọng nhất của lý thuyết đồ thị. Thuật toán Dijkstra là giải pháp kinh điển cho bài toán tìm đường đi ngắn nhất từ một đỉnh nguồn đến tất cả các đỉnh khác trong một đồ thị có trọng số cạnh không âm. Thuật toán này hoạt động dựa trên nguyên tắc tham lam, tại mỗi bước, nó chọn đỉnh chưa được thăm có khoảng cách ngắn nhất từ nguồn. Tuy nhiên, Dijkstra hoạt động không đúng nếu đồ thị có cạnh trọng số âm. Trong trường hợp đó, thuật toán Bellman-Ford được sử dụng. Bellman-Ford có thể xử lý các cạnh âm và còn có khả năng phát hiện các chu trình âm (chu trình có tổng trọng số là một số âm).

4.3. Xây dựng cây khung tối thiểu MST Thuật toán Prim và Kruskal

Một cây khung tối thiểu (MST - Minimum Spanning Tree) của một đồ thị vô hướng, liên thông và có trọng số là một cây con chứa tất cả các đỉnh của đồ thị với tổng trọng số các cạnh là nhỏ nhất có thể. Bài toán này có nhiều ứng dụng, chẳng hạn như thiết kế mạng lưới đường ống hoặc cáp quang với chi phí thấp nhất. Có hai thuật toán tham lam nổi tiếng để giải quyết bài toán này. Thuật toán Prim bắt đầu từ một đỉnh bất kỳ và phát triển cây bằng cách thêm vào cạnh có trọng số nhỏ nhất nối một đỉnh trong cây với một đỉnh ngoài cây. Thuật toán Kruskal lại tiếp cận bằng cách sắp xếp tất cả các cạnh theo trọng số tăng dần và thêm lần lượt các cạnh vào cây miễn là cạnh đó không tạo ra chu trình.

V. Top các kỹ thuật thiết kế thuật toán hiệu quả trong CTDL GT 2

Ngoài việc nghiên cứu các cấu trúc dữ liệu cụ thể, giáo trình cấu trúc dữ liệu và giải thuật phần 2 còn tập trung vào các phương pháp luận, hay các kỹ thuật thiết kế thuật toán tổng quát. Đây là những chiến lược tư duy giúp giải quyết một lớp các bài toán có cấu trúc tương tự nhau. Việc nắm vững các kỹ thuật này cho phép người học không chỉ giải các bài toán đã biết mà còn có khả năng tự mình thiết kế ra các thuật toán mới cho những vấn đề chưa từng gặp. Hai trong số những kỹ thuật mạnh mẽ và phổ biến nhất được giảng dạy là Quy hoạch động (Dynamic Programming)Thuật toán tham lam (Greedy Algorithm). Mặc dù cả hai đều dựa trên việc chia bài toán lớn thành các bài toán con, nhưng nguyên tắc và phạm vi áp dụng của chúng lại rất khác nhau. Lựa chọn đúng kỹ thuật là chìa khóa để có được một lời giải tối ưu.

5.1. Nguyên lý Quy hoạch động Dynamic Programming và ứng dụng

Quy hoạch động là một kỹ thuật mạnh mẽ dùng để giải quyết các bài toán tối ưu có cấu trúc bài toán con gối nhau (overlapping subproblems) và cấu trúc con tối ưu (optimal substructure). Nguyên lý cốt lõi của nó là giải mỗi bài toán con chỉ một lần và lưu lại kết quả của chúng vào một bảng (thường là mảng một hoặc hai chiều). Khi cần đến kết quả của một bài toán con đã được giải, thay vì tính toán lại, thuật toán sẽ lấy trực tiếp từ bảng đã lưu. Cách tiếp cận này giúp tránh việc tính toán dư thừa và giảm đáng kể độ phức tạp thời gian. Các ví dụ kinh điển của quy hoạch động bao gồm bài toán chuỗi con chung dài nhất (LCS), bài toán cái túi (Knapsack), và tìm dãy con tăng dài nhất.

5.2. Cách hoạt động của Thuật toán tham lam Greedy Algorithm

Thuật toán tham lam là một phương pháp thiết kế thuật toán đưa ra lựa chọn tối ưu tại mỗi bước với hy vọng rằng chuỗi các lựa chọn cục bộ tối ưu này sẽ dẫn đến một giải pháp tối ưu toàn cục. Nói cách khác, thuật toán không bao giờ xem xét lại các quyết định đã đưa ra. Phương pháp này thường đơn giản và nhanh hơn quy hoạch động. Tuy nhiên, nó không phải lúc nào cũng đưa ra lời giải đúng cho tất cả các bài toán tối ưu. Một thuật toán tham lam chỉ đúng khi bài toán có hai tính chất: lựa chọn tham lam (greedy choice property) và cấu trúc con tối ưu. Các ví dụ điển hình áp dụng thành công thuật toán tham lam là thuật toán Dijkstra, thuật toán Prim, thuật toán Kruskal và bài toán đổi tiền.

VI. Tài liệu ôn thi cuối kỳ CTDL 2 và ứng dụng trong thực tiễn

Để chinh phục thành công học phần này, việc ôn thi cuối kỳ CTDL 2 đòi hỏi sự chuẩn bị kỹ lưỡng và có hệ thống. Ngoài việc nắm vững lý thuyết, thực hành là yếu tố không thể thiếu. Người học nên chủ động tìm kiếm các nguồn tài liệu bổ trợ để củng cố kiến thức và rèn luyện kỹ năng giải quyết vấn đề. Các kiến thức trong giáo trình cấu trúc dữ liệu và giải thuật phần 2 không chỉ là lý thuyết suông mà có tính ứng dụng cực kỳ cao trong ngành công nghiệp phần mềm. Từ các công cụ tìm kiếm, hệ thống gợi ý, mạng máy tính, đến các thuật toán trong lĩnh vực học máy, tất cả đều dựa trên nền tảng vững chắc của các cấu trúc dữ liệu và giải thuật nâng cao. Do đó, đầu tư thời gian và công sức vào học phần này là một sự đầu tư xứng đáng cho sự nghiệp tương lai.

6.1. Tổng hợp bài tập cấu trúc dữ liệu có lời giải chi tiết

Cách tốt nhất để hiểu sâu một thuật toán là tự mình cài đặt và chạy thử nó với các bộ dữ liệu khác nhau. Việc tìm kiếm và giải các bài tập cấu trúc dữ liệu có lời giải là một phương pháp ôn tập cực kỳ hiệu quả. Các bài tập này thường bao gồm việc cài đặt các cấu trúc dữ liệu như cây AVL, bảng băm, hoặc áp dụng các thuật toán như Dijkstra, Kruskal vào các bài toán cụ thể. Việc tham khảo lời giải chi tiết giúp người học đối chiếu, sửa lỗi sai và học hỏi thêm các kỹ thuật lập trình, cách tối ưu hóa code và các trường hợp đặc biệt cần xử lý. Các nền tảng lập trình cạnh tranh như LeetCode, HackerRank cũng là nguồn bài tập phong phú để rèn luyện.

6.2. Nguồn tải slide bài giảng CTDL GT 2 và tài liệu tham khảo

Ngoài giáo trình chính, slide bài giảng CTDL&GT 2 của giảng viên là một nguồn tài liệu vô cùng quý giá. Slide thường tóm tắt những nội dung cốt lõi, đi kèm với các ví dụ minh họa trực quan, giúp người học dễ dàng nắm bắt các ý tưởng phức tạp. Nhiều trường đại học cũng công khai tài liệu học tập, bao gồm cả slide và bài tập, trên website của khoa. Bên cạnh đó, các sách giáo khoa kinh điển như "Introduction to Algorithms" (CLRS) hay các khóa học trực tuyến trên Coursera, edX cũng là những nguồn tham khảo chất lượng cao, cung cấp cái nhìn sâu sắc và toàn diện hơn về chủ đề.

19/08/2025

Trích đoạn nội dung tài liệu

Chuong 5 ĐỒ THỊ Trong chương này ta sẽ trình bày khái niệm đồ thị. Đó là khái niệm tổng quát nhất trong những cấu trúc dữ liệu mà ta mô tả trong giáo trình này. Các cấu trúc tuyến tính, cấu trúc phân cấp và cả tập hợp mà ta đã học trong những chương trước, đều có thể xem như những trường hợp riêng của đồ thị. Cấu trúc đề thị không chỉ được nghiên cứu và ứng dụng trong Toán học, Tin học mà còn trong nhiều lĩnh vực khoa học công nghệ khác.

Một đồ thị có thể xem là một cấu trúc dữ liệu mà mỗi thành phần dữ liệu của nó có thể có quan hệ với một số tuỳ ý các thành phần đữ liệu trong cấu trúc dó. Tức là, mỗi thành phần đữ liệu trong cấu trúc đồ thị có thể có nhiều phần tử “đứng trước” nó, và có nhiều phần tử “đứng sau” nó. Đồ thị và một số khái niệm cơ bản 5. Khái niệm đồ thị Có hai loại dé thi, dé thị có hướng và đồ thị vô hướng.

Đồ thị có hướng (directed graph hay digraph) G 1A mét cap (V. E), trong dé V 1A mét tap hop hữu hạn các phần tử, mỗi phần tử của nó dược gọi là một đỉnh (vertex), còn E là tập tập các cung (arc) có hướng, mỗi cung nối hai đỉnh của đổ thí một cách có thứ tự, tức là có phân biệt đỉnh đầu và dỉnh cuối. Đỉnh cũng còn được gọi là nút (node), cung có hướng cũng còn được gọi là cạnh có hướng (directed edge). Tap Ð các cung có thể đặt tương ứng với một tập con của tích Đề-các VxV, mỗi phần tử của nó là một cặp đỉnh có thứ tự (v, w) và được biểu thị hình họe bằng một mũi tên có đầu ở w và đuôi ở v.

Người ta hay gọi cung nối hai đỉnh v và w là cung (v, w). Đặc biệU, v và w có thể trùng nhau, khi đó ta có cung (v, v).a thể hiện một đổ thị có hướng với bốn đỉnh và sáu cung. Đồ thị uô hướng là đồ thị mà trong đó mỗi cạnh (edge) JA mét cung néi hai đỉnh không kể đến thứ tự của hai đỉnh đó. Nói cách khác, nếu (v.

w) là cạnh của một đồ thị vô hướng thì (w, v) = (v, w).b thể hiện một đồ thị vô hướng với bốn đỉnh và sấu cạnh. Khi nói để thị mà không chỉ rõ có hướng hay vô hướng sẽ được hiểu là cả hai loại đề thị. Đồ thị có hướng và đồ thị vô hướng 5. Một số khái niệm cơ bản khác Đồ thị con của dé thi G = (V, E) là G'= (V, E’), trong d6 Vcr V, Pc E và G' làm thành một đồ thị (tức là E V'xV9, Đường đi (path) từ đỉnh v đến dỉnh w trong dé thi 1A day đỉnh vụ, v„,., v„ sao cho đỉnh đầu tiên của dãy vị chính là v, đỉnh cuối cùng của dãy chính là w, và giữa mỗi cặp đỉnh liên tiếp, theo đúng thứ tự của dãy đều có một cung (cạnh), nghĩa là (vị, v;), (v;, vạ),.

Đường đi này được gợi là đi qua các đỉnh vị, vạ,. Độ dài của đường đi được tính bằng số cung trên đường đi, trong trường hợp này là n~-1. Một đỉnh v được xem là một đường đi đặc biệt có độ dài bằng 0 từ v đến v. Đường đi đơn là đường đi không tự cắt.

Nói cách khác, đường đi đơn là đường di không chứa cặp đỉnh nào trùng nhau ngoại trừ hai đỉnh đầu và cuối của nó. Chu frinh là đường đi có đúng một cặp đỉnh trùng nhau là đỉnh đầu và đỉnh cuối của đường đi đó, Một đề thị dược gọi là liên thông (connected) néu véi hai dinh bat kì của nó luôn có một đường đi từ đỉnh này tới đỉnh kia. Mỗi dé thị con liên thông tối đại của một đồ thị được gợi là một thành phần liên thông của đỗ thị đó. Đồ thị vô hướng với hai thành phần liên thông 196 Một đồ thị vô hướng liên thông, không chứa chu trình sẽ được gọi là một cây tự do (free tree).2 chỉ ra ví dụ về một đồ thị vô hướng gồm hai thành phần liên thông mà mỗi thành phần liên thông là một cây tự do.

Thuật ngữ cây tự do hàm ý rằng nếu ta xác định một đỉnh bất kì của nó làm gốc thì ta sẽ có một cây thông thường như đã trình bày ở chương trước. Đồ thị có trọng số Trong nhiều trường hợp, người ta gán cho mỗi cạnh của đồ thị một, gia tri ma ta goi 1A chi phi (cost) hay giá của cạnh. Khái niệm này xuất hiện khi nghiên cứu các bài toán thực tế. Chang han, bài toán tim đường đi ngắn nhất giữa mỗi cặp thành phố trong một vùng, hay bài toán phải xây dựng mạng lưới giao thông giữa các thành phố trong một quốc gia sao cho tổng chỉ phí là nhỏ nhất.

Khi đó độ dài của một đường đi không được tính bằng số cạnh trên đường đi đó mà được tính bằng tổng chi phí của các cạnh trên đường đi. Chú ý rằng ta nói về “độ dài” của đường đi ngay cả khi chi phí là một đại lượng khác, như thời gian chẳng hạn. Kiểu dữ liệu trừu tượng đồ thị Ta sẽ trình bày một số thao tác cơ bản trên đề thị. Những thao tác cơ bản đó có thể cài đặt dưới dạng hàm hay thủ tục như trong bảng sau.

Trong những tình huống cụ thể, chẳng hạn với đồ thị vô hướng hay với đồ thị không có trọng số, cần có những thay đổi phù hợp. Thủ tục CREATE(G) Tạo một đồ thị rỗng G. Thủ tục INSERTNODE(G, v) Bổ sung một đỉnh mới v, V = VLÿ {v} Thủ tục INSERTEDGE(G, u, v, w) Bổ sung thêm một cung mới (u, v) có trọng số w vào đổ thị G. Thi tuc DELETENODE(G, v) Xoá đỉnh v và các cạnh liên quan đến nó ra khỏi đồ thị Thủ tục DELETEEDGE(G, u, v) Xoá cạnh (u, v) khỏi đồ thị.

Hàm FIRST (v) Trả ra chỉ số của đỉnh kể đầu tiên của v, Hàm NEXT (y, i} Trả ra chỉ số của đỉnh kể (sau đỉnh có chỉ số i) của v. Hàm VERTEX (v, i) Trả ra đỉnh với chỉ số ¡ trong các đỉnh kể của v. 197 Ví dụ: Để có đỗ thị như trong hình sau, ta sẽ thực hiện các thao tác tương ứng: CREATE(G); INSERTNODEG, 1); INSERTNODE(, 2); INSERTEDGEG, 1, 2); INSERTNODE(GG, 3); INSERTEDGEG, 1, 3); INSERTEDGE(G, 38, 2); INSERTNODE(G, 4); INSERTEDGE(G, 2, 4); INSERTEDGE(, 4, 2); INSERTEDGE(G, 3, 4); Ví dụ: Cần duyệt (đi qua) toàn bộ các đỉnh kể với đỉnh i, tai mỗi đỉnh đó làm một số thao tác: 1 ;= FIRST(v); while i<> NullVertex đo beginw:= VERTEX(v,i); (* Một số thao tác trên w *) i:= NEXT(v,i) end; Hinh 5. Lap trén caéc dinh ké vdiv 5.

Biểu diễn đồ thị - Có nhiều cách để biểu diễn đổ thị trong máy tính, chẳng hạn biểu diễn mối quan hệ đỉnh-canh hay biểu diễn mối quan hệ đỉnh-dỉnh. Trong việc cài đặt một đồ thị, người ta thường lựa chọn mối quan hệ dỉnh-dỉnh mà cụ thể là quan hệ kể cận hay láng giềng giữa các đỉnh. Sau dây, ta sẽ trình bày hai cấu trúc dữ liệu biểu điễn mối quan hệ này. Đó là ma trận các đỉnh kể và danh sách các đỉnh kể, 198 5.

Ma trận các đỉnh kề Một trong các phương pháp thông dụng biểu diễn đề thị là sử dụng ma tran ké (adjacency matrix). Gia st (V, E) 1A mét dé thi. Ma trận kể biểu diễn G là ma trận vuông A cỡ n x n gồm các giá trị hai trạng thai (0-1 hay true-false) được xác định như sau: lnếu(v,w)eE néu(vw)eE „. nấu G là đồ thị không có trọng số.

Aly, wis! 0 néu(v,w)¢E Đối với đồ thị G có trọng số ta đặt Atssd| r nếur là g giá của cung g (v, (V, w w) œ_ nếu không tổn tại cung (v, w) Ví dụ: Bốn đồ thị sau 2) @}——@) lần lượt tương ứng với ma trận: 0110 02 2ø 0 110 0220 0001 œ 0 œ 3 1011 20 4 3 0101 œ4 03 11-01 240 3 0000 œ oo 0 0110 0330 (a) (b) () (d) Để thị có hướng Đổ thị có hướng, có Dé thị vô hướng Đồ thị vô hướng, có trọng số trọng số Hình 5. Ma trận kể Ta có thể cài đặt một số hàm như sau: Type AdjType = arrayv[1.n] of boolean; Vertex = integer; var a: AdjType; function FIRST(v: vertex): vertex ; 199 var u: vertex; begin u:= 1; while (u<=n) and not Af v,u] do u:= utl; FIRST := u mod (n + 1) end; function NEXT (v,i: vertex): vertex; var u: vertex; begin u:= i + 1 ; while (u<=n) and not A[v,u]} do u:= utl; NEXT := u mod (n + 1) end; Hinh 5. Cài đặt một số hàm trên đồ thị vô hướng bằng ma trận kế 5. Biểu diễn đồ thị bằng danh sách các đỉnh kể Phương pháp thứ hai biểu diễn đồ thị là sử dụng danh sách các đỉnh kề ) (2) Header Bon = Hình 5.

Danh sách liên kết các đỉnh kề` Ta xem mỗi đồ thị như một mảng các dang sách. Danh sách thứ ¡ bao gém các nút kể với nút ¡, với ¡ = 1, 2,. Ta có thể cài đặt một số hàm như sau: var Header = arraVy[1.n] o£ LIST; function FIRST (v: vertex): vertex ; begin FIRST:= RETRIEVE (FIRST (Header{ v] ) ) end; function NEXT(v, i: vertex): vertex; var p: POSITION; begin p:= LOCATE(i, Header{ v]) ; NEXT:= RETRIEVE (FIRST (Header v] )) end; Hình 5.7, Cai đặt một số hàm trên đồ thị bằng danh sách liên kết các dinh ké 200 5. Duyệt đồ thị Cũng như đã thực hiện đối với cây, trong mục này chúng ta xét bài toán đi qua các đỉnh của một đồ thị (còn gọi là duyệt hay tìm kiếm).

Ta sẽ trình bày trong mục này hai thuật toán duyệt đồ thị: ưu tiên độ sâu (depth — first) vA uu tién bé réng (breath —first). Tìm kiêm ưu tiên độ sâu (Depth First Searching) Duyệt theo chiều sâu là đi qua tất cả các đỉnh trên một đường đi nào đó của đồ thị cho đến khi không thể đi tiếp được nữa hoặc đường đi tạo thành một chu trình (có đỉnh bị duyệt lại). Việc duyệt được thực hiện tiếp theo bằng cách quay lại đỉnh ngay phía trước và đi theo một đường đi khác nếu thấy xuất hiện. Cứ như vậy, cho đến khi các đỉnh của dé thị được đi qua hết.

Về cấu trúc đữ liệu, để tiện cho việc trình bày, trong các thuật toán duyệt đổ thị dưới đây, ta sử dụng mảng order để ghi thứ tự các đỉnh đã được duyệt, với những đỉnh ¡ chưa được duyệt, ta quy ước order[1] = 0.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ