Giáo trình cấu trúc dữ liệu và giải thuật dành cho bậc cao đẳng ngành công nghệ thông tin

161 9 0
Giáo trình cấu trúc dữ liệu và giải thuật  dành cho bậc cao đẳng ngành công nghệ thông tin

Đ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

ỦY BAN NHÂN DÂN TP HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THỦ ĐỨC KHOA CÔNG NGHỆ THÔNG TIN GIÁO TRÌNH HỌC PHẦN: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT NGÀNH/NGHỀ: CƠNG NGHỆ THƠNG TIN TRÌNH ĐỘ: CAO ĐẲNG Ban hành kèm theo Quyết định số: /QĐ-… ngày tháng….năm của……………………………… TP Hồ Chí Minh, năm 2021 TUYÊN BỐ BẢN QUYỀN Tài liệu thuộc loại sách giáo trình nên nguồn thơng tin phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm GIỚI THIỆU Giáo trình biên soạn dựa theo đề cương học phần “Cấu trúc liệu & Giải thuật” xây dựng theo mơ hình CDIO Khoa Cơng nghệ thông tin Trường Cao đẳng Công nghệ Thủ Đức Mặc dù cố gắng, song chắn khơng tránh khỏi thiếu sót nội dung lẫn hình thức, mong nhận góp ý chân thành từ quý thầy cô em sinh viên để giáo trình ngày hồn thiện TP Hồ Chí Minh, ngày 30 tháng 12 năm 2021 Chủ biên Phan Thị Trinh Nguyễn Thị Vân MỤC LỤC GIỚI THIỆU BIẾN, KIỂU DỮ LIỆU, CẤU TRÚC DỮ LIỆU Biến (Variables) Kiểu liệu (Data types) Cấu trúc liệu KIỂU DỮ LIỆU TRỪU TƯỢNG (ADTS) KHÁI NIỆM GIẢI THUẬT VÀ PHÂN TÍCH GIẢI THUẬT Khái niệm giải thuật Phân tích giải thuật BÀI TẬP 14 MỘT SỐ GIẢI THUẬT TÌM KIẾM 16 BÀI TOÁN TÌM KIẾM 17 Phân loại 17 Bài tốn tìm kiếm 17 TÌM KIẾM TUẦN TỰ (SEQUENCE SEARCH) 17 TÌM KIẾM NHỊ PHÂN (Binary search) 20 BÀI TẬP 22 MỘT SỐ GIẢI THUẬT SẮP XẾP 25 BÀI TOÁN SẮP XẾP 26 INTERCHANGE SORT 26 BUBBLE SORT 28 SELECTION SORT 31 INSERTION SORT 32 QUICK SORT 34 MERGE SORT 36 HEAP SORT 40 BÀI TẬP 51 KIỂU DỮ LIỆU DANH SÁCH 54 KHÁI NIỆM DANH SÁCH 55 PHÂN LOẠI DANH SÁCH 55 LINKED LISTS ADT 57 TỔNG QUAN VỀ SÁCH LIÊN KẾT MÓC NỐI (LINKED LIST) VÀ MẢNG 57 CÀI ĐẶT DANH SÁCH ĐẶC (MẢNG) 59 Khai báo cấu trúc liệu 59 Các thao tác 61 CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN 64 Khai báo cấu trúc liệu 64 Các thao tác 66 VẤN ĐỀ VÀ GIẢI PHÁP 83 GIỚI THIỆU VỀ CLASS ARRAYLIST, LIST VÀ LINKEDLIST TRONG NET 85 ArrayList List 85 LinkedList 87 BÀI TẬP 88 NGĂN XẾP, HÀNG ĐỢI 92 NGĂN XẾP (STACK) 93 Khái niệm 93 Trường hợp sử dụng Stack 93 Stack ADT 94 Ứng dụng stack 94 Cài đặt stack mảng 95 Cài đặt stack linked list 98 Vấn đề giải pháp 102 Class Stack Stack 106 HÀNG ĐỢI (QUEUE) 109 Khái niệm 109 Trường hợp sử dụng Queue 110 Queue ADT 110 Ứng dụng queue 110 Cài đặt queue mảng 111 Cài đặt queue linked list 117 Vấn đề giải pháp 121 Class Queue Queue 122 BÀI TẬP 125 CẤU TRÚC CÂY 127 KHÁI NIỆM CÂY 128 CÂY NHỊ PHÂN 130 Định nghĩa 130 Tính chấ t củ a nhị phân 131 Một số thao tác nhị phân 131 Biể u diễ n nhị phân 131 Duyệ t nhị phân 133 Biểu diễn tổng quát nhị phân 135 CÂY NHỊ PHÂN TÌM KIẾM 136 Định nghĩâ 136 Các thao tác nhị phân tìm kiếm 137 CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG 145 Định nghĩâ 145 Lịch sử cân nhị phân tìm kiếm (AVL Tree) 145 Cấu trúc liệu cho AVL 145 Cân lại AVL 147 BÀI TẬP 149 TÀI LIỆU THAM KHẢO 153 GIÁO TRÌNH HỌC PHẦN Tên học phần: Cấu trúc liệu & Giải thuật Mã học phần: CSC106330 Vị trí, tính chất, ý nghĩa vai trị học phần: - Vị trí: Đây học phần thuộc khối kiến thức sở chuyên ngành - Tính chất, ý nghĩa vai trò học phần: Đây học phần sở chuyên ngành giúp sinh viên ngành Công nghệ thông tin sinh viên ngành Truyền thông & Mạng máy tính có khả sử dụng số cấu trúc liệu giải thuật để giải số toán vừa nhỏ máy tính Thơng qua hoạt động học tập, sinh viên cịn rèn luyện khả tư lập trình, hồn thiện dần tính chủ động, tích cực, khả tự học, kỹ thuyết trình thói quen tuân thủ quy định làm việc môi trường chuyên nghiệp Mục tiêu học phần: - Kiến thức: • Phân biệt loại cấu trúc liệu bản; • Trình bày cấu trúc liệu cấu trúc số thao tác cây; • Ước lượng thời gian thực cho số thuật tốn đơn giản; - Kỹ năng: • Cài đặt cấu trúc liệu thao tác cho kiểu liệu danh sách (Mảng, Danh sách móc nối đơn), ngăn xếp, hàng đợi; • Cài đặt số giải thuật tìm kiếm xếp; • Có khả trình bày vấn đề trước lớp rõ ràng, mạch lạc; - Năng lực tự chủ trách nhiệm: • Ln viết code theo chuẩn; • Thường xun chủ động tìm hiểu vấn đề; • Ln ln chủ động làm tập nhà, nộp quy định Nội dung học phần: GIỚI THIỆU Giới thiệu: Chương giải thích tầm quan trọng cấu trúc liệu giải thuật tầm quan trọng việc phân tích giải thuật giải số tốn tin học vừa nhỏ Mục tiêu: - Nhận biết loại cấu trúc liệu - Ước lượng thời gian thực cho số thuật toán đơn giản BIẾN, KIỂU DỮ LIỆU, CẤU TRÚC DỮ LIỆU Biến (Variables) Trước hiểu biến gì, liên hệ tới biểu thức toán học quen thuộc: 𝑥 + 2𝑦 − = Chúng ta không cần lo lắng cách sử dụng công thức Điều quan trọng cần hiểu biểu thức có hai tên (x y) dùng để chứa giá trị (dữ liệu) Tức x y nơi để lưu trữ giá trị Tương tự, lập trình khoa học máy tính dùng biến (variables) để lưu trữ liệu Kiểu liệu (Data types) 1.1.2.1 | Khái niệm Dữ liệu cần lưu trữ vào máy tính có nhiều loại số, chữ, hình ảnh, âm thanh,…Tính đa dạng liệu địi hỏi phải tổ chức phân phối nhớ thích hợp để lưu trữ, xử lý tốt liệu Các liệu chia thành nhóm riêng xây dựng số phép toán, tạo nên kiểu liệu khác Mỗi kiểu liệu tập hợp giá trị Kiểu liệu gồm có thành phần: • Miền giá trị kiểu liệu • Các tốn tử thực giá trị Trong biểu thức toán học đề cập trên, hai biến x y chứa giá trị số nguyên (10, 20), số thực (0.23, 5.5) Để giải cần biết loại giá trị mà x, y nhận Các kiểu liệu ngôn ngữ lập trình như: kiểu số nguyên (interger), kiểu số thực (floating point), kiểu kí tự (charactrer), kiểu chuỗi (string), kiểu luận lý (Boolean), kiểu cấu trúc (struct), kiểu lớp (class), kiểu trỏ (pointer) Tùy vào kiểu liệu mà tốn tử thực thực giá trị khác Ví dụ khơng thể thực phép tốn số học cộng, trừ nhân, chia liệu kiểu chuỗi, phép modulo (phép chia lấy số dư) thực kiểu số thực Mỗi loại liệu lưu trữ chiếm dung lượng nhớ khác phụ thuộc vào ngơn ngữ lập trình, trình biên dịch Hệ điều hành Ví dụ số nguyên (interger) chiếm bytes bytes, kiểu kí tự chiếm 1byte (kiểu char, lưu mã ASCII ký tự) byte (kiểu wchar_t, lưu trữ dựa bảng mã quốc tế UTF-16 – dạng mã unicode), … 1.1.2.2 | Phân loại public void PreOrderTraversal(Node theRoot) { if (!(theRoot == null)) { theRoot.Display(); PreOrderTraversal(theRoot.LeftNode); PreOrderTraversal(theRoot.RightNode); } } //Duyệt BST theo InOrder public void InOrderTraversal(Node theRoot) { if (!(theRoot == null)) { InOrderTraversal(theRoot.LeftNode); theRoot.Display(); InOrderTraversal(theRoot.RightNode); } } //Duyệt BST theo IPostrder public void PostOrderTraversal(Node theRoot) { if (!(theRoot == null)) { PostOrderTraversal(theRoot.LeftNode); PostOrderTraversal(theRoot.RightNode); theRoot.Display(); } } //Tìm phần tử Min public int FindMin() { Node current = Root; while (!(current.LeftNode == null)) current = current.LeftNode; return current.Data; } //Tìm phần tử Max public int FindMax() { Node current = Root; while (!(current.RightNode == null)) current = current.RightNode; return current.Data; } //Tìm phần tử public Node Find(int key) { Node current = Root; 139 while (current.Data != key) { if (key < current.Data) current = current.LeftNode; else current = current.RightNode; if (current == null) //đã duyệt hết phần tử break; } return current; } } } Chương trình thử nghiệm: using System; namespace BST { class Program { public static void Main(String[] args) { /* Let us create following BST 23 / \ 16 45 / \ / \ 22 37 99 */ BinarySearchTree myBST = new BinarySearchTree(); myBST.Insert(23); myBST.Insert(16); myBST.Insert(45); myBST.Insert(3); myBST.Insert(22); myBST.Insert(37); myBST.Insert(99); Console.WriteLine("\nPreOrder Traversal: "); myBST.PreOrderTraversal(myBST.Root); Console.WriteLine("\nInOrder Traversal: "); myBST.InOrderTraversal(myBST.Root); Console.WriteLine("\nPostOrder Traversal: "); myBST.PostOrderTraversal(myBST.Root); } } } Kết quả: 140 PreOrder Traversal: 23 16 22 45 37 99 InOrder Traversal: 16 22 23 37 45 99 PostOrder Traversal: 22 16 37 99 45 23 PreOder Traversal Nhận xét: Số lần so sánh tối đa phải thực để tìm phần tử x h, với h chiều cao Như thao tác tìm kiếm BST có n nút tốn chi phí trung bình khoảng O(log2n) Ví dụ: Tìm phần tử 55 6.3.2.1 | Thêm phần tử x vào Việc thêm phần tử X vào phải bảo đảm điều kiện ràng buộc BST Nút thêm nút nút có Q trình tìm kiếm vị trí thêm 141 thực tương tự thao tác tìm kiếm Khi chấm dứt trình tìm kiếm lúc tìm chỗ cần thêm Hàm insert trả giá trị –1, 0, không đủ nhớ, gặp nút cũ hay thành cơng: Ví dụ: Thêm phần tử 44; 18; 88; 13; 37; 59; 108; 15; 23; 40; 55; 71 Thêm X=50 44 < X 88 > X 59 > X 55 > X Do 55 nút nên X thêm vào làm trái nút 55 6.3.2.2 | Hủy phần tử có khóa x Việc hủy phần tử X khỏi phải bảo đảm điều kiện ràng buộc CNPTK Có trường hợp hủy nút X xảy ra: • X nút • X có (trái phải) 142 • X có đủ Trường hợp thứ nhất: đơn giản hủy X khơng móc nối đến phần tử khác TH1: Hủy 40 Trường hợp thứ hai: trước hủy X ta móc nối cha X với TH2: Hủy 37 Trường hợp cuối cùng: ta hủy trực tiếp X có đủ con, ta hủy gián tiếp Thay hủy X, ta tìm phần tử mạng Y Phần tử có tối đa Thơng tin lưu Y chuyển lên lưu X Sau đó, nút bị hủy thật Y giống trường hợp đầu Vấn đề phải chọn Y cho lưu Y vào vị trí X, nhị phân tìm kiếm Có phần tử thỏa mãn yêu cầu: 143 • Phần tử nhỏ (trái nhất) phải • Phần tử lớn (phải nhất) trái Việc chọn lựa phần tử phần tử mạng hoàn tồn phụ thuộc vào ý thích người lập trình Ở đây, chọn phần tử (phải trái làm phân tử mạng Hãy xem ví dụ để hiểu rõ hơn: TH3: Hủy 18 Sau hủy phần tử X=18 khỏi tình trạng hình (phần tử 23 phần tử mạng) Đánh giá độ phức tạp: Tất thao tác tìm kiếm nhị phân tìm kiếm có độ phức tạp trung bình O(h), với h chiều cao Trong trường hợp tốt nhất, nhị phân tìm kiếm có n nút có độ cao h = log2(n) Chi phí tìm kiếm tương đương tìm kiếm nhị phân mảng có thứ tự Tuy nhiên, trường hợp xấu nhất, bị suy biến thành danh sách liên kết (khi mà nút có trừ nút lá) Lúc thao tác có độ phức tạp O(n) Vì cần có cải tiến cấu trúc nhị phân tìm kiếm để đạt chi phí cho thao tác log2(n) 144 CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG Định nghĩa Cây nhị phân tìm kiếm cân (cây AVL) nhị phân tìm kiếm mà nút có độ cao trái phải chênh lệch khơng q Dưới ví dụ nhị phân tìm kiếm cân (lưu ý, khơng phải nhị phân tìm kiếm cân hoàn toàn): Lịch sử cân nhị phân tìm kiếm (AVL Tree) AVL tên viết tắt tác giả người Nga đưa định nghĩa nhị phân tìm kiếm cân Adelson-Velskii Landis (1962) Vì lý này, người ta gọi nhị phân tìm kiếm cân AVL Từ sau, dùng thuật ngữ AVL thay cho nhị phân tìm kiếm cân Từ giới thiệu, AVL nhanh chóng ứng dụng nhiều tốn khác Vì vậy, mau chóng trở nên thịnh hành thu hút nhiều nghiên cứu Từ AVL, người ta phát triển thêm nhiều loại cấu trúc liệu hữu dụng khác đỏ-đen (Red-Black Tree), B-Tree, … Cấu trúc liệu cho AVL Left Data Count Height Right 145 Do cân (AVL) nhị phân tìm kiếm (BST) nên Node có đầy đủ thuộc tính BST Left, Right, Data Count: số nguyên biểu diễn số lần xuất giá trị khóa Data nút Khi thêm nhiều lần giá trị khóa vào AVL có nút chứa giá trị khóa giá trị Count tăng lên Height: số nguyên biểu diễn chiều cao nút Heigh dùng phép quay cân bị cân bằng, bao gồm phép quay nút trái phép quay nút phải Tại nút N cây, gọi: hL(N) chiều cao trái hR(N) chiều cao phải số cân (CSCB) nút N là: CSCB(N) = hR(N) - hL(N) Đối với AVL, số cân (CSCB) nút N mang ba giá trị sau đây: CSCB(N) = hL(N) = hR(N) CSCB(N) = hL(N) < hR(N) CSCB(N) =-1 hL(N) > hR(N) Để lưu trữ AVL, ta cần lưu thêm thông tin số cân nút Lúc đó, AVL khai báo sau: public class Node { public int Data { get; set; } public int Count { get; set; } public int Height { get; set; } public Node Left; public Node Right; public Node(int d){ Data = d; Height = 1; Count = 1; Left = null; Right = null; } } 146 public class AVLTree { public Node Root; //Các phương thức khác } Cân lại AVL Ta khơng khảo sát tính cân nhị phân mà quan tâm đến khả cân xảy thêm hủy nút AVL Như vậy, cân bằng, độ lệch chiều cao Ta có trường hợp (6 khả năng) sau: ❖ Trường hợp 1: T lệch bên trái Ta có khả sau: ❖ Trường hợp 2: T lệch bên phải Ta có khả sau: 147 Ta thấy trường hợp lệch bên phải hoàn toàn đối xứng với trường hợp lệch bên trái Vì ta cần khảo sát trường hợp lệch bên trái Trong trường hợp lệch bên trái, trường hợp T1 lệch phải phức tạp Các trường hợp lại giải đơn giản Sau đây, ta khảo sát giải trường hợp nêu Trường hợp 1.1: T1 lệch bên trái Ta thực phép quay đơn Left-Left Trường hợp 1.2: T1 không lệch Ta thực phép quay đơn Left-Left Trường hợp 1.3: T1 lệch bên phải Ta thực phép quay kép Left-Right Do T1 lệch bên phải ta áp dụng phép quay đơn áp dụng trường hợp T chuyển từ trạng thái cân lệch trái thành cân lệch phải, cần áp dụng cách khác Hình vẽ minh họa phép quay kép áp dụng cho trường hợp : 148 Với xem xét trên, xét tương tự cho trường hợp T lệch bên phải Thao tác cân lại tất trường hợp có độ phức tạp O(1) BÀI TẬP BÀI TẬP TẠI LỚP Bài Trình bày khái niệm cây, nhị phân, nhị phân tìm kiếm nhị phân cân Bài Trình bày cấu trúc liệu node nhị phân Bài Trình bày cấu trúc liệu node nhị phân tìm kiếm cân Bài Cho tổng quát biểu diễn sơ đồ tổ chức công ty sau: Hãy biểu diễn thành nhị phân để cài đặt máy tính Bài Cho nhị phân tìm kiếm sau: 149 Cho biết kết phép duyệt theo thứ tự NLR, LRN, LNR Bài Cho biết kết sau thêm nút có key = 55 vào Bài Cho nhị phân tìm kiếm sau: 150 Hãy vẽ trường hợp sau: a) Sau xóa nút có key = 108 b) Sau xóa nút có key = 71 c) Sau xóa nút có key = 37 Bài Cho nhị phân tìm kiếm cân sau: a) Thêm vào nút có khóa key = 25 b) Thêm vào nút có khóa key = 80 Sau thêm vào có bị cân khơng? Tại sao? Nếu có cân lại 151 c) Thêm vào nút có khóa key = 52 Sau thêm vào có bị cân khơng? Tại sao? Nếu có cân lại BÀI TẬP VỀ NHÀ Bài Viết đoạn chương trình biểu diễn phép tốn số học nhị phân tìm kiếm cho sử dụng độ ưu tiên phép tốn Bài Viết chương trình phát sinh ngẫu nhiên 10,000 số khoảng từ 0–9 lưu trữ nhị phân tìm kiếm Sử dụng thuật toán để hiển thị dãy số nguyên số lần xuất chúng 152 TÀI LIỆU THAM KHẢO [1] Narasimha Karumanchi, Data Structures and Algorithms Made Easy: Data Structures and Algorithmic Puzzles, Fifth Edition, 2017 [2] Nguyễn Trung Trực, Cấu Trúc Dữ Liệu Và Giải Thuật, NXB Đại Học Quốc Gia TP Hồ Chí Minh, 2019 Một số website https://docs.microsoft.com/en-us/dotnet/api/?view=netframework-4.8 https://www.tutorialspoint.com/csharp/index.htm 153 ... nghiêm cấm GIỚI THIỆU Giáo trình biên soạn dựa theo đề cương học phần ? ?Cấu trúc liệu & Giải thuật? ?? xây dựng theo mơ hình CDIO Khoa Công nghệ thông tin Trường Cao đẳng Công nghệ Thủ Đức Mặc dù cố... tích giải thuật Ở phạm vi giáo trình phân tích giải thuật tính hiệu giải thuật Phân tích giải thuật giúp xác định giải thuật hiệu mặt thời gian hiệu nhớ Thời gian chạy giải thuật phụ thuộc vào... loại cấu trúc liệu bản; • Trình bày cấu trúc liệu cấu trúc số thao tác cây; • Ước lượng thời gian thực cho số thuật tốn đơn giản; - Kỹ năng: • Cài đặt cấu trúc liệu thao tác cho kiểu liệu danh sách

Ngày đăng: 18/03/2023, 08:15

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

Tài liệu liên quan