Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3Giáo trình Cấu trúc dữ liệu và giải thuật 3
MỤC LỤC Mục Trang CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU & GT 1.1 Tầm quan trọng CTDL & GT đề án tin học 1.1.1 Xây dựng cấu trúc liệu 1.1.2 Xây dựng giải thuật 1.1.3 Mối quan hệ cấu trúc liệu giải thuật 1.2 Đánh giá Cấu trúc liệu & Giải thuật 1.2.1 Các tiêu chuẩn đánh giá cấu trúc liệu 1.2.2 Đánh giá độ phức tạp thuật toán 1.3 Kiểu liệu 1.3.1 Khái niệm kiểu liệu 1.3.2 Các kiểu liệu sở 1.3.3 Các kiểu liệu có cấu trúc 1.3.4 Kiểu liệu trỏ 1.3.5 Kiểu liệu tập tin Câu hỏi taäp CHƯƠNG 2: KỸ THUẬT TÌM KIẾM (Searching) .8 2.1 Khái quát tìm kiếm 2.2 Các giải thuật tìm kiếm nội 2.2.1 Đặt vấn đề 2.2.2 Tìm tuyến tính 2.2.3 Tìm nhị phân 10 2.3 Các giải thuật tìm kiếm ngoại 14 2.3.1 Đặt vấn đề 14 2.3.2 Tìm tuyến tính 14 2.3.3 Tìm kiếm theo mục 16 Câu hỏi tập 17 CHƯƠNG 3: KỸ THUẬT SẮP XẾP (SORTING) .19 3.1 Khái quát xếp 19 3.2 Các giải thuật xếp noäi 19 3.2.1 Sắp xếp phương pháp đổi chỗ 20 3.2.2 Sắp xếp phương pháp chọn 28 3.2.3 Sắp xếp phương pháp chèn 33 3.2.4 Sắp xếp phương pháp trộn 40 3.3 Các giải thuật xếp ngoại 60 3.3.1 Sắp xếp phương pháp trộn 60 3.3.2 Saép xếp theo mục 79 Câu hỏi tập 82 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật CHƯƠNG 4: DANH SÁCH (LIST) 84 4.1 Khái niệm danh saùch 84 4.2 Các phép toán danh sách 84 4.3 Danh sách đặc 85 4.3.1 Định nghóa 85 4.3.2 Biểu diễn danh sách đặc 85 4.3.3 Các thao tác danh sách đặc 85 4.3.4 Ưu nhược điểm Ứng dụng 91 4.4 Danh sách liên kết 92 4.4.1 Định nghóa 92 4.4.2 Danh sách liên kết đơn 92 4.4.3 Danh sách liên kết kép 111 4.4.4 Öu nhược điểm danh sách liên kết 135 4.5 Danh sách hạn chế 135 4.5.1 Hàng đợi 135 4.5.2 Ngăn xếp 142 4.5.3 Ứng dụng danh sách hạn chế 147 Câu hỏi tập 147 CHƯƠNG 5: CÂY (TREE) 149 5.1 Khái niệm – Biểu diễn 149 5.1.1 Định nghóa caây 149 5.1.2 Một số khái niệm liên quan 149 5.1.3 Biểu diễn 151 5.2 Cây nhị phaân 152 5.2.1 Định nghóa 152 5.2.2 Biểu diễn Các thao tác 152 5.2.3 Cây nhị phân tìm kiếm 163 5.3 Cây cân 188 5.3.1 Định nghóa – Cấu trúc liệu 188 5.3.2 Caùc thao taùc 189 Câu hỏi tập 227 ÔN TẬP (REVIEW) 224 Hệ thống lại Cấu trúc liệu Giải thuật học 224 Câu hỏi Bài tập ôn tập tổng hợp 227 TÀI LIỆU THAM KHẢO 229 By Hút thuốc có hại cho sức khỏe at 9:19 pm, Jun 25, 2007 Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1.1 Tầm quan trọng cấu trúc liệu giải thuật đề án tin học 1.1.1 Xây dựng cấu trúc liệu Có thể nói chương trình máy tính mà liệu để xử lý Dữ liệu liệu đưa vào (input data), liệu trung gian liệu đưa (output data) Do vậy, việc tổ chức để lưu trữ liệu phục vụ cho chương trình có ý nghóa quan trọng toàn hệ thống chương trình Việc xây dựng cấu trúc liệu định lớn đến chất lượng công sức người lập trình việc thiết kế, cài đặt chương trình 1.1.2 Xây dựng giải thuật Khái niệm giải thuật hay thuật giải mà nhiều gọi thuật toán dùng để phương pháp hay cách thức (method) để giải vần đề Giải thuật minh họa ngôn ngữ tự nhiên (natural language), sơ đồ (flow chart) mã giả (pseudo code) Trong thực tế, giải thuật thường minh họa hay thể mã giả tựa hay số ngôn ngữ lập trình (thường ngôn ngữ mà người lập trình chọn để cài đặt thuật toán), chẳng hạn C, Pascal, … Khi xác định cấu trúc liệu thích hợp, người lập trình bắt đầu tiến hành xây dựng thuật giải tương ứng theo yêu cầu toán đặt sở cấu trúc liệu chọn Để giải vấn đề có nhiều phương pháp, lựa chọn phương pháp phù hợp việc mà người lập trình phải cân nhắc tính toán Sự lựa chọn góp phần đáng kể việc giảm bớt công việc người lập trình phần cài đặt thuật toán ngôn ngữ cụ thể 1.1.3 Mối quan hệ cấu trúc liệu giải thuật Mối quan hệ cấu trúc liệu Giải thuật minh họa đẳng thức: Cấu trúc liệu + Giải thuật = Chương trình Như vậy, có cấu trúc liệu tốt, nắm vững giải thuật thực việc thể chương trình ngôn ngữ cụ thể vấn đề thời gian Khi có cấu trúc liệu mà chưa tìm thuật giải có chương trình ngược lại có Thuật giải chưa có cấu trúc liệu Một chương trình máy tính hoàn thiện có đầy đủ Cấu trúc liệu để lưu trữ liệu Giải thuật xử lý liệu theo yêu cầu toán đặt 1.2 Đánh giá cấu trúc liệu giải thuật 1.2.1 Các tiêu chuẩn đánh giá cấu trúc liệu Để đánh giá cấu trúc liệu thường dựa vào số tiêu chí sau: - Cấu trúc liệu phải tiết kiệm tài nguyên (bộ nhớ trong), Trang: By Hút thuốc có hại cho sức khỏe at 9:19 pm, Jun 25, 2007 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật - Cấu trúc liệu phải phản ảnh thực tế toán, - Cấu trúc liệu phải dễ dàng việc thao tác liệu 1.2.2 Đánh giá độ phức tạp thuật toán Việc đánh giá độ phức tạp thuật toán không dễ dàng chút Ở dây, muốn ước lượng thời gian thực thuận toán T(n) để có so sánh tương đối thuật toán với Trong thực tế, thời gian thực thuật toán phụ thuộc nhiều vào điều kiện khác cấu tạo máy tính, liệu đưa vào, …, xem xét mức độ lượng liệu đưa vào ban đầu cho thuật toán thực Để ước lượng thời gian thực thuật toán xem xét thời gian thực thuật toán hai trường hợp: - Trong trường hợp tốt nhất: Tmin - Trong trường hợp xấu nhất: Tmax Từ ước lượng thời gian thực trung bình thuật toán: Tavg 1.3 Kiểu liệu 1.3.1 Khái niệm kiểu liệu Kiểu liệu T xem kết hợp thành phần: - Miền giá trị mà kiểu liệu T lưu trữ: V, - Tập hợp phép toán để thao tác liệu: O T = Mỗi kiểu liệu thường đại diện tên (định danh) Mỗi phần tử liệu có kiểu T có giá trị miền V thực phép toán thuộc tập hợp phép toán O Để lưu trữ phần tử liệu thường phải tốn số byte(s) nhớ, số byte(s) gọi kích thước kiểu liệu 1.3.2 Các kiểu liệu sở Hầu hết ngôn ngữ lập trình có cung cấp kiểu liệu sở Tùy vào ngôn ngữ mà kiểu liệu sở có tên gọi khác song lại có loại kiểu liệu sở sau: - Kiểu số nguyên: Có thể có dấu dấu thường có kích thước sau: + Kiểu số nguyên byte + Kiểu số nguyên bytes + Kiểu số nguyên bytes Kiểu số nguyên thường thực với phép toán: O = {+, -, *, /, DIV, MOD, , =, =, …} Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật - Kiểu số thực: Thường có kích thước sau: + Kiểu số thực bytes + Kiểu số thực bytes + Kiểu số thực bytes + Kiểu số thực 10 bytes Kiểu số thực thường thực với phép toán: O = {+, -, *, /, , =, =, …} - Kiểu ký tự: Có thể có kích thước sau: + Kiểu ký tự byte + Kiểu ký tự bytes Kiểu ký tự thường thực với phép toán: O = {+, -, , =, =, ORD, CHR, …} - Kiểu chuỗi ký tự: Có kích thước tùy thuộc vào ngôn ngữ lập trình Kiểu chuỗi ký tự thường thực với phép toán: O = {+, &, , =, =, Length, Trunc, …} - Kiểu luận lý: Thường có kích thước byte Kiểu luận lý thường thực với phép toán: O = {NOT, AND, OR, XOR, , =, =, …} 1.3.3 Caùc kiểu liệu có cấu trúc Kiểu liệu có cấu trúc kiểu liệu xây dựng sở kiểu liệu có (có thể lại kiểu liệu có cấu trúc khác) Tùy vào ngôn ngữ lập trình song thường có loại sau: - Kiểu mảng hay gọi dãy: kích thước tổng kích thước phần tử - Kiểu ghi hay cấu trúc: kích thước tổng kích thước thành phần (Field) 1.3.4 Kiểu liệu trỏ Các ngôn ngữ lập trình thường cung cấp cho kiểu liệu đặc biệt để lưu trữ địa nhớ, trỏ (Pointer) Tùy vào loại trỏ gần (near pointer) hay trỏ xa (far pointer) mà kiểu liệu trỏ có kích thước khác nhau: + Con trỏ gần: bytes + Con trỏ xa: bytes 1.3.5 Kiểu liệu tập tin Tập tin (File) xem kiểu liệu đặc biệt, kích thước tối đa tập tin tùy thuộc vào không gian đóa nơi lưu trữ tập tin Việc đọc, ghi liệu trực tiếp tập tin thời gian không bảo đảm an toàn cho liệu tập tin Do vậy, thực tế, không thao tác trực tiếp liệu tập tin mà cần chuyển phần toàn nội dung tập tin vào nhớ để xử lý Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Câu hỏi Bài tập Trình bày tầm quan trọng Cấu trúc liệu Giải thuật người lập trình? Các tiêu chuẩn để đánh giá cấu trúc liệu giải thuật? Khi xây dựng giải thuật có cần thiết phải quan tâm tới cấu trúc liệu hay không? Tại sao? Liệt kê kiểu liệu sở, kiểu liệu có cấu trúc C, Pascal? Sử dụng kiểu liệu C, xây dựng cấu trúc liệu để lưu trữ nhớ (RAM) máy tính đa thức có bậc tự nhiên n (0 ≤ n ≤ 100) trường số thực (ai , x ∈ R): n fn ( x ) = ∑ aix i i=0 Với cấu trúc liệu xây dựng, trình bày thuật toán cài đặt chương trình để thực công việc sau: - Nhập, xuất đa thức - Tính giá trị đa thức giá trị x0 - Tính tổng, tích hai đa thức Tương tự tập đa thức trường số hữu tỷ Q (các hệ số x phân số có tử số mẫu số số nguyên) Cho bảng tàu từ ga Saigon đến ga sau (ga cuối ga Hà nội): TÀU ĐI S2 S4 S6 S8 S10 S12 S14 S16 S18 LH2 SN2 HÀNH TRÌNH 32 41 41 41 41 41 41 41 41 27giờ 10g30 SAIGON ĐI 21g00 21g50 11g10 15g40 10g00 12g30 17g00 20g00 22g20 13g20 18g40 2g10 5g01 15g21 18g06 19g53 22g47 14g07 16g43 16g41 19g19 21g04 0g08 1g15 4g05 3g16 6g03 17g35 20g19 22g58 2g15 6g47 20g00 0g47 18g50 21g10 1g57 5g42 8g06 22g46 5g15 9g43 23g09 3g39 21g53 0g19 5g11 8g36 10g50 2g10 11g49 1g20 5g46 0g00 2g30 7g09 10g42 13g00 4g15 15g41 4g55 6g11 9g24 10g39 3g24 4g38 5g55 7g10 11g21 12g40 14g35 16g08 17g04 18g21 7g34 9g03 10g53 15g10 MƯƠNG MÁN THÁP CHÀM NHA TRANG 4g10 TUY HÒA DIÊU TRÌ 8g12 QUẢNG NGÃI TAM KỲ ĐÀ NẴNG HUEÁ 13g27 16g21 19g04 22g42 8g29 12g29 12g20 15g47 6g19 11g12 9g26 14g32 14g41 18g13 17g43 21g14 20g17 23g50 ĐÔNG HÀ ĐỒNG HỚI 19g15 0g14 2g27 13g52 15g52 17g12 19g46 12g42 14g41 16g05 17g59 19g38 21g38 22g39 0g52 1g25 3g28 VINH 23g21 THANH HÓA NINH BÌNH NAM ĐỊNH PHỦ LÝ ĐẾN HÀ NỘI 5g00 7g45 21g00 1g08 20g12 23g50 2g59 7g07 9g20 10g44 12g04 12g37 13g23 0g01 1g28 2g01 2g42 4g33 5g54 6g26 7g08 23g09 0g31 1g24 2g02 3g33 4g50 5g22 6g00 6g39 7g57 8g29 9g09 9g59 11g12 11g44 12g23 12g20 13g51 14g25 15g06 14g40 4g00 8g30 3g15 7g10 10g25 13g45 16g20 Sử dụng kiểu liệu bản, xây dựng cấu trúc liệu thích hợp để lưu trữ bảng tàu vào nhớ nhớ (disk) máy tính Với cấu trúc liệu xây dựng trên, trình bày thuật toán cài đặt chương trình để thực công việc sau: - Xuất đến tàu T0 ga G0 Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật - Xuất đến ga tàu T0 - Xuất tàu đến ga G0 - Xuất bảng tàu theo mẫu Lưu ý: - Các ô trống ghi nhận ga đó, tàu không đến qua mà không dừng lại - Dòng “HÀNH TRÌNH” ghi nhận tổng số tàu chạy từ ga Saigon đến ga Hà nội Tương tự tập cần ghi nhận thêm thông tin đoàn tàu dừng ga để tránh tàu hay khách lên/xuống (các dòng in nghiêng tương ứng với ga có khách lên/xuống, dòng khác dừng để tránh tàu) Sử dụng kiểu liệu cấu trúc C, xây dựng cấu trúc liệu để lưu trữ nhớ (RAM) máy tính trạng thái cột đèn giao thông (có đèn: Xanh, Đỏ, Vàng) Với cấu trúc liệu xây dựng, trình bày thuật toán cài đặt chương trình để mô (minh họa) cho hoạt động cột đèn hai tuyến đường giao ngã tư 10 Sử dụng kiểu liệu C, xây dựng cấu trúc liệu để lưu trữ nhớ (RAM) máy tính trạng thái bàn cờ CARO có kích thước M×N (0 ≤ M, N ≤ 20) Với cấu trúc liệu xây dựng, trình bày thuật toán cài đặt chương trình để thực công việc sau: - In hình bàn cờ CARO trạng thái hành - Kiểm tra xem có thắng hay không? Nếu có thông báo “Kết thúc”, thông báo “Tiếp tục” Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Chương 2: KỸ THUẬT TÌM KIẾM (SEARCHING) 2.1 Khái quát tìm kiếm Trong thực tế, thao tác, khai thác liệu lúc phải thực thao tác tìm kiếm Việc tìm kiếm nhanh hay chậm tùy thuộc vào trạng thái trật tự liệu Kết việc tìm kiếm (không tìm thấy) có (tìm thấy) Nếu kết tìm kiếm có tìm thấy nhiều phải xác định xem vị trí phần tử liệu tìm thấy đâu? Trong phạm vi chương tìm cách giải câu hỏi Trước vào nghiên cứu chi tiết, giả sử phần tử liệu xem xét có thành phần khóa (Key) để nhận diện, có kiểu liệu T đó, thành phần lại thông tin (Info) liên quan đến phần tử liệu Như phần tử liệu có cấu trúc liệu sau: typedef struct DataElement { T Key; InfoType Info; } DataType; Trong tài liệu này, nói tới giá trị phần tử liệu muốn nói tới giá trị khóa (Key) phần tử liệu Để đơn giản, giả sử phần tử liệu thành phần khóa nhận diện Việc tìm kiếm phần tử diễn dãy/mảng (tìm kiếm nội) diễn tập tin/ file (tìm kiếm ngoại) Phần tử cần tìm phần tử cần thỏa mãn điều kiện tìm kiếm (thường có giá trị giá trị tìm kiếm) Tùy thuộc vào toán cụ thể mà điều kiện tìm kiếm khác song việc tìm kiếm liệu thường vận dụng theo thuật toán trình bày sau 2.2 Các giải thuật tìm kiếm nội (Tìm kiếm dãy/mảng) 2.2.1 Đặt vấn đề Giả sử có mảng M gồm N phần tử Vấn đề đặt có hay không phần tử có giá trị X mảng M? Nếu có phần tử có giá trị X phần tử thứ mảng M? 2.2.2 Tìm tuyến tính (Linear Search) Thuật toán tìm tuyến tính gọi Thuật toán tìm kiếm (Sequential Search) a Tư tưởng: Lần lượt so sánh phần tử mảng M với giá trị X phần tử tìm đến phần tử có giá trị X duyệt qua hết tất phần tử mảng M kết thúc Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật b Thuật toán: B1: k = //Duyệt từ đầu mảng B2: IF M[k] ≠ X AND k ≤ N //Neáu chưa tìm thấy chưa duyệt hết mảng B2.1: k++ B2.2: Lặp lại B2 B3: IF k ≤ N Tìm thấy vị trí k B4: ELSE Không tìm thấy phần tử có giá trị X B5: Kết thúc c Cài đặt thuật toán: Hàm LinearSearch có prototype: int LinearSearch (T M[], int N, T X); Hàm thực việc tìm kiếm phần tử có giá trị X mảng M có N phần tử Nếu tìm thấy, hàm trả số nguyên có giá trị từ đến N-1 vị trí tương ứng phần tử tìm thấy Trong trường hợp ngược lại, hàm trả giá trị –1 (không tìm thấy) Nội dung hàm nhö sau: int LinearSearch (T M[], int N, T X) { int k = 0; while (M[k] != X && k < N) k++; if (k < N) return (k); return (-1); } d Phân tích thuật toán: - Trường hợp tốt phần tử mảng có giá trị X: Số phép gán: Gmin = Số phép so sánh: Smin = + = - Trường hợp xấu không tìm thấy phần tử có giá trị X: Số phép gán: Gmax = Số phép so sánh: Smax = 2N+1 - Trung bình: Số phép gán: Gavg = Số phép so sánh: Savg = (3 + 2N + 1) : = N + e Caûi tiến thuật toán: Trong thuật toán trên, bước lặp cần phải thực phép so sánh để kiểm tra tìm thấy kiểm soát hết mảng trình duyệt mảng Chúng ta giảm bớt phép so sánh thêm vào cuối mảng phần tử cầm canh (sentinel/stand by) có giá trị X để nhận diện hết mảng duyệt mảng, thuật toán cải tiến lại sau: Trang: CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật B1: k = B2: M[N+1] = X //Phần tử cầm canh B3: IF M[k] ≠ X B3.1: k++ B3.2: Lặp lại B3 B4: IF k < N Tìm thấy vị trí k B5: ELSE //k = N song phần tử cầm canh Không tìm thấy phần tử có giá trị X B6: Kết thúc Hàm LinearSearch viết lại thành hàm LinearSearch1 sau: int LinearSearch1 (T M[], int N, T X) { int k = 0; M[N] = X; while (M[k] != X) k++; if (k < N) return (k); return (-1); } f Phân tích thuật toán cải tiến: - Trường hợp tốt phần tử mảng có giá trị X: Số phép gán: Gmin = Số phép so sánh: Smin = + = - Trường hợp xấu không tìm thấy phần tử có giá trị X: Số phép gán: Gmax = Số phép so sánh: Smax = (N+1) + = N + - Trung bình: Số phép gán: Gavg = Số phép so sánh: Savg = (2 + N + 2) : = N/2 + - Như vậy, thời gian thực phép gán không đáng kể thuật toán cải tiến chạy nhanh thuật toán nguyên thủy 2.2.3 Tìm nhị phân (Binary Search) Thuật toán tìm tuyến tính tỏ đơn giản thuận tiện trường hợp số phần tử dãy không lớn Tuy nhiên, số phần tử dãy lớn, chẳng hạn tìm kiếm tên khách hàng danh bạ điện thoại thành phố lớn theo thuật toán tìm thực nhiều thời gian Trong thực tế, thông thường phần tử dãy có thứ tự, thuật toán tìm nhị phân sau rút ngắn đáng kể thời gian tìm kiếm dãy có thứ tự Trong thuật toán giả sử phần tử dãy có thứ tự tăng (không giảm dần), tức phần tử đứng trước có giá trị nhỏ (không lớn hơn) phần tử đứng sau Khi đó, X nhỏ giá trị phần tử đứng dãy (M[Mid]) X tìm Trang: 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật { switch (BTree->Bal) { case -1: BTree->Bal = 0; Taller = 0; break; case 0: BTree->Bal = 1; break; case 1: BAL_Type AncL = BTree->BAL_Left; if (AncL->Bal != -1) { BTree->BAL_Left = AncL->BAL_Right AncL->BAL_Right = BTree; if (AncL->Bal == 1) BTree->Bal = AncL->Bal = 0; else AncL->Bal = -1; BTree = AncL; } else { BAL_Type AncLR = AncL->BAL_Right; BTree->BAL_Left = AncLR->BAL_Right; AncL->BAL_Right = AncLR->BAL_Left; AncLR->BAL_Right = BTree; AncLR->BAL_Left = AncL; if (AncLR->Bal == -1) { BTree->Bal = AncLR->Bal = 0; AncL->Bal = 1; } else if (AncLR->Bal == 1) AncL->Bal = AncLR->Bal = 0; else AncL->Bal = BTree->Bal = 0; BTree = AncLR; } Taller = 0; break; } // switch } // if (Taller == 1) } // else: (BTree->Key > NewData) return (BTree); } b Hủy nút khỏi cân bằng: Tương tự tháo tác thêm, giả sử cần hủy nút DelNode có thành phần liệu DelData khỏi cân BALTree cho sau hủy BALTree cân Để thực điều trước hết phải thực việc tìm kiếm vị trí nút cần hủy nút trái nút phải Trang: 215 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật nút PrDelNode tương tự nhị phân tìm kiếm Việc hủy chia làm ba trường hợp nhị phân tìm kiếm: - DelNode nút lá, - DelNode nút trung gian có 01 con, - DelNode nút có đủ 02 Trong trường hợp DelNode có đủ 02 sử dụng phương pháp hủy phần tử mạng theo phương pháp làm cho chiều cao biến động phương pháp Sau hủy DewNode khỏi trái phải PrNewNode số cân nút từ PrDelNode trở nút trước bị thay đổi dây chuyền phải lần ngược từ PrDelNode theo nút trước để theo dõi thay đổi Nếu phát nút AncNode có thay đổi vượt phạm vi cho phép (bằng –2 +2) tiến hành cân lại nút AncNode Việc cân lại nút AncNode tiến hành cụ thể theo trường hợp tương tự thao tác thêm: - Thuật toán đệ quy để hủy nút nhị phân tìm kiếm cân tương đối (BAL_Delete_Node): // Tìm nút cần hủy nút cha nút cần hủy B1: PrDelNode = NULL B2: IF (BALTree = NULL) B2.1: Shorter = False B2.2: Thực Bkt B3: PrDelNode = BALTree B4: IF (BALTree->Key > DelData) // Chuyển sang traùi B4.1: OnTheLeft = True B4.2: BAL_Delete_Node (BALTree->BAL_Left, DelData, Shorter) B5: IF (BALTree->Key < DelData) // Chuyển sang phaûi B5.1: OnTheLeft = False B5.2: BAL_Delete_Node (BALTree->BAL_Right, DelData, Shorter) B6: If (Shorter = True) B6.1: if (OnTheLeft = True) B6.1.1: if (BALTree->Bal = 1) // Cây cân tốt B6.1.1.1: BALTree->Bal = B6.1.1.2: Shorter = False // Cây bị thấp cân B6.1.2: if (BALTree->Bal = 0) BALTree->Bal = -1 B6.1.3: if (BALTree->Bal = -1) // Cây cân B6.1.3.1: AncR = BALTree->BAL_Right B6.1.3.2: if (AncR->Bal ≠ 1) // Thực quay đơn B6.1.3.2.1: BALTree->BAL_Right = AncR->BAL_Left B6.1.3.2.2: AncR->BAL_Left = BALTree B6.1.3.2.3: if (AncR->Bal = -1) Trang: 216 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giaùo trình: Cấu Trúc Dữ Liệu Giải Thuật BALTree->Bal = AncR->Bal = B6.1.3.2.4: else AncR->Bal = B6.1.3.2.5: BALTree = AncR B6.1.3.3: else // Thực quay kép B6.1.3.3.1: AncRL = AncR->BAL_Left B6.1.3.3.2: BALTree->BAL_Right = AncRL->BAL_Left B6.1.3.3.3: AncR->BAL_Left = AncRL->BAL_Right B6.1.3.3.4: AncRL->BAL_Left = BALTree B6.1.3.3.5: AncRL->BAL_Right = AncR B6.1.3.3.6: if (AncRL->Bal = 1) B6.1.3.3.6.1: BALTree->Bal = AncRL->Bal = B6.1.3.3.6.2: AncR->Bal = -1 B6.1.3.3.7: if (AncRL->Bal = -1) AncR->Bal = AncRL->Bal = B6.1.3.3.8: if (AncRL->Bal = 0) AncR->Bal = BALTree->Bal = B6.1.3.3.9: BALTree = AncRL B6.1.3.4: Shorter = False B6.2: else // (OnTheLeft = False) B6.2.1: if (BALTree->Bal = -1) // Cây cân tốt B6.2.1.1: BALTree->Bal = B6.2.1.2: Shorter = False // Cây bị thấp cân B6.2.2: if (BALTree->Bal = 0) BALTree->Bal = B6.2.3: if (BALTree->Bal = 1) // Cây cân B6.2.3.1: AncL = BALTree->BAL_Left B6.2.3.2: if (AncL->Bal ≠ -1) // Thực quay đơn B6.2.3.2.1: BALTree->BAL_Left = AncL->BAL_Right B6.2.3.2.2: AncL->BAL_Right = BALTree B6.2.3.2.3: if (AncL->Bal = 1) BALTree->Bal = AncL->Bal = B6.2.3.2.4: else AncL->Bal = B6.2.3.2.5: BALTree = AncL B6.2.3.3: else // Thực quay kép B6.2.3.3.1: AncLR = AncL->BAL_Right B6.2.3.3.2: BALTree->BAL_Left = AncLR->BAL_Right B6.2.3.3.3: AncL->BAL_Right = AncLR->BAL_Left B6.2.3.3.4: AncLR->BAL_Right = BALTree B6.2.3.3.5: AncLR->BAL_Left = AncL B6.2.3.3.6: if (AncLR->Bal = -1) B6.2.3.3.6.1: BALTree->Bal = AncLR->Bal = B6.2.3.3.6.2: AncL->Bal = B6.2.3.3.7: if (AncLR->Bal = 1) AncL->Bal = AncLR->Bal = Trang: 217 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuaät B6.2.3.3.8: if (AncLR->Bal = 0) AncL->Bal = BALTree->Bal = B6.2.3.3.9: BALTree = AncLR B6.2.3.4: Shorter = False // Chuyển mối quan hệ DelNode cho nút khác B7: IF (PrDelNode = NULL) // Hủy nút gốc // Nếu nút cần hủy nút B7.1: If (BALTree->BAL_Left = NULL) and (BALTree->BAL_Right = NULL) B7.1.1: BALTree = NULL B7.1.2: delete BALTree B7.1.3: Thực Bkt // Nếu nút cần hủy có phải B7.2: If (BALTree->BAL_Left = NULL) and (BALTree->BAL_Right != NULL) B7.2.1: BALTree = BALTree->BAL_Right B7.2.2: BALTree->BAL_Right = NULL B7.2.3: delete BALTree B7.2.4: Thực Bkt // Nếu nút cần hủy có trái B7.3: If (BALTree->BAL_Left != NULL) and (BALTree->BAL_Right = NULL) B7.3.1: BALTree = BALTree->BAL_Left B7.3.2: BALTree->BAL_Left = NULL B7.3.3: delete BALTree B7.3.4: Thực Bkt B8: ELSE // nút cần hủy nút gốc // Nếu nút cần hủy nút B8.1: If (BALTree->BAL_Left = NULL) and (BALTree->BAL_Right = NULL) // Nút cần hủy trái PrDelNode B8.1.1: if (OnTheLeft = True) PrDelNode->BAL_Left = NULL B8.1.2: else // Nút cần hủy phải PrDelNode PrDelNode->BAL_Right = NULL B8.1.3: delete BALTree B8.1.4: Thực Bkt // Nếu nút cần hủy có phải B8.2: If (BALTree->BAL_Left = NULL) and (BALTree->BAL_Right != NULL) B8.2.1: if (OnTheLeft = True) PrDelNode->BAL_Left = BALTree->BAL_Right B8.2.2: else PrDelNode->BAL_Right = BALTree->BAL_Right B8.2.3: BALTree->BAL_Right = NULL B8.2.4: delete BALTree B8.2.5: Thực Bkt // Nếu nút cần hủy có trái B8.3: If (BALTree->BAL_Left != NULL) and (BALTree->BAL_Right = NULL) Trang: 218 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật B8.3.1: if (OnTheLeft = True) PrDelNode->BAL_Left = BALTree->BAL_Left B8.3.2: else PrDelNode->BAL_Right = BALTree->BAL_Left B8.3.3: BALTree->BAL_Left = NULL B8.3.4: delete BALTree B8.3.5: Thực Bkt // Nếu DelNode có hai B9: If (BALTree->BAL_Left != NULL) and (BALTree->BAL_Right != NULL) // Tìm nút trái phải nút cần hủy nút cha B9.1: MLNode = BALTree->BAL_Right B9.2: PrMLNode = BALTree B9.3: if (MLNode->BAL_Left = NULL) Thực B9.7 B9.4: PrMLNode = MLNode B9.5: MLNode = MLNode->BAL_Left B9.6: Lặp lại B9.3 // Chép liệu từ MLNode DelNode B9.7: BALTree->Key = MLNode->Key // Chuyển phải MLNode trái PrMLNode B9.8: if (PrMLNode = BALTree) // MLNode nút phải PrMLNode PrMLNode->BAL_Right = MLNode->BAL_Right B9.9: else // MLNode nút trái PrMLNode PrMLNode->BAL_Left = MLNode->BAL_Right B9.10: MLNode->BAL_Right = NULL // Chuyển vai trò MLNode cho nút cần hủy B9.11: BALTree = MLNode Bkt: Kết thúc - Cài đặt thuật toán: Hàm BAL_Del_Node có prototype: int BAL_Del_Node(BAL_Type &BALTree, T Data, int &Shorter, BAL_Type &PrDNode, int &OnTheLeft); Haøm thực việc hủy nút có thành phần Key Data nhị phân tìm kiếm cân BALTree phương pháp hủy phần tử mạng phần tử phải trái nút cần hủy (nếu nút cần hủy có hai con) Hàm trả giá trị việc hủy thành công (có nút để hủy), trường hợp ngược lại hàm trả giá trị (không tồn nút có Key Data rỗng) int BAL_Del_Node(BAL_Type &BALTree, T Data, int &Shorter, BAL_Type &PrDNode, int &OnTheLeft) { if (BALTree != NULL) { Shorter = 0; PrDNode = NULL; return (0) } Trang: 219 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật PrDNode = BALTree; if (BALTree->Key > Data) // Hủy nút trái { OnTheLeft = 1; return(BAL_Del_Node (BALTree->BAL_Left, Data, Shorter, PrDNode)); } if (BALTree->Key < Data) // Hủy nút phải { OnTheLeft = 0; return(BAL_Del_Node (BALTree->BAT_Right, Data, Shorter, PrDNode)); } if (Shorter == True) { if (OnTheLeft == 1) { if (BALTree->Bal == 1) // Cây cân tốt { BALTree->Bal = 0; Shorter = 0; } if (BALTree->Bal==0) //Cây bị thấp cân BALTree->Bal = -1; if (BALTree->Bal == -1) // Cây cân baèng { BAL_Type AncR = BALTree->BAL_Right; if (AncR->Bal != 1) // Thực quay đơn { BALTree->BAL_Right = AncR->BAL_Left; AncR->BAL_Left = BALTree; if (AncR->Bal == -1) BALTree->Bal = AncR->Bal = 0; else AncR->Bal = 1; BALTree = AncR; } else // Thực quay kép { BAL_Type AncRL = AncR->BAL_Left; BALTree->BAL_Right = AncRL->BAL_Left; AncR->BAL_Left = AncRL->BAL_Right; AncRL->BAL_Left = BALTree; AncRL->BAL_Right = AncR; if (AncRL->Bal == 1) { BALTree->Bal = AncRL->Bal = 0; AncR->Bal = -1; } if (AncRL->Bal == -1) AncR->Bal = AncRL->Bal = 0; if (AncRL->Bal == 0) AncR->Bal = BALTree->Bal = 0; BALTree = AncRL; } Shorter = 0; } } else // (OnTheLeft = 0) Trang: 220 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật { if (BALTree->Bal == -1) // Cây cân tốt { BALTree->Bal = 0; Shorter = 0; } // Cây bị thấp cân if (BALTree->Bal == 0) BALTree->Bal = 1; if (BALTree->Bal == 1) // Cây cân { BAL_Type AncL = BALTree->BAL_Left; if (AncL->Bal != -1) // Thực quay đơn { BALTree->BAL_Left = AncL->BAL_Right; AncL->BAL_Right = BALTree; if (AncL->Bal == 1) BALTree->Bal = AncL->Bal = 0; else AncL->Bal = 1; BALTree = AncL; } else // Thực quay kép { BAL_Type AncLR = AncL->BAL_Right; BALTree->BAL_Left = AncLR->BAL_Right; AncL->BAL_Right = AncLR->BAL_Left; AncLR->BAL_Right = BALTree; AncLR->BAL_Left = AncL; if (AncLR->Bal == -1) { BALTree->Bal = AncLR->Bal = 0; AncL->Bal = 1; } if (AncLR->Bal == 1) AncL->Bal = AncLR->Bal = 0; if (AncLR->Bal == 0) AncL->Bal = BALTree->Bal = 0; BALTree = AncLR } Shorter = 0; } } } if (PrDNode == NULL) // hủy nút gốc { if (BALTree->BAL_Left == NULL && BALTree->BAL_Right == NULL) BALTree = NULL; else if (BALTree->BST_Left == NULL) // nút cần hủy có phải { BALTree = BALTree->BAL_Right; BALTree->BAL_Right = NULL; } else if (BALTree->BAL_Right == NULL) //nút cần hủy có trái Trang: 221 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật { BALTree = BALTree->BAL_Left; BALTree->BAL_Left = NULL; } } else // nút cần hủy nút trung gian { if (BALTree->BAL_Left == NULL && BALTree->BAL_Right == NULL) if (OnTheLeft == 1) PrDNode->BAL_Left = NULL; else PrDNode->BAL_Right = NULL; else if (BALTree->BAL_Left == NULL) { if (OnTheLeft == 1) PrDNode->BAL_Left = BALTree->BAL_Right; else PrDNode->BAL_Right = BALTree->BAL_Right; BALTree->BAL_Right = NULL; } else if (BALTree->BAL_Right == NULL) { if (OnTheLeft == 1) PrDNode->BAL_Left = BALTree->BAL_Left; else PrDNode->BAL_Right = BALTree->BAL_Left; BALTree->BAL_Left = NULL; } } if (BALTree->BAL_Left != NULL && BALTree->BAL_Right != NULL) { BAL_Type MLNode = BALTree->BAL_Right; BAL_Type PrMLNode = BALTree; while (MLNode->BAL_Left != NULL) { PrMLNode = MLNode; MLNode = MLNode->BAL_Left; } BALTree->Key = MLNode->Key; if (PrMLNode == BALTree) PrMLNode->BAL_Right = MLNode->BAL_Right; else PrMLNode->BAL_Left = MLNode->BAL_Right; MLNode->BAL_Right = NULL; BALTree = MLNode; } delete BALTree; return (1); } Trang: 222 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Câu hỏi Bài tập Trình bày khái niệm, đặc điểm cấu trúc liệu loại cây? So sánh với danh sách liên kết? Hãy đưa phương pháp để chuyển từ cấu trúc liệu N-phân nói chung thành nhị phân? Trình bày thuật toán cài đặt tất thao tác nhị phân tìm kiếm, nhị phân tìm kiếm cân bằng? Trình bày thuật toán cài đặt tất thao tác nhị phân tìm kiếm, nhị phân tìm kiếm cân trường hợp chấp nhận trùng khóa nhận diện nút cây? Trình bày tất thuật toán cài đặt tất thuật toán để thực việc hủy nút nhị phân tìm kiếm có 02 con? Theo bạn, thuật toán đơn giản? Cho nhận xét thuật toán? Trình bày cài đặt tất thuật toán để thực thao tác nhị phân tìm kiếm, nhị phân tìm kiếm cân hai trường hợp: Chấp nhận Không chấp nhận trùng lắp khóa nút cách không sử dụng thuật toán đệ quy (Trừ thao tác trình bày tài liệu)? Trình bày thuật toán cài đặt chương trình thực công việc sau nhị phân: a) Tính số nút b) Tính số nút trung gian c) Tính chiều dài đường tới nút có khóa K d) Cho biết cấp nút có khóa K Trình bày thuật toán cài đặt chương trình thực công việc tạo nhị phân tìm kiếm mà khóa nút khóa nút danh sách liên kết đôi cho tối ưu hóa nhớ Biết rằng, danh sách liên kết đôi ban đầu không cần thiết sau tạo xong nhị phân tìm kiếm giả sử không cho phép trùng khóa nút Với yêu cầu tập trên, trường hợp danh sách liên kết có nhiều nút có thành phần liệu giống nhau, bạn đề xuất phương án giải để không bị liệu sau tạo xong nhị phân tìm kiếm 10 Trình bày thuật toán cài đặt chương trình thực công việc chuyển nhị phân tìm kiếm thành danh sách liên kết đôi cho tối ưu hóa nhớ Biết rằng, nhị phân tìm kiếm ban đầu không cần thiết sau tạo xong danh sách liên kết (ngược với yêu cầu tập 8) 11 Trình bày thuật toán cài đặt chương trình thực công việc nhập hai nhị phân tìm kiếm thành nhị phân tìm kiếm cho tối ưu nhớ Biết rằng, hai nhị phân tìm kiếm ban đầu không cần thiết sau tạo xong Trang: 223 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật ÔN TẬP (REVIEW) Hệ thống lại Cấu trúc liệu Giải thuật học Chương 1: Tổng quan Cấu Trúc Dữ Liệu Giải Thuật Tầm quan trọng Cấu trúc liệu Giải thuật đề án tin học 1.1 Xây dựng Cấu trúc liệu 1.2 Xây dựng Giải thuật 1.3 Mối quan hệ Cấu trúc liệu Giải thuật Đánh giá Cấu trúc liệu Giải thuật 2.1 Các tiêu chuẩn đánh giá Cấu trúc liệu - Thời gian thực - Mức độ tiêu tốn nhớ - Tính thực tế 2.2 Đánh giá độ phức tạp thuật toán Kiểu liệu 3.1 Khái niệm Kiểu liệu T = {V, O} 3.2 Các kiểu liệu sở - Nguyên - Thực - Ký tự 3.3 Các kiểu liệu có cấu trúc - Mảng - Cấu trúc (struct) 3.4 Kiểu liệu trỏ T * Pt; 3.5 Kiểu liệu tập tin FILE * Fp; int Fh; Chương 2: Kỹ thuật tìm kiếm (Searching) Khái quát tìm kiếm Các giải thuật tìm kiếm nội (tìm kiếm dãy) 2.1 Tìm tuyến tính (Linear Search) Duyệt từ đầu đến cuối mảng để tìm 2.2 Tìm nhị phân (Binary Search) Duyệt nửa phần tử, áp dụng cho mảng có thứ tự Các giải thuật tìm kiếm ngoại (tìm kiếm tập tin) 3.1 Tìm tuyến tính (Linear Search) Duyệt từ đầu đến cuối file để tìm 3.2 Tìm kiếm theo mục (Index Search) Duyệt từ đầu đến tập tin mục để lấy liệu tập tin liệu Chương 3: Kỹ thuật xếp (Sorting) Khái quát xếp Các phương pháp xếp nội (sắp xếp dãy) Trang: 224 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật 2.1 Sắp xếp phương pháp đổi chỗ (Exchange) - Nổi bọt (Bubble Sort) - Phân hoạch (Quick Sort) 2.3 Sắp xếp phương pháp chọn (Selection) Chọn trực tiếp (Straight Selection Sort) 2.4 Sắp xếp phương pháp chèn (Insertion) - Chèn trực tiếp (Straight Insertion Sort) 2.5 Sắp xếp phương pháp trộn (Merge) - Trộn trực tiếp (Straight Merge Sort) - Trộn tự nhiên (Natural Merge Sort) Các phương pháp xếp ngoại (sắp xếp tập tin) 3.1 Sắp xếp phương pháp trộn - Trộn trực tiếp (Straight Merge Sort) - Trộn tự nhiên (Natural Merge Sort) 3.2 Sắp xếp theo mục Chương 4: Danh sách (List) Khái niệm danh sách Các phép toán danh sách Danh sách đặc (Condensed List) 3.1 Định nghóa 3.2 Biểu diễn Các thao tác const int MaxLen = 10000; // hoặc: #define MaxLen 10000 int Length; T CD_LIST[MaxLen]; // hoaëc: T * CD_LIST = new T[MaxLen]; 3.3 Ưu nhược điểm Ứng dụng Danh sách liên kết (Linked List) 4.1 Định nghóa 4.2 Danh sách liên kết đơn (Singly Linked List) typedef struct SLL_Node { T Key; SLL_Node * NextNode; } SLL_OneNode; typedef SLL_OneNode * SLL_Type; 4.3 Danh sách liên kết kép (Doubly Linked List) typedef struct DLL_Node { T Key; DLL_Node * NextNode; DLL_Node * PreNode; } DLL_OneNode; typedef DLL_OneNode * DLL_Type; 4.4 Ưu nhược điểm danh sách liên kết Danh sách hạn chế 5.1 Hàng đợi (Queue) typedef struct Q_C Trang: 225 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật { int Len; // Chiều dài hàng đợi int Front, Rear; T * List; // Nội dung hàng đợi } C_QUEUE; C_QUEUE CQ_List; 5.2 Ngăn xếp (Stack) typedef struct S_C { int Size; // Kích thước ngăn xếp int SP; T * List; // Nội dung ngăn xếp } C_STACK; C_STACK CS_List; Chương 5: Cây (Tree) Các khái niệm Cây nhị phân (Binary tree) 2.1 Định nghóa 2.2 Biểu diễn Các thao taùc typedef struct BinT_Node { T Key; BinT_Node * BinT_Left; BinT_Node * BinT_Right; } BinT_OneNode; typedef BinT_OneNode * BinT_Type; 2.3 Cây nhị phân tìm kiếm (Binary Searching Tree) typedef struct BST_Node { T Key; BST_Node * BST_Left; BST_Node * BST_Right; } BST_OneNode; typedef BST_OneNode * BST_Type; Cây cân (Balanced tree) 3.1 Định nghóa typedef struct BAL_Node { T Key; int Bal; BAL_Node * BAL_Left; BAL_Node * BAL_Right; } BAL_OneNode; typedef BAL_OneNode * BAL_Type; 3.2 Caùc thao taùc Trang: 226 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Câu hỏi Bài tập ôn tập tổng hợp Phân biệt cấu trúc liệu, ý nghóa tác dụng giữa: danh sách liên kết đôi, danh sách đa liên kết có hai mối liên kết nhị phân? Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ số nguyên có dấu có giá trị tuyệt đối lớn nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc cộng, trừ, nhân, chia nguyên, lấy dư, so sánh số nguyên có giá trị lớn Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ độ dài đường Thành phố với quốc gia vào nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc liệt kê tất đường từ Thành phố A đến Thành phố B? Đường đường ngắn nhất? Các văn lưu trữ thành dòng file văn bản, dòng có chiều dài không 127 ký tự Hãy đề xuất cấu trúc liệu thích hợp để lưu trữ nhớ máy tính tần suất xuất từ tập tin văn Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc thống kê xem từ file văn xuất với tần suất nào? Cho biết văn có từ, tên từ? Các văn lưu trữ thành dòng file văn bản, dòng có chiều dài không 127 ký tự Hãy đề xuất cấu trúc liệu thích hợp để lưu trữ nhớ máy tính dòng văn tập tin văn (có thể nhớ không đủ để lưu toàn nội dung tập tin văn vào nhớ máy tính) Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc nội tập tin văn theo trang hình cho sử dụng phím PgUp/PgDn để lật lên/xuống theo trang hình sử dụng phím Up-arrow/Down-arrow trôi lên/xuống dòng văn hình? Cho biết văn có dòng? Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ ma trận thưa (ma trận mà chủ yếu giá trị phần tử 0) nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc cộng, trừ, nhân hai ma trận thưa với nhau, tạo ma trận thưa chuyển vị từ ma trận thưa khác Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ Gia phả dòng họ nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc kiểm tra xem 02 người có tên X Y có phải hai anh em ruột hay không? Nếu có “vai vế” cao hơn? Giả sử cặp vợ chồng có không 05 người Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ hệ thống Menu có nhiều mục chọn, nhiều cấp nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc cho menu xuất hình cho phép người sử dụng chọn chức menu Kết hợp cấu trúc liệu tập 4, Hãy trình bày thuật toán cài đặt chương trình thực chức phần mềm soạn thảo văn đơn giản? Trang: 227 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật 10 Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ từ từ điển vào tập tin có tên DICT.DAT Thông tin giải nghóa từ bao gồm: Tên từ, Loại từ (Danh từ, động từ, tính từ, …), nghóa tiếng Việt a) Sử dụng tập tin mục để liệt kê từ theo thứ tự Alphabet (A -> Z) b) Hãy đề xuất cấu trúc liệu thích hợp để lưu trữ nhớ máy tính thông tin giải nghóa từ tập tin DICT.DAT (có thể nhớ không đủ để lưu toàn nội dung tập tin DICT.DAT vào nhớ máy tính) Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực việc tra nghóa cho từ Ngoài ra, ta sử dụng phím PgUp/PgDn để lật lên/xuống theo trang (do quy định) hình sử dụng phím Up-arrow/Down-arrow trôi lên/xuống từ hình? Sử dụng cấu trúc liệu thích hợp để lưu trữ nhớ từ tra nghóa 11 Người ta lưu trữ hệ số đa thức bậc n thành dòng văn file DATHUC.DAT theo nguyên tắc: Mỗi dòng hệ số số mũ đa thức hệ số số mũ cách khoảng trắng Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ đa thức vào nhớ máy tính Với cấu trúc liệu này, trình bày thuật toán cài đặt chương trình thực công việc sau: - Xuất đa thức file DATHUC.DAT hình; - Tính đa thức tổng, đa thức hiệu đa thức này; - Tính đa thức tích đa thức 12 Một hình vuông có độ dài cạnh a tô 02 màu: trắng đen Người ta tiến hành chia hình vuông thành 04 hình vuông ghi nhận vị trí chúng hình vuông lớn Nếu hình vuông gồm toàn màu trắng màu đen giữ nguyên, hình vuông có 02 màu tiếp tục chia hình vuông thành 04 hình vuông nhỏ ghi nhận vị trí, …, sau số hữu hạn phép chia kết thúc việc chia Hãy sử dụng cấu trúc liệu thích hợp để lưu trữ hình vuông vào nhớ máy tính Với cấu trúc liệu lựa chọn, trình bày thuật toán cài đặt chương trình thực công việc sau: - Tính tổng số hình vuông tạo thành qua lần chia - Tính tổng số hình vuông màu trắng, màu đen tổng diện tích tương ứng chúng - Tái tạo lại hình vuông ban đầu 13 Định nghóa cấu trúc liệu thích hợp để lưu trữ giá trị tam giác Pascal vào nhớ máy tính Với cấu trúc liệu trình bày thuật toán viết chương trình thực công việc sau: - In tam giác Pascal có N dòng hình - In tính giá trị biểu thức (a+b)N hình 14 Trình bày thuật toán viết chương trình thực công việc minh họa (Demo) trình thực tất thuật toán học Trang: 228 CuuDuongThanCong.com https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật IV HƯỚNG DẪN SỬ DỤNG TÀI LIỆU THAM KHẢO Cấu trúc liệu Tác giả: Nguyễn Trung Trực Khoa CNTT, trường ĐHBK TP.HCM Giáo trình Cấu trúc liệu Tác giả: Trần Hạnh Nhi – Dương Anh Đức Khoa CNTT, trường ĐHKHTN – ĐHQG TP.HCM Algorithms + Data Structures = Programs Tác giả: N.Wirth NXB: Prentice Hall, 1976 Data Structures and Algorithms Tác giả: Alfred V.Aho - John E.Hopcroft – Jeffrey D.Ullman NXB: Addison-Wesley Publishing Company Algorithms (Second Edition) Tác giả: Robert Sedgewick NXB: Addison-Wesley Publishing Company Data Structures and Program Design (Third Edition) Taùc giaû: Robert L.Kruse NXB: Prentice Hall Trang: 229 CuuDuongThanCong.com https://fb.com/tailieudientucntt ... https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Lần 4: Min = 15 PosMin = K =3 K+1 M: 25 15 45 60 30 33 20 25 45 60 30 33 20 45 60 30 33 20 45 60 30 33 25 60 30 33 25 60 30 33 45 30 33 45 60 33 45 33 ... thuật toán ngôn ngữ cụ thể 1.1 .3 Mối quan hệ cấu trúc liệu giải thuật Mối quan hệ cấu trúc liệu Giải thuật minh họa đẳng thức: Cấu trúc liệu + Giải thuật = Chương trình Như vậy, có cấu trúc liệu. .. https://fb.com/tailieudientucntt Giáo trình: Cấu Trúc Dữ Liệu Giải Thuật Câu hỏi Bài tập Trình bày tầm quan trọng Cấu trúc liệu Giải thuật người lập trình? Các tiêu chuẩn để đánh giá cấu trúc liệu giải thuật? Khi xây dựng giải