Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 151 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
151
Dung lượng
3,32 MB
Nội dung
Ủ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 2018 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 sai 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 tháng năm 2018 Chủ biên Nguyễn Thị Vân MỤC LỤC 1.GIỚI THIỆU 1.1 | BIẾN, KIỂU DỮ LIỆU, CẤU TRÚC DỮ LIỆU 1.1.1 | Biến (Variables) 1.1.2 | Kiểu liệu (Data types) 1.1.3 | Cấu trúc liệu 1.2 | KIỂU DỮ LIỆU TRỪU TƯỢNG (ADTS) 1.3 | KHÁI NIỆM GIẢI THUẬT VÀ PHÂN TÍCH GIẢI THUẬT MỘT SỐ GIẢI THUẬT TÌM KIẾM 19 2.1 | BÀI TỐN TÌM KIẾM 20 2.2 | TÌM KIẾM TUẦN TỰ 21 2.3 | TÌM KIẾM NHỊ PHÂN 23 MỘT SỐ THUẬT TOÁN SẮP XẾP 27 3.1 | BÀI TOÁN SẮP XẾP 28 3.2 | SẮP XẾP LỰA CHỌN (SELECTION SORT) 28 3.3 | SẮP XẾP CHÈN (INSERTION SORT) 30 3.4 | SẮP XẾP ĐỔI CHỖ TRỰC TIẾP (INTERCHANGE SORT) 32 3.5 | SẮP XẾP NỔI BỌT (BUBBLE SORT) 35 3.6 | SẮP XẾP NHANH (QUICK SORT) 38 3.7 | SẮP XẾP TRỘN (MERGE SORT) 40 3.8 | SẮP XẾP VUN ĐỐNG (HEAP SORT) 44 KIỂU DỮ LIỆU DANH SÁCH 58 4.1 | KHÁI NIỆM DANH SÁCH 59 4.2 | PHÂN LOẠI DANH SÁCH 59 4.3 | LINKED LISTS ADT 61 4.4 | TỔNG QUAN VỀ SÁCH LIÊN KẾT (LINKED LIST) VÀ MẢNG 61 4.5 | CÀI ĐẶT DANH SÁCH ĐẶC (MẢNG) 64 4.5.1 | Khai báo cấu trúc liệu 64 4.5.2 | Các thao tác 64 4.6 | CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN 67 4.6.1 | Khai báo cấu trúc liệu 67 4.6.2 | Cài đặt danh sách móc nối 68 4.7 | VẤN ĐỀ VÀ GIẢI PHÁP 82 NGĂN XẾP, HÀNG ĐỢI 87 5.1 | NGĂN XẾP (STACK) 88 5.1.1 | Khái niệm 88 5.1.2 | Stack ADT 89 5.1.3 | Ứng dụng stack 89 5.1.4 | Cài đặt stack mảng 90 5.1.5 | Cài đặt stack linked list 93 5.1.6 | Vấn đề giải pháp 96 5.2 | HÀNG ĐỢI (QUEUE) 101 5.2.1 | Khái niệm 101 5.2.2 | Queue ADT 102 5.2.3 | Ứng dụng queue 103 5.2.4 | Cài đặt queue mảng 103 5.2.5 | Cài đặt queue linked list 111 5.2.6 | Vấn đề giải pháp 114 5.3 | GIỚI THIỆU VỀ CÁC STL STACK, STL QUEUE 114 CẤU TRÚC CÂY 119 6.1 | KHÁI NIỆM CÂY 120 6.2 | CÂY NHỊ PHÂN 122 6.2.1 | Định nghĩa 122 6.2.2 | Tính chá t củ a cay nhị phan 123 6.2.3 | Biể u diễ n cay nhị phan 123 6.2.4 | Duyệ t cay nhị phan 124 6.2.5 | Biểu diễn tổng quát nhị phân 127 6.2.6 | Một cách khác để biểu diễn nhị phân 128 6.3 | CÂY NHỊ PHÂN TÌM KIẾM 129 6.3.1 | Định nghĩa 129 6.3.2 | Các thao tác nhị phân tìm kiếm 130 6.3.3 | Đánh giá 136 6.4 | CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG 137 6.4.1 | Định nghĩa: 137 6.4.2 | Lịch sử cân nhị phân tìm kiếm (AVL Tree) 137 6.4.3 | Cấu trúc liệu cho AVL 138 6.4.4 | Cân lại AVL 139 TÀI LIỆU THAM KHẢO 146 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: CSC106200 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ích 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 tn 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 toá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: Luôn 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 qui đị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ố toá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 1.1 | BIẾN, KIỂU DỮ LIỆU, CẤU TRÚC DỮ LIỆU 1.1.1 | 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 1.1.2 | Kiểu liệu (Data types) 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 Trong khoa học máy tính kiểu liệu dùng để phân loại liệu Một kiểu liệu (data type) ngơn ngữ lập trình tập hợp giá trị nằm miền xác định trước Một vài kiểu liệu như: số nguyên (interger), số thực (floating point), kí tự (charactrer), chuỗi (string), 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ữ, 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 byte (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), Có hai loại kiểu liệu: Kiểu liệu sở (System-defined data types or Primitive data types) Kiểu liệu người dùng tự định nghĩa (User-defined data types) Kiểu liệu sở Một số kiểu liệu sở cung cấp nhiều ngơn ngữ lập trình int, float, char, double, bool, Số lượng bit cấp phát cho kiểu liệu phụ thuộc vào ngôn ngữ, trình biên dịch hệ điều hành Phụ thuộc vào kích thước kiểu liệu mà miền giá trị (domain) biến thay đổi Ví dụ kiểu int chiếm bytes bytes Nếu chiếm bytes (16 bits) miền giá trị biến int từ -32,768 đến 32,767 (tức từ −215 đế𝑛 215 − 1) Nhưng chiếm bytes (32 bits) miền giá trị biến từ -2,147,483,648 đến 2,147,483,647 (tức từ −231 𝑡ớ𝑖 231 − 1) Tương tự với số kiểu liệu khác Kiểu liệu người dùng tự định nghĩa Nếu với toán phức tạp, có liệu thực tế cần lưu trữ vào máy tính kiểu liệu sở khơng đáp ứng đủ hầu hết ngơn ngữ lập trình cho phép người dùng định nghĩa kiểu liệu để đáp ứng nhu cầu lưu trữ đối tượng phức tạp thực tế Trong ngơn ngữ C/C++ để định nghĩa kiểu liệu dùng từ khóa struct struct newType { int data1; float data2; char data; }; 1.1.3 | Cấu trúc liệu Cấu trúc liệu (data structures) cách lưu trữ tổ chức liệu máy tính cho liệu sử dụng cách hiệu Một số loại cấu trúc liệu arrays, files, linked lists, stacks, queues, trees, graphs, Phụ thuộc vào cách tổ chức phần tử mà cấu trúc liệu chia thành hai loại: Cấu trúc liệu tuyến tính (linear data structures): Các phần tử truy cập Ví dụ Linked Lists, Stacks Queues Cấu trúc liệu phi tuyến tính (non- linear data structures): phần tử truy cập không theo trật tự tuyến tính Ví dụ Trees graphs 1.2 | KIỂU DỮ LIỆU TRỪU TƯỢNG (ADTS) Trước tìm hiểu kiểu liệu trừu tượng cần hiểu rõ số khái niệm sau: Trừu tượng hóa (Abstraction): trình tách biệt thiết kế chi tiết với cách sử dụng (tức người sử dụng không cần biết thiết kế chi tiết bên sử dụng dễ dàng) Trừu tượng hóa chức (Function abstraction): trình tách biệt cài đặt chi tiết chức với cách sử dụng chức Trừu tượng hóa liệu (Data abstraction): trình tách biệt cài đặt chi tiết cấu trúc liệu với cách sử dụng cấu trúc liệu (ví dụ người sử dụng dùng cấu trúc List để lưu trữ liệu không cần biết bên lưu trữ cách nào) Đối với kiểu liệu sở (int, float, ), mặc định hệ thống hỗ trợ thao tác ví dụ +, -, Nhưng kiểu liệu người dùng định nghĩa thao tác kiểu liệu không cung cấp sẵn, chúng cần định nghĩa thao tác Nói tóm lại người dùng tự định nghĩa thêm kiểu liệu phải định nghĩa tập thao tác hợp lệ với kiểu liệu Vậy việc kết hợp cấu trúc liệu với thao tác loại cấu trúc (tức kết hợp data abstraction function abstraction) tạo thành kiểu liệu trừu tượng (Abtract Data Types – ADTs) Một ADT gồm hai phần: Khai báo liệu Khai báo thao tác Một vài ADTs thông dụng như: Linked Lists, Stacks, Queues, Priority Queues, Binary Trees, 1.3 | 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 Để giải vấn đề (problem) cần đưa bước để từ liệu ban đầu cho kết mong đợi Vậy giải thuật phát biểu sau: Một giải thuật tập hợp bước rõ ràng, xác định để giải tốn cho trước Có hai tiêu chí để đánh giá giải thuật tốt hay khơng tính xác (giải thuật đưa lời giải sau số lượng bước hữu hạn) tính hiệu (tiết kiệm tài nguyên bao gồm nhớ thời gian chạy) Phân tích giải thuật Có nhiều giải thuật thiết kế để giải vấn đề (ví dụ để xếp dãy số có nhiều giải thuật insertion sort, selection sort, quick sort, ) Vấn đề cần phải chọn giải thuật hiệu quả? Hay sở để so sánh giải thuật giải thuật tối tưu hơn? Vì để giải câu hỏi cần phải biết cách phân 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 nhiều nhân tố: Phong cách người lập trình Chương trình dịch Tốc độ thực phép tốn máy tính Kích cỡ liệu đầu vào 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 132 6.3.2.4 | 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) 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 T/h1: Hủy 40 133 Trường hợp thứ hai: trước hủy X ta móc nối cha X với T/h2: Hủy 37 Trường hợp cuối cùng: ta hủy trực tiếp X có đủ ẽ 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: 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 toà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: 134 T/h3: 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) Hàm delNode trả giá trị 1, hủy thành cơng khơng có X cây: Trong đó, hàm searchStandFor viết sau: 135 //Tìm phần tử mạng cho nút p 6.3.2.5 | Tạo CNPTK Ta tạo nhị phân tìm kiếm cách lặp lại trình thêm phần tử vào rỗng 6.3.2.6 | Hủy toàn CNPTK Việc toàn thực thơng qua thao tác duyệt theo thứ tự sau Nghĩa ta hủy trái, phải hủy nút gốc void removeTree(TREE &T) { if (T) { removeTree(T->pLeft); removeTree(T->pRight); delete(T); } } 6.3.3 | Đánh giá 136 Tất thao tác searchNode, insertNode, delNode 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) 6.4 | CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG 6.4.1 | Đị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): 6.4.2 | 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 137 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 tìm thấy ứ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, … 6.4.3 | Cấu trúc liệu cho AVL Chỉ số cân nút: Định nghĩa: Chỉ số cân nút hiệu chiều cao phải trái Đối với AVL, số cân (CSCB) nút mang ba giá trị sau đây: CSCB(p) = Độ cao trái (p) = Độ cao phải (p) CSCB(p) = Độ cao trái (p) < Độ cao phải (p) CSCB(p) =-1 Độ cao trái (p) > Độ cao phải (p) Để tiện trình bày, ký hiệu sau: p->balFactor = CSCB(p); Độ cao trái (p) ký hiệu hL Độ cao phải(p) ký hiệu hR Để 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: 138 Để tiện cho việc trình bày, ta định nghĩa số số sau: #define LH -1 //Cây trái cao #define EH //Hai #define RH //Cây phải cao 6.4.4 | 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 (có khả năng) 139 Trường hợp 2: T lệch bên phải Ta có khả sau: 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 140 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 này: 141 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 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 Trình bày cấu trúc liệu node nhị phân Trình bày cấu trúc liệu node nhị phân tìm kiếm cân 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 Cho nhị phân tìm kiếm sau: 142 Cho biết kết phép duyệt theo thứ tự NLR, LRN, LNR Cho biết kết sau thêm nút có key = 55 vào Cho nhị phân tìm kiếm sau: 143 Hãy vẽ trường hợp sau: f Sau xóa nút có key = 108 g Sau xóa nút có key = 71 h Sau xóa nút có key = 37 Cho nhị phân tìm kiếm cân sau: a Thêm vào nút có khóa key = 25 144 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 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 145 TÀI LIỆU THAM KHẢO [1] Narasimha Karumanchi, Data Structures And Algorithms Made Easy, 2017 [2] Nguyễn Đình Hóa, Cấu trúc liệu Giải thuật, Đại học quốc gia Hà nội, 2008 Một số website http://www.cplusplus.com https://www.tutorialspoint.com 146 ... 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... 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ố toá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... 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ố