Ghi chép tự học: Cấu trúc dữ liệu và thuật toán. Tài liệu là ghi chép ngắn gọn các ý chính khi tự học và ôn lại kiến thức về cấu trúc dữ liệu và thuật toán. Ghi chép là một hoạt động cần thiết và hiệu quả khi các bạn học một kiến thức gì đó.
Chương Các khái niệm 1.1 Ví dụ mở đầu 1.1.1 Thuật toán trực tiếp 1.1.2 Thuật toán nhanh 1.1.3 Thuật toán đệ quy 1.1.3 Thuật toán quy hoạch động 1.2 Thuật toán độ phức tạp 1.2.1 Khái niệm toán thuật toán 1.2.2 Độ phức tạp thuật toán 1.2.3 Các loại thời gian tính 1.3 Ký hiệu tiệm cận 1.3.1 Ơ nhỏ 1.3.2 Ô lớn 1.3.3 Ô mê ga 1.3.4 Liên hệ 1.3.5 Một số lớp thuật tốn 1.4 Giả ngơn ngữ 1.5 Một số kỹ thuật phân tích thuật tốn 1.5.1 Cấu trúc 1.5.2 Phân tích vịng lặp for 1.5.3 Phân tích vịng lặp While, Repeat 1.5.4 Câu lệnh đặc trưng Chương Thuật toán đệ quy 2.1 Khái niệm đệ quy 2.1.1 Hàm đệ quy 2.1.2 Tập hợp xác định đệ quy 2.2 Thuật toán đệ quy 2.3 Ví dụ 2.4 Phân tích thuật tốn đệ quy 2.5 Đệ quy có nhớ 2.6 Chứng minh tính đắn thuật toán đệ quy 2.7 Thuật toán quay lui Chương Các cấu trúc liệu 3.1 Các khái niệm 3.1.1 Kiểu liệu 3.1.2 Kiểu liệu trừu tượng 3.1.3 Cấu trúc liệu 3.2 Mảng 3.2.1 Kiểu liệu trừu tượng mảng 3.2.2 Phân bổ nhớ cho mảng 3.2.3 Các thao tác với mảng 4 4 5 5 5 6 6 6 6 8 8 8 8 8 9 9 9 9 3.3 Danh sách 3.3.1.Danh sách tuyến tính 3.3.2.Các cách cài đặt danh sách tuyến tính 3.3.2.1 Mảng 3.3.2.2 Danh sách móc nối 3.3.3 Các ví dụ ứng dụng 3.3.3.1 Bài toán Josephus 3.3.3.2 Biểu diễn đa thức 3.3.4 Phân tích sử dụng danh sách móc nối 3.3.5 Một số biến thể danh sách móc nối 3.4 Ngăn xếp 3.4.1 Kiểu liệu trừu tượng ngăn xếp 3.4.2 Ngăn xếp dùng mảng 3.4.3 Ngăn xếp dùng danh sách móc nối 3.4.3 Một số ứng dụng ngăn xếp 3.5 Hàng đợi 3.5.1 ADT hàng đợi 3.5.2 Cài đặt dùng mảng 3.5.3 Cài đặt dùng danh sách móc nối 3.5.4 Ứng dụng hàng đợi Chương Cây 4.1 Định nghĩa khái niệm 4.1.1 Định nghĩa 4.1.2 Các thuật ngữ 4.1.3 Cây có thứ tự 4.1.4 Cây có nhãn 4.1.5 ADT Cây 4.1.5.1 Biểu diễn dùng mảng 4.1.5.2 Danh sách 4.2 Cây nhị phân 4.2.1 Định nghĩa tính chất 4.2.2 Biểu diễn nhị phân 4.3 Các ví dụ ứng dụng 4.3.1 Cây nhị phân biểu thức 4.3.2 Cây định 4.3.3 Mã Huffman Chương Các thuật toán xếp 5.1 Bài toán xếp 5.1.1 Bài toán xếp 5.1.2 Giới thiệu sơ lược thuật toán xếp 5.2 Ba thuật toán xếp 5.2.1 Sắp xếp chèn 5.2.2 Sắp xếp lựa chọn 5.2.3 Sắp xếp bọt 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 14 5.3 Sắp xếp trộn 5.4 Sắp xếp nhanh 5.4.1 Sơ đồ tổng quát 5.4.2 Phép phân đoạn 5.5 Sắp xếp vun đống 5.5.1 Cấu trúc liệu đống 5.5.1.1 Biểu diễn đống mảng 5.5.1.2 Hai dạng đống 5.5.1.3 Các phép toán đống 5.5.2 Sắp xếp vun đống 5.5.3 Hàng đợi có ưu tiên 5.6 Cận cho độ phức tạp tính tốn tốn xếp 5.7 Các phương pháp xếp đặc biệt 5.7.1 Mở đầu 5.7.2 Sắp xếp đếm 5.7.3 Sắp xếp theo số 5.7.4 Sắp xếp phân cụm Chương Tìm kiếm 6.1 Tìm kiếm tìm kiếm nhị phân 6.1.1 Tìm kiếm 6.1.2 Tìm kiếm nhị phân 6.2 Cây nhị phân tìm kiếm 6.2.1 Định nghĩa 6.2.2 Biểu diễn nhị phân tìm kiếm 6.2.3 Các phép tốn 6.3 Cây nhị phân tìm kiếm cân AVL 6.3.1 Định nghĩa 6.3.2 Các thao tác với AVL 6.4 Tìm kiếm xâu mẫu 6.4.1 Phát biểu toán 6.4.2 Thuật toán trực tiếp 6.4.3 Thuật toán Boyer-Moore 6.4.4 Thuật toán Rabin-Karp 6.4.5 Thuật toán KMP 6.5 Bảng băm 6.5.1 Đặt vấn đề 6.5.2 Địa trực tiếp 6.5.2 Hàm băm 6.5.2.1 Địa mở 6.5.2.2 Tạo chuỗi Chương Đồ thị thuật toán đồ thị 7.1 Đồ thị 7.1.1 Các loại đồ thị 7.1.2 Đường đi, chu trình, tính liên thơng đồ thị 14 14 14 14 15 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 19 19 20 20 21 21 21 21 7.2 Biểu diễn đồ thị 7.2.1 Dùng ma trận 7.2.2 Dùng danh sách kề 7.3 Các thuật toán duyệt đồ thị 7.3.1 Thuật tốn tìm kiếm theo chiều rộng (BFS) 7.3.2 Thuật tốn tìm kiếm theo chiều sâu (DFS) 7.4 Một số ứng dụng tìm kiếm đồ thị 7.4.1 Bài toán đường 7.4.2 Bài toán liên thơng 7.4.3 Đồ thị khơng chứa chu trình tốn xếp tơ pơ 7.4.4 Bài tốn tơ màu đỉnh đồ thị 7.5 Bài toán khung nhỏ 7.5.1 Thuật toán Kruskal 7.5.2 Cấu trúc liệu biểu diễn phân hoạch 7.6 Bài toán đường ngắn 7.6.1 Thuật toán Dijkstra 22 22 22 23 23 24 24 24 24 25 25 25 25 25 25 25 Chương Các khái niệm 1.1 Ví dụ mở đầu Bài tốn tìm dãy lớn Tổng số lượng dãy con: n^2/2 + n/2 1.1.1 Thuật tốn trực tiếp Duyệt tồn tất dãy có Số lượng phép cộng: n^3/6 + n^2/2 + n/3 1.1.2 Thuật toán nhanh Tiết kiệm tính tốn khơng cần thiết, trường hợp dùng kết trước cộng thêm phần tử mà khơng cần tính lại từ đầu Số lượng phép cộng: n^2/2 + n/2 1.1.3 Thuật toán đệ quy Chia để trị: - Chia toán thành toán dạng - Giải toán cách đệ quy - Tổ hợp lời giải toán để thu lời giải tốn gốc Chia đơi dãy: - Tìm max bên trái - Tìm max bên phải - Tìm max kết hợp nửa trái nửa phải - Kết max giá trị Số lượng phép cộng: n.log(n) (nhanh thuật toán 2) 1.1.3 Thuật toán quy hoạch động Các bước: - Chia toán thành toán dạng - Lưu trữ lời giải tốn - Tìm cách xây dựng lời giải cho toán lớn từ lời giải toán nhỏ Số lượng phép cộng: n 1.2 Thuật toán độ phức tạp 1.2.1 Khái niệm toán thuật toán Bài toán ánh xạ Từ tập xâu nhị phân vào tập xâu nhị phân (độ dài hữu hạn) Thuật toán: - Đầu vào - Đầu Chính xác Hữu hạn Đơn trị Tổng quát 1.2.2 Độ phức tạp thuật toán Đánh giá lượng tài ngun loại mà thuật tốn địi hỏi sử dụng, tiêu biểu - Thời gian - Bộ nhớ Đếm số phép toán => Thời gian tính 1.2.3 Các loại thời gian tính loại: - Tốt - Tồi - Trung bình 1.3 Ký hiệu tiệm cận 1.3.1 Ô nhỏ Cho hàm g(n), o(g(n)) hàm f(n) tồn số c1, c2, n0 cho = c.g(n) với n >= n0 g(n) gọi tiệm cận f(n) 1.3.4 Liên hệ f(n) = o(g(n)) g(n) vừa tiệm cận vừa tiệm cận f(n) 1.3.5 Một số lớp thuật toán Tên gọi O - O(1): số - O(log(n)) - O(n): tuyến tính - O(n.log(n)): tuyến tính - O(n^2): bình phương - O(n^3): bậc ba - O(a^n): hàm mũ (a > 1) - O(n^k): đa thức (k >= 1) Bài toán dễ giải: giải nhờ thuật tốn đa thức Bài tốn khó giải: khơng thể giải nhờ thuật tốn đa thức Bài tốn khó giải: chưa tìm thuật tốn đa thức Bài tốn khơng giải được: khơng tồn thuật tốn để giải 1.4 Giả ngơn ngữ Khơng có 1.5 Một số kỹ thuật phân tích thuật tốn 1.5.1 Cấu trúc 1.5.2 Phân tích vịng lặp for 1.5.3 Phân tích vịng lặp While, Repeat Thời gian tính tìm kiếm nhị phân O(log(n)) 1.5.4 Câu lệnh đặc trưng Đếm số câu lệnh đặc trưng để tìm thời gian tính Chương Thuật toán đệ quy 2.1 Khái niệm đệ quy Đối tượng bao gồm định nghĩa dạng 2.1.1 Hàm đệ quy 2.1.2 Tập hợp xác định đệ quy 2.2 Thuật toán đệ quy Là thuật tốn tự gọi đến với đầu vào kích thước nhỏ 2.3 Ví dụ 2.4 Phân tích thuật tốn đệ quy 2.5 Đệ quy có nhớ Có số tốn bị giải nhiều lần, ý tưởng lưu lời giải tốn lần giải nó, cách làm địi hỏi nhớ 2.6 Chứng minh tính đắn thuật toán đệ quy Dùng quy nạp toán học 2.7 Thuật toán quay lui Xây dựng dần thành phần lời giải - Bắt đầu từ lời giải rổng - Xây dựng tập ứng cử viên - Chọn phần từ tập ứng cử viên cho vào lời giải - Giả sử giải đến tập ứng cử viên k-1 - Xây dựng tập ứng cử viên k - Nếu có tập chọn phần tử cho vào lời giải - Nếu k = n: ghi nhận lời giải - Nếu khơng có tập ứng cử viên k quay lại chọn phần tử khác tập ứng cử viên k-1 xây lại tập ứng cử viên k - Nếu quay lại đến lời giải rỗng hết mà không tốn khơng có lời giải Bài tốn xếp hậu Chương Các cấu trúc liệu 3.1 Các khái niệm 3.1.1 Kiểu liệu Đặc trưng: - Tập giá trị - Cách biểu diễn chung - Tập phép toán 3.1.2 Kiểu liệu trừu tượng Đặc trưng: - Tập giá trị - Tập phép toán 3.1.3 Cấu trúc liệu Là họ biến, có kiểu liệu khác nhau, liên kết theo cách - Cơ sở: integer, char, … - Tuyến tính: Mảng, danh sách liên kết, ngăn xếp, hàng đợi - Phi tuyến: Cây, đồ thị, bảng băm 3.2 Mảng 3.2.1 Kiểu liệu trừu tượng mảng 3.2.2 Phân bổ nhớ cho mảng 3.2.3 Các thao tác với mảng 3.3 Danh sách 3.3.1.Danh sách tuyến tính Dãy phần tử kiểu 3.3.2.Các cách cài đặt danh sách tuyến tính Cơ bản: - Mảng - Danh sách móc nối - Địa khơng trực tiếp: dùng bảng để lưu trữ vị trí phần tử thứ i 3.3.2.1 Mảng 3.3.2.2 Danh sách móc nối 3.3.3 Các ví dụ ứng dụng 3.3.3.1 Bài tốn Josephus 3.3.3.2 Biểu diễn đa thức 3.3.4 Phân tích sử dụng danh sách móc nối 3.3.5 Một số biến thể danh sách móc nối 3.4 Ngăn xếp 3.4.1 Kiểu liệu trừu tượng ngăn xếp 3.4.2 Ngăn xếp dùng mảng 3.4.3 Ngăn xếp dùng danh sách móc nối 3.4.3 Một số ứng dụng ngăn xếp 3.5 Hàng đợi 3.5.1 ADT hàng đợi 3.5.2 Cài đặt dùng mảng 3.5.3 Cài đặt dùng danh sách móc nối 3.5.4 Ứng dụng hàng đợi 10 Chương Các thuật toán xếp D Knuth: “40% thời gian hoạt động máy tính dành cho xếp” 5.1 Bài tốn xếp 5.1.1 Bài toán xếp Tổ chức lại họ liệu theo thứ tự giảm dần tăng dần theo khóa xếp Loại thuật tốn xếp: - Sắp xếp trong: toàn liệu đưa vào nhớ - Sắp xếp ngoài: phần liệu đưa vào nhớ, từ từ phép toán - Đổi chỗ - So sánh Đặc trưng: - Tại chỗ: không gian nhớ phụ mà thuật tốn địi hỏi O(1) - Ổn định: phần tử giá trị giữ nguyên thứ tự tương đối trước xếp 5.1.2 Giới thiệu sơ lược thuật toán xếp Phân loại: - Thuật toán đơn giản O(n^2): chèn, chọn, bọt - Thuật toán hiệu O(n.log(n)): vun đống, trộn, nhanh - Cận cho xếp so sánh Ôm(n.log(n)) - Thuật toán đặc biệt O(n): phân cụm, số - Xử lý tập liệu lớn: xếp Phương pháp: - Hoán đổi - Chọn - Chèn - Trộn - Phân chia - Lai 5.2 Ba thuật toán xếp 5.2.1 Sắp xếp chèn Mô phong cách người chơi cần chèn thêm vào xếp tay Đặc tính - Tại chỗ ổn định - Thuật toán xếp tốt dãy gần xếp 13 5.2.2 Sắp xếp lựa chọn Thuật tốn - Tìm phần tử nhỏ đưa vào vị trí - Tìm phần tử nhỏ đưa vào vị trí - Tìm phần tử nhỏ đưa vào vị trí - … Đặc tính: - Đổi chỗ ít, có ý nghĩa việc đổi chỗ tốn 5.2.3 Sắp xếp bọt Thuật toán: - Duyệt tử đầu đến cuối, thấy chưa thứ tự đổi chỗ => Phần tử lớn bị đẩy cuối - Lặp lại khơng cần đổi chỗ Đặc tính: - Kém hiệu so với thuật toán 5.3 Sắp xếp trộn Thuật toán: - Chia: chia dãy n phần tử thành dãy, dãy có n/2 phần tử - Trị: - Sắp xếp dãy cách đệ quy sử dụng xếp trộn - Dãy cịn phần tử trả phần tử - Tổ hợp: trộn dãy xếp để thu kết Đặc tính: - Thời gian tính: o(n.log(n)) 5.4 Sắp xếp nhanh 5.4.1 Sơ đồ tổng quát Là thuật toán xếp nhanh Có tính chỗ, khơng có tính ổn định Thuật tốn: - Neo đệ quy: dãy có phần tử xếp - Chia: - Chọn phần tử dãy làm chốt p - Chia dãy làm theo phần từ chốt L, R L dãy phần tử không lớn phần tử chốt, R dãy phần tử không nhỏ phần tử chốt - Trị: lặp lại đệ quy cho dãy L, R - Tổng hợp: Dãy xếp L, p, R 5.4.2 Phép phân đoạn Các cách chọn phần tử chốt 14 - Chọn phần tử đứng đầu Chọn phần tử đứng cuối Chọn phần tử Chọn phần tử trung vị phần tử đầu, cuối Chọn ngẫu nhiên 5.5 Sắp xếp vun đống 5.5.1 Cấu trúc liệu đống Là nhị phân - Tất mức đầy, trừ mức cuối, mức cuối điền từ trái qua phải - Tính chất đống: với nút x, parent(x) > x 5.5.1.1 Biểu diễn đống mảng 5.5.1.2 Hai dạng đống Dạng: - Phần tử lớn gốc - Phần tử nhỏ gốc 5.5.1.3 Các phép toán đống Thuật tốn khơi phục tính chất đống Giả thiết trái phải root max-heap Tìm max root, root trái, root phải Nếu max khơng phải root đổi chỗ max cho root Tiếp tục thực mà root nắm max root root 5.5.2 Sắp xếp vun đống Thuật toán: - Tạo max-heap - Đổi chỗ gốc (phần tử lớn nhất) phần tử cuối - Loại bỏ phần tử cuối - Vun lại đống - Lặp lại cịn nút Đặc tính: - Độ phức tạp O(n.log(n)) 5.5.3 Hàng đợi có ưu tiên Tập S, phần tử có số khóa độ ưu tiên Cần cấu trúc liệu hỗ trợ hiệu thao tác: - Bổ sung phần tử x vào S - Trả lại phần tử lớn - Loại bỏ trả lại phần tử lớn - Tăng khóa x thành k 15 Cấu trúc đống đáp ứng yêu cầu 5.6 Cận cho độ phức tạp tính tốn toán xếp Độ phức tạp toán xếp dựa phép so sánh o(n.log(n)) 5.7 Các phương pháp xếp đặc biệt 5.7.1 Mở đầu Với việc thêm giả thiết đầu vào, làm tốt xếp dựa vào phép so sánh Giả thiết: - Các số nguyên nằm khoảng [0, k], k = O(n) - Các số thực phân bố khoảng [0, 1) 5.7.2 Sắp xếp đếm Input: n số nguyên dương nằm khoảng [0, k], k số nguyên k = O(n) Ý tưởng: - Với phần tử x dãy đầu vào, ta xác định rank số lượng phần tử nhỏ x - Nếu biết hạng r x, ta xếp vào vị trí r + Đặc tính: - Độ phức tạp o(n) - Chỉ tốt k = O(n) 5.7.3 Sắp xếp theo số Input: đầu vào gồm n số nguyên, số có d chữ số, hệ số k Ý tưởng: xếp theo thứ tự từ điển - Sắp xếp số theo chữ số thứ - Sắp xếp số thu theo chữ số thứ (sử dụng xếp ổn định) - … - Sắp xếp số thu theo chữ số thứ d (sử dụng xếp ổn định) Đặc tính: - Thời gian tính o(n) d số k = O(n) 5.7.4 Sắp xếp phân cụm Input: n số thực có phân bố khoảng [0, 1] (các số có xác suất xuất nhau) Ý tưởng: - Chia đoạn [0, 1) làm n cụm: 0, 1/n, 2/n, … (n-1)/n - Đưa phần tử a[j] vào cụm i/n key(x) - Duyệt theo thứ tự dãy khóa xếp 17 6.2.2 Biểu diễn nhị phân tìm kiếm Sử dụng cấu trúc nhị phân 6.2.3 Các phép toán Cơ bản: - Tạo nút - Tìm nút có giá trị khóa k - Tìm nút có khóa nhỏ - Tìm nút có khóa lớn - Tìm nút kế cận sau nút x - Tìm nút kế cận trước nút x - Chèn nút vào - Xóa nút có khóa k 6.3 Cây nhị phân tìm kiếm cân AVL 6.3.1 Định nghĩa Là nhị phân tìm kiếm có chiều cao trái phải gốc sai khác không trái phải AVL Cây cân thao tác truy xuất tìm kiếm tối ưu Có cách để khơi phục cân cho cân bằng cách quay 6.3.2 Các thao tác với AVL Bổ sung: - Làm giống BST - Lần theo đường từ nút gốc, với nút x kiểm tra số cân - Nếu bị cân khơi phục cân - Khi khơi phục tính cân nút x khơi phục tính cân tổ tiên => cần xử lý tối đa nút vi phạm Xóa: - Làm giống BST - Lần theo đường từ nút gốc, với nút x kiểm tra số cân - Nếu bị cân khơi phục cân - Khi khơi phục tính cân nút x cần tiếp gốc khác với thao tác bổ sung Tất phép toán với AVL thực với thời gian O(log(n)) 6.4 Tìm kiếm xâu mẫu 6.4.1 Phát biểu tốn Cho xâu T có độ dài n, xấu P có độ dài m, tìm tất vị trí khớp P T Các ứng dụng tốn: - Thu thập thơng tin 18 - Soạn thảo văn Tính tốn sinh học 6.4.2 Thuật toán trực tiếp Thuật toán: - Trượt từ đầu đến n-m, so sánh xem xâu mẫu có xuất khơng Đặc tính: - Thời gian tính tồi nhất: O(n.m) 6.4.3 Thuật tốn Boyer-Moore Mục đích trượt cóc, giảm tải số lần phải so sánh Sử dụng ký tự tồi 6.4.4 Thuật toán Rabin-Karp Biến đổi chuỗi P thành số, chuỗi T thành số Nếu số khớp 6.4.5 Thuật tốn KMP Sử dụng hàm tiền tố để xác định số bước skip trượt Đặc tính: - Thời gian tính o(n+m) 6.5 Bảng băm 6.5.1 Đặt vấn đề Cho bảng T ghi x, với khóa liệu kèm, cần hỗ trợ thao tác: - Insert(T, x); - Delete(T, x); - Search(T, x); Muốn thực nhanh chóng mà khơng cần phải xếp => Dùng bảng băm Ứng dụng: - Xây dựng chương trình dịch - Xây dựng từ điển - Tìm kiếm hiệu quả, điều kiện thông thường O(1) - Có thể xem mở rộng mảng thơng thường 6.5.2 Địa trực tiếp Mỗi khóa tương ứng với số bảng Khơng khác mảng có key PHP Nhưng phải khởi tạo hết nên giả sử khóa số nguyên 32 bit bảng địa trực tiếp phải có tỉ phần tử (chắc đặc điểm implement tầng thấp gần với 19 phần cứng ngày xưa, lập trình bậc cao có phải tạo sẵn nhiều đâu, trừ liệu thực tế có tỉ phần tử thật) 6.5.2 Hàm băm Mục đích giảm kích thước bảng băm Ánh xạ khóa vào giá trị có kích thước nhỏ hơn, kiểu dùng cách làm biến đổi giá trị 100 ký tự chuỗi 10 ký tự Do có khả có khóa khác thơng qua hàm hash trả giá trị, xử lý nào? 6.5.2.1 Địa mở Mọi phần tử cất giữ vào bảng (do bảng kích thước nhỏ nên chắn bị full) Bước làm: - Thơng qua hàm hash xác định để chèn khóa vào - Nếu có giá trị dị tìm trống - Tất nhiên khơng phải dị lần lượt, khơng đem lại lợi ích - Phải dị theo quy tắc, mà quy tắc phụ thuộc vào khóa, tức với khóa, ta có quy tắc (?) để dị Để tìm kiếm phải thực dò theo quy tắc lúc thêm mới, khơng tìm lung tung kỹ thuật dị thường dùng: - Dị tuyến tính - Dị tồn phương - Hàm băm kép 6.5.2.2 Tạo chuỗi Tạo danh sách móc nối để chứa phần tử gắn với vị trí bảng 20 Chương Đồ thị thuật toán đồ thị 7.1 Đồ thị Đồ thị G (graph) cấu trúc rời rạc gồm tập: - Tập đỉnh V(G) (vertex) tập hữu hạn khác rỗng - Tập cạnh E(G) (edge) tập hữu hạn rỗng cặp (u, v), u, v thuộc V Phụ thuộc vào kiểu cạnh số lượng cạnh đỉnh mà phân biệt loại đồ thị khác 7.1.1 Các loại đồ thị Loại: - Đơn (đa) đồ thị vô hướng: không phân biệt hướng cạnh - Đơn (đa) đồ thị có hướng: có phân biệt hướng cạnh Đa đồ thị đồ thị có cạnh lặp (giữa đỉnh có > cạnh) 7.1.2 Đường đi, chu trình, tính liên thông đồ thị Đường độ dài n dãy cạnh nối đỉnh Loại đường đi: - Đường đơn: khơng có đỉnh bị lặp - Đường bản: khơng có cạnh bị lặp Chu trình: - Là đường có đỉnh đầu trùng với đỉnh cuối - Gọi đơn ngoại trừ đỉnh đầu cuối khơng có đỉnh bị lặp lại Liên thơng: - Đồ thị vơ hướng gọi liên thơng ln tìm đường hai đỉnh - Đồ thị có hướng gọi liên thơng mạnh ln tìm đường nối hai đỉnh - Đồ thị có hướng gọi liên thông yếu đồ thị vô hướng thu việc bỏ qua hướng tất cạnh đồ thị vơ hướng liên thơng Các phép tốn bản: - Khởi tạo đồ thị - Hủy đồ thị - Lấy số cạnh - Lấy số đỉnh - Cho biết đồ thị có hướng hay vơ hướng - Bổ sung cạnh, loại bỏ cạnh - Có cạnh nối đỉnh cho trước không - Duyệt đỉnh kề đỉnh cho trước - Bài tốn phức tạp hơn: - Tính giá trị số đặc trưng số đồ thị (số liên thông, sắc số, ) - Tìm số tập cạnh đặc biệt (cặp ghép, bè, chu trình, khung, ) - Tìm số tập đỉnh đặc biệt (phủ đỉnh, phủ cạnh, tập độc lập, ) 21 - - Trả lời truy vấn số tính chất đồ thị (song liên thơng, phẳng,…) Bài tốn tối ưu: - Cây khung nhỏ - Đường ngắn - Luồng cực đại mạng 7.2 Biểu diễn đồ thị Có nhiều cách, phụ thuộc vào tốn cụ thể thuật toán cụ thể Vấn đề cần quan tâm: - Bộ nhớ - Thời gian truy vấn 7.2.1 Dùng ma trận Ma trận kề: - Kích thước V x V - Có cạnh nối đỉnh giá trị 1, khơng có - Mở rộng biểu diễn đa đồ thị vô hướng: số mà số cạnh Ma trận trọng số: - Dùng cạnh có thêm thông tin trọng số Ma trận liên thuộc đỉnh cạnh: - Biểu diễn đơn đồ thị có hướng - Mà ma trận V x E V x V - Giá trị: - 1: đỉnh xét đỉnh đầu - -1: đỉnh xét đỉnh cuối - 0: đỉnh xét đầu mút cảu cạnh 7.2.2 Dùng danh sách kề Đồ thị thưa (|E| d[v] nên khơng thể chọn qua - Trong đỉnh kề w w, xét đỉnh có k[w] = false - So sánh d[w] với d[v] + c(v, w) - Nếu d[w] > d[v] + c(v, w) gán d[w] = d[v] + c(v, w) p[w] = v 25 - Tức từ s đến w qua v mà gần so với độ dài nhỏ biết từ s đến w tất nhiên chọn qua v Đặc tính: - Thời gian tính O[|V|^2 + E] - Nếu dùng kèm với hàng đợi có ưu tiên thời gian tính O((|E| + |V|).log(|V|)) 26 Quảng cáo Ứng dụng tạo video hoạt hình điện thoại https://youtu.be/DfF0qXYeRnE Tải dành cho điện thoại Android https://play.google.com/store/apps/details?id=vn.mocalaka.animation.coolcat Hoặc quét mã QR 27