Bài giảng cấu trúc dữ liệu và giải thuật

84 494 0
Bài giảng cấu trúc dữ liệu và giải thuật

Đ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

Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật MỤC LỤC LỜI NÓI ĐẦU CHƯƠNG 1: THUẬT TOÁN VÀ CẤU TRÚC DỮ LIỆU . 1. Thu✷t toán (gi✺i thuật) - Algorithm . 1.1. Định nghĩa thuật toán 1.2. Đặc trưng thuật toán 2. Biểu diễn thuật toán . 2.1. Mô tả bước thực .2 2.2. Sử dụng sơ ñồ (lưu ñồ) giải thuật (flowchart) 3. ✫  phức t❆p thuật toán – Algorithm Complexity . 3.1. Các tiêu chí ñánh giá thuật toán 3.2. Đánh giá thời gian thực thuật toán .4 3.3. Các ñịnh nghĩa hình thức ñộ phức tạp thuật toán .5 3.4. Các lớp thuật toán 4. C❇u trúc liệu – Data structure . 4.1. Mối liên hệ cấu trúc liệu giải thuật .8 4.2. Các tiêu chuẩn ñánh giá cấu trúc liệu .8 4.3. Các kiểu liệu ngôn ngữ C 4.4. Các kiểu liệu có cấu trúc .8 4.5. Một số kiểu liệu có cấu trúc 5. Các chiến lược thiết kế thuật toán. 5.1. Chiến lược vét cạn (Brute force) .8 5.2. Chiến lược quay lui (Back tracking / try and error) .9 5.3. Chia ñể trị (Divide and Conquer) .12 5.4. Chiến lược tham lam (Greedy) 12 5.5. Qui hoạch ñộng (Dynamic Programming) 13 6. Bài tập 13 CHƯƠNG 2: TÌM KIẾM (SEARCHING) 14 1. Bài toán tìm kiếm 14 2. Tìm kiếm tu❏n tự (Sequential search) 14 3. Tìm kiếm nhị phân (binary search) . 16 4. Bài tập 18 -i- Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật CH NG 3: SẮP XẾP (SORTING) . 19 1. Bài toán s€p xếp . 19 2. Sắp xếp gián tiếp 19 3. Các tiêu chu❘n ñánh giá m❁t thuật toán xếp 20 4. Các phương pháp xếp 21 4.1. S▲p x✁p chọn (Selection sort) 21 4.2. Sắp xếp ñổi chỗ trực tiếp (Exchange sort) .23 4.3. Sắp xếp chèn (Insertion sort) .25 4.4. Sắp xếp bọt (Bubble sort) .27 4.5. So sánh thuật toán xếp .29 5. Các phương pháp xếp nâng cao 29 5.1. Sắp xếp nhanh (Quick sort) 30 5.2. Sắp xếp trộn (merge sort) .32 5.3. Cấu trúc liệu Heap, xếp vun ñống (Heap sort). .36 6. Các vấn ñề khác 42 7. Bài tập 42 CHƯƠNG 4: CÁC CẤU TRÚC DỮ LIỆU CƠ BẢN . 44 1. Ngăn xếp - Stack . 44 1.1. Khái niệm .44 1.2. Các thao tác ngăn xếp .44 1.3. Ví dụ hoạt ñộng stack .45 1.4. Cài ñặt stack mảng 45 1.5. Ứng dụng stack .49 2. Hàng ñợi - Queue 52 2.1. Khái niệm .52 2.2. Các thao tác hàng ñợi 52 2.3. Cài ñặt hàng ñợi sử dụng mảng 52 2.4. Ví dụ hoạt ñộng hàng ñợi với cài ñặt mảng vòng tròn 56 2.5. Ứng dụng hàng ñợi 56 3. Hàng ñợi hai ñầu – Double Ended Queue (dequeu) 57 4. Hàng ñợi ưu tiên – Priority Queue (pqueue) . 57 5. Danh sách liên kết – Linked list 57 5.1. Định nghĩa .57 5.2. Các thao tác danh sách liên kết .57 - ii - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật 5.3. Cài ✾✂t danh sách liên k✄t s✼ dụng tr❯ .58 5.4. Các kiểu danh sách liên kết khác 67 5.5. Một số ví dụ sử dụng cấu trúc danh sách liên kết 68 5.6. Cài ñặt stack queue trỏ 68 5.7. Bài tập 69 CH NG 5: CÂY (TREE) . 70 1. Định nghĩa 70 1.1. Đồ thị (Graph) .70 1.2. Cây (tree) .71 2. Cây tìm kiếm nhị phân . 72 2.1. Định nghĩa .72 2.2. Khởi tạo rỗng .73 2.3. Chèn thêm nút vào 74 2.4. ❳óa bỏ khỏi nút 74 2.5. Tìm kiếm .77 2.6. Duyệt .77 2.7. Cài ñặt BST 79 3. Cây biểu thức (syntax tree) . 79 3.1. Định nghĩa .79 3.2. Chuyển ñổi biểu thức dạng trung tố thành biểu thức .79 3.3. Tính toán giá trị biểu thức trung tố .79 4. Cây cân AVL 79 4.1. Định nghĩa .79 4.2. Các thao tác AVL 80 4.3. ❳oay AVL .80 4.4. Cài ñặt AVL 80 TÀI LIỆU THAM KHẢO 81 - iii - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật L i nói ñầu C u trúc liệu Giải thuật lĩnh vực nghiên cứu gắn liền với lĩnh vực nghiên cứu lâu ñời khoa học máy tính. Hầu hết chương trình ñược viết ra, chạy máy tính, dù lớn hay nhỏ, dù ñơn giản hay phức tạp, ñều phải sử dụng cấu trúc liệu tuân theo trình tự, cách thức làm việc ñó, giải thuật. Việc hiểu biết cấu trúc liệu thuật toán cho phép lập trình viên, nhà khoa học máy tính có tảng lý thuyết vững chắc, có nhiều lựa chọn việc ñưa giải pháp cho toán thực tế. Vì việc học tập môn học Cấu trúc liệu Giải thuật ñiều quan trọng. Tài liệu dựa kinh nghiệm nghiên cứu mà tác giả ñã ñúc rút, thu thập trình giảng dạy môn học Cấu trúc liệu giải thuật khoa Công nghệ Thông tin, Đại học Hàng hải Việt nam, với tham khảo tài liệu ñồng nghiệp, tác giả nước, từ ñiển trực tuyến Wikipedia. Với năm chương ñược chia thành chủ ñề khác từ khái niệm thuật toán xếp, tìm kiếm, cấu trúc liệu ngăn xếp, hàng ñợi, danh sách liên kết, cân … hy vọng cung cấp cho em sinh viên, bạn ñộc giả tài liệu bổ ích. Mặc dù ñã cố gắng song không tránh khỏi số thiếu sót, hy vọng ñược bạn bè ñồng nghiệp, em sinh viên, bạn ñộc giả góp ý chân thành ñể hoàn thiện tài liệu này. in gửi lời cảm ơn chân thành tới bạn bè ñồng nghiệp Ban chủ nhiệm khoa Công nghệ Thông tin ñã tạo ñiều kiện giúp ñỡ ñể tài liệu hoàn thành. Hải phòng, tháng 04 năm 2007 Tác giả Nguyễn Hữu Tuân -1- Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật Chương 1: Thuật toán cấu trúc liệu 1. Thuật toán (giải thuật) - Algorithm 1.1. Định nghĩa thuật toán Có r t nhi u ñịnh ngh a c ng cách phát biểu khác ñịnh nghĩa thuật toán. Theo sách giáo khoa tiếng viết thuật toán “Introduction to Algorithms” (Second Edition Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest Clifford Stein) thuật toán ñược ñịnh nghĩa s “một thuật toán thủ tục tính toán xác ñịnh (well defined) nhận giá trị tập giá trị gọi input sinh ra vài giá trị tập giá trị ñược gọi output”. Nói cách khác thuật toán giống cách thức, qui trình ñể hoàn thành công việc cụ thể xác ñịnh (well defined) ñó. Vì ñoạn mã chương trình tính phần tử dãy số Fibonaci cài ñặt thuật toán cụ thể. Thậm chí hàm ñơn giản ñể cộng hai số thuật toán hoàn chỉnh, ñó thuật toán ñơn giản. 1.2. Đặc trưng thuật toán Tính ñúng ñắn Thuật toán cần phải ñảm bảo cho kết ñúng sau thực ñối với liệu ñầu vào. Đây nói ñặc trưng quan trọng ñối với thuật toán. Tính dừn thuật toán cần phải ñảm bảo dừng sau số hữu hạn bước. Tính xác ñịnh Các bước thuật toán phải ñược phát biểu rõ ràng, cụ thể, tránh gây nhập nhằng nhầm lẫn ñối với người ñọc hiểu, cài ñặt thuật toán. Tính hiệu thuật toán ñược xem hiệu có khả giải hiệu toán ñặt thời gian ñiều kiện cho phép thực tế ñáp ứng ñược yêu cầu người dùng. Tính phổ thuật toán ñược gọi có tính phố quát (phổ biến) giải ñược lớp toán tương tự. Ngoài thuật toán theo ñịnh nghĩa ñều nhận giá trị ñầu vào ñược gọi chung giá trị liệu Input. Kết thuật toán (thường kết cụ thể ñó tùy theo toán thuật toán cụ thể) ñược gọi tput. 2. Biểu diễn thuật toán Thường có hai cách biểu diễn thuật toán, cách thứ mô tả bước thực thuật toán, cách thứ hai sử dụng sơ ñồ giải thuật. 2.1. Mô tả bước thực Để biểu diễn thuật toán người ta mô tả xác bước thực thuật toán, ngôn ngữ dùng ñể mô tả thuật toán ngôn ngữ tự nhiên ngôn ngữ lai ghép ngôn ngữ tự nhiên với ngôn ngữ lập trình ñó gọi ñoạn giả mã lệnh. Ví dụ: mô tả thuật toán tìm ước số chung lớn hai số nguyên. -2- Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật Inpu Hai số nguyên a, b. utpu Ước số chung lớn a, b. Thuật toán: Bước Nếu a Bước Nếu a > b tìm USCLN a b b, quay lại bước Bước USCLN(a, b) a. ếu a < b tìm USCLN a b a, quay lại bước 2.2. Sử dụng sơ ñồ (lưu ñồ) giải thuật (flowchart) Sử dụng ký hiệu hình khối ñể tạo thành mô tả mang tính hình thức (cách rõ ràng so với việc mô tả bước thực thuật toán). Bắt ñầu Câu lệnh Kết thúc Điều kiện Đ S Nhập xuất liệu Khối 1: Khối bắt ñầu thuật toán, có ñường Khối 2: Khối kết thúc thuật toán, có nhiều ñường vào Khối 3: Thực câu lệnh (có thể nhiều câu lệnh gồm ñường vào ñường Khối 4: Rẽ nhánh, kiểm tra biểu thức ñiều kiện (biểu thức Boolean), biểu thức ñúng thuật toán ñi theo nhánh Đúng (True), biểu thức sai thuật toán ñi theo nhánh Sai (False). Khối 5: Các câu lệnh nhập xuất liệu. 3. Độ phức tạp thuật toán – Algorithm Complexity 3.1. Các tiêu chí ñánh giá thuật toán Thông thường ñể ñánh giá mức ñộ tốt, xấu so sánh thuật toán loại, dựa hai tiêu chuẩn • Thuật toán ñơn giản, dễ hiểu, dễ cài ñặt. -3- Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật • Dựa vào thời gian thực tài nguyên mà thuật toán sử dụng ñể thực liệu. Trên thực tế thuật toán hiệu không dễ hiểu, cài ñặt hiệu không dễ dàng thực hiểu ñược cách nhanh chóng. Và ñiều nghịch lý thuật toán hiệu khó hiểu, cài ñặt phức tạp lại hiệu (không phải lúc ñúng). Vì ñể ñánh giá so sánh thuật toán người ta thường dựa ñộ phức tạp thời gian thực thuật toán, gọi ñộ phức tạp thuật toán (algorithm complexity). Về chất ñộ phức tạp thuật toán hàm ước lượng (có thể không xác) số phép tính mà thuật toán cần thực (từ ñó dễ dàng suy thời gian thực thuật toán) ñối với liệu input có kích thước N. N số phần tử mảng trường hợp toán xếp tìm kiếm, ñộ lớn số toán kiểm tra số nguyên tố chẳng hạn. 3.2. Đánh giá th i gian thực thuật toán Để minh họa việc ñánh giá ñộ phức tạp thuật toán ta xem xét ví dụ thuật toán xếp chọn (selection sort) xếp ñổi chỗ trực tiếp (exchange sort) sau Cài ñặt thuật toán xếp chọn for(i idata tmp } q q >next } p p >next } } void clear(LList list) { NodeType p, q if(list >spt ) { p list >head list >head li >tail NULL list >spt while(p) { q p >next free(p) p q } } } void merge(LList st1, const LList st2) { NodeType tmp tmp list2 >head while(tmp) { pus tmp ck(list1, tmp >data) tmp >next } - 66 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật } int empty(const LList st) { return (list >spt )?(1) ( ) } int begin(const LList list) { return list >head >data } int end(const LList list) { return list >tail >data } So sánh danh sách liên kết mảng Danh sách liên kết có số phần tử thay ñổi không cần rõ kích thước tối ña danh trước. Ngược lại mảng cấu trúc có kích thước cố ñịnh Chúng ta xếp lại, thêm xóa phần tử khỏi danh sách liên kết với số cố ñịnh thao tác. Với mảng thao tác thường tương ñương với kích thước mảng. Để tìm ñến phần tử thứ i danh sách liên kết cần phải dò qua i phần tử ñứng trước danh sách (i thao tác) với mảng ñể làm ñiều thao tác. Tương tự kích thước danh sách hiển nhiên mà biết ñược biết rõ kích thước mảng chương trình (tuy nhiên có cách ñơn giản ñể khắc phục ñiều này). 5.4. Các kiểu danh sách liên kết khác Danh sách liên kết ñôi (double linked list) giống danh sách liên kết ñơn ngoại trừ việc nút có thêm trường previous trỏ vào nút ñứng trước nó. Với danh sách liên kết ñôi thao tác tìm kiếm, xóa bỏ nút khỏi danh sách thực dễ dàng ñồng thời nhiều nhớ số lượng lệnh ñể thực thao tác danh sách liên kết ñôi chắn xấp xỉ gấp ñôi so với danh sách liên kết ñôi. Ngoài có loại danh sách liên kết khác ñược gọi danh sách liên kết vòng (circula linked list). - 67 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật Nút cuối trỏ tới nút ñầu tiên Danh sách liên kết vòng danh sách liên kết ñơn danh sách liên kết ñôi Nó ñược cài ñặt với ñầu (head) cố ñịnh thay ñổi Việc cài ñặt danh sách liên kết không cần thiết sử dụng tới trỏ. Thay vào ñó sử dụng mảng ñể cài ñặt danh sách liên kết, ñây không ñi sâu vào xem xét cụ thể cài ñặt danh sách liên kết mảng không khó ñể hình dung cách thức hoạt ñộng danh sách kiểu thế. Kết luận: Danh sách liên kết cấu trúc liệu giống với mảng Các thao tác thường ñược sử dụng ñối với danh sách liên kết thêm, xóa tìm kiếm danh sách Thao tác chèn xóa thực với thời gian số Việc tìm phần tử danh sách liên kết thường thời gian tuyến tính (xấp xỉ ñộ dài danh sách) trường hợp xấu ñúng ñộ dài danh sách. Đây nhược ñiểm lớn danh sách liên kết. 5.5. Một số ví dụ sử dụng cấu trúc danh sách liên kết Các toán mà danh sách liên kết thường ñược sử dụng toán ñó việc sử dụng mảng không thuận lợi, chẳng hạn toán yêu cầu thao tác thêm, xóa bỏ xảy thường xuyên lựa chọn thông minh sử dụng danh sách liên kết. Một ví dụ ta làm việc với ñồ thị thưa (các cạnh ít) lớn (nhưng số ñỉnh nhiều), thay dùng mảng hai chiều, ta dùng mảng danh sách liên kết, danh sách liên kết chứa ñỉnh liền kề ñỉnh ñồ thị. 5.6. Cài ñặt stack queue trỏ Về chất, cấu trúc liệu stack queue cấu trúc danh sách liên kết hạn chế, thao tác ñược giới hạn so với cấu trúc danh sách liên kết. Vì coi stack hay queue danh sách liên kết, lợi dụng cài ñặt trỏ danh - 68 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật sách liên kết ñể cài ñặt cấu trúc stack queue (sử dụng trỏ). Phần ñược ñể lại xem tập sinh viên. 5.7. Bài tập Làm thực hành số tương ứng môn học. - 69 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu Chương 5: Cây (Tree) (Tr 1. Định nghĩa 1.1. Đồ thị (Graph) raph) Trước xem xét khái niệm (tree) nhắc lạii khái niệm ñồ thị (graph) ñã ã ñược học học phần Toán oán rời rạc r Đồ thị G bao gồm hai thành phần c tập c ñỉnh V (Vertices) tập cung E((hay cạnh Edges), thường viết d dạng G . Trong g ñó tập tậ ñỉnh V tập ñốii tượng tượ loại, ñộc lập, chẳng ng hạn ñiểm mặt phẳng tọa ñộ, tập thành hành phố phố, tập trạng thái ột trò chơi, ch ñối tượng thực c người, … tất ñều ñỉnh ñồ thị ñó. Tập cung E tập cá mối quan hệ hai a ñỉnh ñồ thị, ñối với ñỉnh ñiểm ñây quan qua hệ khoảng cách, tập ñỉnh thành phố ñây quan hệ ñường ñi (có tồn ồn t ñường ñi trực tiếp c thành phố hay không), n ñỉnh trạng thái hái trò chơi cạnh cách biến ñổi (transform) ñể ñi từ trạng thái sang trạng tr thái khác, trình chơi ch biến ñổi từ trạng thái hái ban ñầu tới trạng thái ñích (có có nghĩa n ñi tìm ñường ñi). Ví dụ ề ñồ thị: Hình 5.1. Đồ thị có ñỉnh cạnh, cạnh tham khảo từ wikipedia. Có nhiều vấn v ñề liên quan tới ñồ thị, phần ph chì nhắc lại mộ số khái niệm liên quan. Một ñồ thị ñược ñượ gọi ñơn ñồ thị (simple le graph) graph ñường ñi hai ñỉnh a ñồ thị th bị lặp lại, ngược lại c có ñường ñi ñó bị lặp lại hoặ tồn khuyên (self loop),, dạng cung ñi từ ñỉnh nh ñến c ñỉnh ñó, ñồ thị ñược ược gọi gọ ña ñồ thị (multigraph). Giữa hai ñỉnh u, v ñồ thị có ñường ng ñi trực tiếp u, v ñược gọii liền liề kề với nhau, cạnh (u, v) ñược ñượ gọi liên thuộc với haii ñỉnh u u, v. Đồ ñược gọi g ñồ thị có hướng (direct irected graph) ñường ng ñi hai ñỉnh ong ñồ thị phân biệt hướng với nhau, ñó quan hệ ñỉ ñỉnh ñược gọi xác cung, ngược lại ñồ không hông p phân biệt hướng c ñỉnh ttrong cạnh nối hai ñỉnh ñỉ ñồ thị ñược gọi ñồ thị vô hướng (undirected graph), ñó ta nói tập E tập c cạnh cạn ñồ thị. - 70 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu Các cung ung hay cạnh ñồ thj ñược ñượ gán giá trị gọi trọng số (weight), ñồ thị ñồ thị có trọng số trọng số. Ví dụ ñố ñối với ñồ thị mà ñỉnh h cá thành phố ta gán trọng số cung ñộ dàii ñườ ñường ñi nối thành hành phố ho chi phí ñi ñường ñó ñ … Một ñường ñi ñ (path) ñồ thị dãy c ñỉnh v1, v2, …, vk, ong ñó cá ñỉnh vi, vi+1 liền kề với nhau. n Đường ñi có ñỉnh ñầu trùng với ñỉnh cuối ñược gọi ọi chu trình (cycle). Giữa hai ñỉnh ñồ thị có ñường ñi trực tiếp chúng liền n kề với v nhau, có ñường ñườ ñi chúng (gián án tiếp tiếp) hai ñỉnh ñó ñược gọii liên li thông (connected) với ới nhau. Một ñồ thị ñược gọi liên thông hai ñỉnh củ ñều liên thông với nhau. Nếu ñồ thị không liên thông hông lluôn chia thành ác thành ph phần liên thông nhỏ hơn. 1.2. Cây (tree) Có nhiều ều cách cá ñịnh nghĩa khác nh ñây ñịnh nghĩa ngh khái niệm theo heo lý thuyết thuy ñồ thị (graph theory). Cây ñồ thị vô hướng, trọng số, liên thông ó chu trình. Ví dụ hình vẽ sau au mộ Hình 5.2. Cây, tham khảo kh từ wikipedia Cấu trúc c cấu trúc ñược sử dụng ụng rrất rộng rãi sống hàng ngày máy tính, chẳng hạn cấu trúc tổ chức c công ty phân cấp, cấu trúc web site ũng tương tươ tự Hình 5.3. Cấu trúc web site wikipe wikipedia, tham khảo từ wikipedia. - 71 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật Cấu trúc tổ chức thư mục hệ ñiều hành … Trong có nút ñặc biệt gọi gốc (root), ñỉnh ñược gọi nút (nodes). Từ gốc ñi xuống tất ñỉnh liền kề với nó, ñỉnh gọi gốc, ñến lượt gốc lại có nút (child nodes) khác, quan hệ hai nút liền kề quan hệ cha con, nút cha (parent), nút (child), nút cha cha nút ñược gọi tổ tiên (ancestor) nút ñó. Các nút ñược phân biệt làm nhiều loạ nút có nút ñược gọi nút (internal nodes hay inner nodes), nút nút ñược gọi nút (leaf nodes). Các nút nút ñể thuận tiện trình cài ñặt người ta coi nút có hai nút giả, rỗng (NULL) ñóng vai trò lính canh, gọi nút (external nodes). Các nút ñược phân chia thành tầng (level), nút gốc thuộc tầng (level ), sau ñó tầng ñược tăng lên ñơn vị so với tầng phía cho ñến tầng cuối cùng. Độ cao (height) ñược tính số tầng cây, ñộ cao ñịnh ñộ phức tạp (số thao tác) thực thao tác cây. Mỗi nút tổng quát có nhiều nút con, nhiên nghiên cứu ngành khoa học máy tính ñã cho thấy cấu trúc quan trọng cần nghiên cứu nhị phân (binary tree), là nút có nhiều hai nút con. Một tổng quát phân chia thành nhị phân. Các nút nút nhị phân ñược gọi nút trái (left child) nút phải (right child). Trong chương nghiên cứu số loại nhị phân ñược ứng dụng rộng rãi nhất, ñó tìm kiếm nhị phân BST (Binary Search Tree), biểu thức (expression tree hay syntax tree) cân (balanced tree) AVL. 2. Cây tìm kiếm nhị phân 2.1. Định nghĩa Mỗi nút ñều chứa trường thông tin, tìm kiếm nhị phân nút struct (bản ghi – record) gồm trườ trường liệu data, trường khóa key ñể so sánh với nút khác, liên kết tới nút nút left right. Để tập trung vào vấn ñề thuật toán ta bỏ qua trường liệu, xem nút tìm kiếm nhị phân gồm có trường khóa key hai trường liên kết left right. Với giả thiết ta ñịnh nghĩa tìm kiếm nhị phân sau Cây tìm kiếm nhị phân nhị phân (binary tree) mà nút x thỏa mãn bất ñẳng thức kép sau key (left _ child ( x)) < key( x) < key(right _ child ( x)) - 72 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu Trong ñó left child(x), ri child(x) nú nút trái phải nút x, key() key hàm tr v giá trị khóa hóa nút nú tương ứng. Ví dụ Hình 5.4. Cây tìm kiếm nhị phân BST, tham khảo từ wikipedia. Ưu ñiểm m chí tìm kiếm nhị phân hân cung cấp thuật toán xế xếp tìm kiếm dựa kiểu duyệt d thứ tự (in order) cách hiệu quả, cấu ấu trúc liệu cho c cấu trúc liệu cao cấp (trừu trừu tượng t hơn) tập hợp (set),, mảng liên kết (associative ciative array), ánh xạ map, cá cân tối ưu AVL AVL, ñỏ ñen. Chúng ta a xem xe xét tìm kiếm m nhị phân lại l hiệu vậy. 2.2. Khởi tạo rỗng rỗ Thao tác ác ñầu tiên khai báo cấu trúc v khởi tạo rỗng ñể bắt ñầu thực thao tác khác. kh Ở ñây ta giả sử s tìm kiếm nhị phân chứa ch khóa số nguyên yên d dương. Khai báo tìm kiếm nhị phân ngôn gôn ng ngữ C sau // khai bao cau truc cay tim kiem nhi phan typedef pedef struct struc tree { int key struct tree left, ri }BSTree Để khởii tạo m rỗng ta khai báo gốc gán cho gốc ñó ằng NU NULL // cay BSTree e root r NU - 73 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật 2.3. Chèn thêm m t nút m i vào Để chèn nút vào ta xuất phát từ gốc cây, ta gọi ñó nút ñang xét. Nếu nút ñang xét có khóa với khóa cần chèn vào xảy tượng trùng khóa, thuật toán kết thúc với thông báo trùng khóa. Nếu nút ñang xét nút (external nodes) ta tạo nút gán trường thông tin tương ứng cho nút ñó, gán nút ñó NULL. // them mot nut moi vao cay, gia tri khoa cua nut moi luu bien toan cuc newkey void insert(BSTree root) { if( root NULL) { root calloc(1,sizeof(BSTree)) ( root) >key newkey ( root) >left NULL ( root) >right NULL }else{ if(( root >key>newkey) insert( (( root >left)) else if(( root >keyright)) else printf( nError Duplicate key ) } } Thuật toán sử dụng nhớ Θ (log n) trường hợp trung bình Ω (n) trường hợp tồi nhất. Độ phức tạp thuật toán với ñộ cao cây, tức (log n) trường hợp trung bình ñối với hầu hết cây, Ω (n) trường hợp xấu nhất. Cũng nên ý nút ñược chèn vào nút tìm kiếm nhị phân, gốc không thay ñổi trình chèn thêm nút vào cây. 2.4. Xóa bỏ khỏi m t nút Khi xóa bỏ nút hợp sau khỏi (dựa giá trị khóa), chia số trường - 74 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu • nút ñó việc xóa nút không làm ảnh hưởng tới nút khác khác, ta việc c xóa bỏ b nút ñó khỏi cây. • có m nút (trái phải ñó ta ñưa nút c thay y cho nút nú xóa bỏ . • Còn òn lên nút có hai con, ta có hai lựa chọn, l tìm nút hậu duệ nhỏ bên nhánh phải (gọi Y), thay khóa Y lên xóa bỏ Y. Cách Cá thứ hai tìm nút hậu duệ lớ lớn bên nhánh trái (gọi Z), thay y khóa Z lên tự ñối ñố với . xóa bỏ Z. Các thao tác với Y Z ñược c lặp lại l tương Hình minh inh họa họ Hình 5.5. óa nút ây BST BST, tham khảo từ wikipedia Do nút thực th bị xóa trường ng hợp thứ ba rơi vào trường hợp (là nút nút có con), ñồng thời nút bị xóa có khóa óa nhỏ hai nên cài ñặt ta nên tránh sử dụng phương pháp, dẫ dẫn tới tình tính nh cân b cây. Việc cài ài ñặt thuật toán xóa nút ên tìm kiếm nhị phân không hông ñơn giản việc mô tả thuật ật toán xóa trên. Trước hết ta xuấ xuất phát từ gốc ñể ñi tìm nút chứa khóa cần xóa cây. c Trong trình ñiều iều quan trọng ta xác ñịnh rõ nút cần xóa (biến p ñoạn mã chương trình bên dưới) m nút lá, nút có m con, nút có ñầy ñủ hai con. Dù trường ng hợp hợ cần n xá xác ñịnh nút cha nút p (nút nút q), q p trái hay phải c q. Để xác ñịnh trường ng hợ hợp ta sử dụng biến cờ c f, f tương ứng với việc việ nút cần xóa gốc cây, f tương ứng vớii p c phải q, f tương ứng với p trái q. Cài ñặt ằng C thao tác xóa nút khỏi c BST // xoa bo mot khoa k khoi cay void del(BSTree BSTree root, int key) { BSTree e int f p roo - 75 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật q NULL while(p!=NULL&&p->key!=key) { q = p; if(p->keyright; } else { f = 2; p = p->left; } } if(p!=NULL) { if(p->right==NULL) { if(f==1) { q->right=p->left; free(p); } else if(f==2) { q->left=p->left; free(p); }else { *root = p->left; free(p); - 76 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật } }else { q p >right r NULL while(q >left) { r q q q >left } p >key if(r q >key NULL) p >right q >righ else >left q >right free(q) } } } M c dù việc xóa ñòi hỏi phải duyệt từ gốc xuống thực nút tình xảy (duyệt qua nút tới nút lá), ñó ñộ phức tạp thuật toán xóa tương ñương với ñộ cao (tình tồi nhất). 2.5. Tìm kiếm Việc tìm kiếm nhị phân tìm kiếm giống ta thêm nút vào cây. Dựa khóa tìm kiếm key ta xuất phát từ gốc, gọi nút ñang xét Nếu khóa với key, kết thúc trả Nếu nút kết trả NULL (cũng ). Nếu khóa nhỏ key ta lặp lại thao tác tìm kiếm với nút phải ngược lại tiến hành tìm kiếm với nút trái . Độ phức tạp thuật toán với ñộ phức tạp thuật toán chèn nút vào cây. Cài ñặt thuật toán ñược ñể lại tập dành cho bạn ñộc giả. 2.6. Duyệt Duyệt (tree travel) thao tác duyệt qua (ñến thăm) tất nút cây. - 77 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu Có nhiều u cách ñể duyệt cây, chẳng g hạn duyệt theo chiều sâu (DFS DFS), duyệt theo chiều rộng (BFS BFS), ñây ta phân chia cá cách duyệt BST T dựa thứ tự ñến thăm nút gốc, gốc nút trái, nút on phải củ gốc. Cụ thể có ba cách duyệt BST: duyệt thứ th tự trước, thứ tự giữa, thứ tự sau. Để minh nh họa kết k cách duyệt ệt ta xét ví dụ sau: Hình 5.6. Cây tìm kiếm nhị phân, phân tham khảo từ wikipedia Duyệtt thứ tự trước (pre-order traversal): • Thăm ăm gốc gố (visit root). • Duyệt uyệt câ trái theo thứ tự trước • Duyệt uyệt câ phải theo thứ tự trước. Cụ thể thuật toán ñược cài ñặt sau: // duyet et theo thu tu truoc void pr order(BSTree orde *node) { if(node!=NULL) if(nod { visit(node); // ham tham mot nut, nut don gian la in gia tri khoa pre_order(node->left); pre_order(node->right); } } Kết ả duyệt duyệ theo thứ tự trước: 8,, 3, 1, 6, 4, 7, 10, 14, 13. Trong cách duyệt theo thứ tự trước, gốc ñược thăm ñầu tiên. Duyệtt thứ tự (in-order traversal): - 78 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật • Duyệt trái theo thứ tự • Thăm gốc • Duyệt phải theo thứ tự giữa. Kết duyệt theo thứ tự trước 1, 3, 4, 6, 7, 8, 10, 13, 14. Một ñiều dễ nhận thấy khóa duyệt theo thứ tự xuất theo thứ tự tăng dần. Duyệt thứ tự sau (post-order traversal): • Duyệt trái theo thứ tự sau • Duyệt phải theo thứ tự sau • Thăm gốc Kết duyệt theo thứ tự sau: 1, 4, 7, 6, 3, 13, 14, 10, 8. Trong cách duyệt này, gốc ñược thăm sau cùng. Cài ñặt C hai cách duyệt sau ñược dành cho bạn ñộc tập. 2.7. Cài ñặt BST Phần cài ñặt BST ñược ñể lại tập cho bạn ñộc giả. 3. Cây biểu thức (syntax tree) 3.1. Định nghĩa 3.2. Chuyển ñổi biểu thức dạng trung tố thành biểu thức 3.3. Tính toán giá trị biểu thức trung tố 4. Cây cân AVL 4.1. Định nghĩa Cây AVL tìm kiếm nhị phân tự cân (self-balancing binary search tree), cấu trúc cân ñầu tiên ñược phát minh ra. Trong AVL, ñộ cao hai nút nút sai khác nhiều 1, ñó thuộc tính ñược gọi thuộc tính cân ñộ cao (height – balanced). Các thao tác tìm kiếm, chèn phần tử mới, xóa bỏ phần tử khỏi ñều có ñộ phức tạp O(log N) trường hợp trung bình trường hợp tồi nhất. Các thao tác làm ảnh hưởng tới tính chất cân thao tác chèn xóa bỏ khỏi nút, sau thao tác ñể ñiều chỉnh lại nút nhằm giữ cho ñược cân bằng, cần thực thao tác quay (xoay – rotation) cây. Thuật ngữ AVL ñược ñặt theo tên hai tác giả người Nga phát minh loại cấu trúc G.M. Adelson – Velsky E.M. Landis, báo hai người công bố vào năm 1962: “An algorithm for the organization of information”. - 79 - Bài giảng môn ôn học: họ Cấu trúc Dữ liệu Giải ải thuật thu Nhân tố ố cân b nút rong c ñộ cao on phải trừ ñi ñộ cao trái nó. Một nút có nhân tố cân ân bằ bằng 1, ñược c coi l ñã cân bằng. Một nútt với nhân nh tố cân nhận giá trị khác ñược xem không g cân cần phải cân ằng lại. lạ Nhân tố cân ể ñượ ñược lưu nút tính dựa ñộ cao c nó. Hình 5.1. Cây AVL Cây AVL VL tương tươ ñối giống với loạii cân khác, ñó y ñỏ ñ ñen (Red Black Tree) ề thao tác số thao tác cần ần thực thự tìm kiếm, thêm, xóa phần tử khỏi cây. Mặc dù câ ñỏ ñen có tính chất cân không chặt chẽ AVL nh hiệu tương ñương nhau, số ố ứng dụng ñòi hỏi thực ác thao tác tìm kiếm tập liệu lớn AVL tỏ chiếm chi ưu hơn. 4.2. Các thao tác tr AVL 4.3. Xoay AVL A 4.4. Cài ñặt ây AVL - 80 - Bài giảng môn học: Cấu trúc Dữ liệu Giải thuật Tài liệu tham khảo 1. Wikipedia, “T ñiển bách khoa toàn thư trực tuyến tiếng Việt”, khoa toàn thư trực tuyến tiếng Anh”, http://vi.wikipedia.org/wiki/. 2. Wikipedia, “Từ ñiển bách http://en.wikipedia.org/wiki/Main_Page. 3. Các tài liệu giảng website http://csce.unl.edu/~cusack/Teaching/?page=notes. 4. Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest and Clifford Stein, “Introduction to Algorithms, Second Edition”, The MIT Press, , 1180 pages. 5. Jeff Cogswell, Christopher Diggins, Ryan Stephens, Jonathan Turkanis, “C++ Cookbook”, O’Reilly, November 2005, 592 pages. 6. 158488360X.Chapman & Hall.CRC.Computer Science Handbook, Second Edition.pdf - 81 - . giữa cấu trúc dữ liệu và giải thuật 8 4.2. Các tiêu chuẩn ñánh giá cấu trúc dữ liệu 8 4.3. Các kiểu dữ liệu cơ bản của ngôn ngữ C 8 4.4. Các kiểu dữ liệu có cấu trúc 8 4.5. Một số kiểu dữ liệu. Hữu Tuân Bài giảng môn học: Cấu trúc Dữ liệu và Giải thuật - 2 - Chương 1: Thuật toán và cấu trúc dữ liệu 1. Thuật toán (giả i thuật) - Algorithm 1.1. Định nghĩa thuật toán Có r. xác hơn về thuật toán. 4. Cấu trúc dữ liệu – Data structure 4.1. Mối liên hệ giữa cấu trúc dữ liệu và giải thuật 4.2. Các tiêu chuẩn ñánh giá cấu trúc dữ liệu 4.3. Các kiểu dữ liệu cơ bản

Ngày đăng: 25/09/2015, 14:33