Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 123 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
123
Dung lượng
2,89 MB
Nội dung
Chương Một số cấu trúc liệu giải thuật 1.Đệ qui 2.Cấu trúc dữ liệu (5LT-3BT) KTLT4-2.1 Các khái niệm Cấu trúc liệu • Cấu trúc dữ liệu cách tổ chức thao tác có hệ thống dữ liệu • Một cấu trúc dữ liệu : – Mơ tả • Các liệu cấu thành • Mối liên kết mặt cấu trúc liệu – Xác định thao tác liệu KTLT4-2.2 Các khái niệm Kiểu liệu • Kiểu dữ liệu (primitive data type) – Đại diện cho liệu giống nhau, phân chia nhỏ – Thường ngôn ngữ lập trình định nghĩa sẵn – Ví dụ: • C/C++: int, long, char, boolean, v.v • Thao tác số nguyên: + - * / • Kiểu dữ liệu có cấu trúc (structured data type) – Được xây dựng từ kiểu liệu (cơ bản, có cấu trúc) khác – Có thể ngơn ngữ lập trình định nghĩa sẵn lập trình viên tự định nghĩa KTLT4-2.3 Các khái niệm Dữ liệu, kiểu liệu, cấu trúc liệu Machine Level Data Storage Primitive Data Types 0100110001101001010001 3.1415 28 array Basic Data Structures High-Level Data Structures 'A' stack queue hash table list tree KTLT4-2.4 II Cấu trúc liệu • • • • Mảng ( tự đọc ) Danh sách Cây Bảng băm KTLT4-2.5 • Danh sách (list) Danh sách : – Tập hợp phần tử kiểu – Số lượng phần tử danh sách không cố định • Phân loại: – Danh sách tuyến tính: • Có phần tử đầu tiên, phần tử cuối • Thứ tự trước / sau phần tử xác định rõ ràng – Danh sách khơng tuyến tính: phần tử danh sách không thứ tự • Có nhiều hình thức lưu trữ danh sách – Sử dụng vùng ô nhớ liên tiếp nhớ danh sách – Sử dụng vùng ô nhớ không liên tiếp nhớ danh sách móc nối • Danh sách nối đơn • Danh sách nối kép ………………… KTLT4-2.6 Danh sách • Thao tác danh sách tuyến tính – Khởi tạo danh sách (create) – Kiểm tra danh sách rỗng (isEmpty) – Kiểm tra danh sách đầy (isFull) – Tính kích thước (sizeOf) – Xóa rỗng danh sách (clear) – Thêm phần tử vào danh sách ví trí cụ thể (insert) – Loại bỏ phần tử vị trí cụ thể khỏi danh sách (remove) – Lấy phần tử vị trí cụ thể (retrieve) – Thay giá trị phần tử vị trí cụ thể (replace) – Duyệt danh sách thực thao tác vị trí danh sách (traverse) – KTLT4-2.7 1.1 Danh sách • Sử dụng vector lưu trữ gồm số ô nhớ liên tiếp để lưu trữ danh sách tuyến tính – Các phần tử liền kề lưu trữ ô nhớ liền kề – Mỗi phần tử danh sách gán số thứ tự lưu trữ vector – Tham chiếu đến phần tử sử dụng địa tính giống lưu trữ mảng i last n-1 KTLT4-2.8 1.1 Danh sách • Ưu điểm cách lưu trữ – Tốc độ truy cập vào phần tử danh sách nhanh • Nhược điểm cách lưu trữ – Cần phải biết trước kích thước tối đa danh sách • Tại sao? – Thực phép toán bổ sung phần tử loại bỏ phần tử cũ tốn • Tại sao? KTLT4-2.9 • 1.1.a Thêm phần tử vào danh sách trường hợp – insert(index, element): thêm phần tử element vào vị trí cụ thể index – insert(list, element): thêm phần tử element vào vị trí danh sách list • Điều kiện tiên quyết: – Danh sách phải khởi tạo – Danh sách chưa đầy – Phần tử thêm vào chưa có danh sách • Điều kiện hậu nghiệm: – Phần tử cần thêm vào có danh sách insert(3, ‘z’) z a b c d e f g h KTLT4-2.10 count=9 count=8 Cây tổng quát 3.1 Biểu diễn tổng quát • Biểu diễn giống nhị phân? – Mỗi nút chứa giá trị trỏ trỏ đến nút nó? – Bao nhiêu trỏ cho nút? >>Khơng hợp lý • Mỗi nút chứa giá trị trỏ trỏ đến “tập” nút – Xây dựng “tập” nào? KTLT4-2.109 Biểu diễn tổng quát • Sử dụng trỏ mở rộng hơn: – �Mỗi nút có trỏ: trỏ trỏ đến nút nó, trỏ trỏ đến nút anh em kề với – �Cách cho phép quản lý số lượng tùy ý nút KTLT4-2.110 Ví dụ KTLT4-2.111 3.2 Duyệt tổng quát 1.Thứ tự trước: 1.Thăm gốc 2.Duyệt thứ nhất theo thứ tự trước 3.Duyệt lại theo thứ tự trước 2.Thứ tự giữa 1.Duyệt thứ nhất theo thứ tự giữa 2.Thăm gốc 3.Duyệt lại theo thứ tự giữa 3.Thứ tự sau: 1.Duyệt thứ nhất theo thứ tự sau 2.Duyệt lại theo thứ tự sau 3.Thăm gốc KTLT4-2.112 Ứng dụng nhị phân • �Cây biểu diễn biểu thức – �Tính giá trị biểu thức – �Tính đạo hàm • �Cây định KTLT4-2.113 Cây biểu diễn biểu thức Một loại nhị phân đặc biệt, đó: Mỗi nút chứa tốn hạng Mỗi nút giữa chứa toán tử Cây trái phải nút toán tử thể hiện biểu thức cần đánh giá trước thực hiện toán tử nút gốc KTLT4-2.114 Biểu thức nhị phân KTLT4-2.115 Các mức thứ tự ưu tiên • Các mức (độ sâu) nút thứ tự ưu tiên tương đối chúng biểu thức (không cần dùng ngoặc để thể hiện thứ tự ưu tiên) • Các phép tốn mức cao tính sau các phép tốn có mức thấp • Phép tốn gốc ln thực hiện cuối KTLT4-2.116 • Dễ dàng để tạo biểu thức tiền tố, trung tố, hậu tố • Trung tố:( ( -5 ) * ( ( + ) / ) ) • Tiền tố: * -8 / + • Hậu tố: -4 + / * KTLT4-2.117 (thực chất phép duyệt theo tt giữa, trước sau) Cài đặt biểu thức • Mỗi nút có trỏ struct TreeNode { InfoNode info ;// Dữ liệu TreeNode *left ;// Trỏ tới nút trái TreeNode *right ; // Trỏ tới nút phải }; KTLT4-2.118 • InfoNode có dạng enum OpType { OPERATOR, OPERAND } ; struct InfoNode { OpType whichType; union // ANONYMOUS union { char operator; int operand ; } }; KTLT4-2.119 int Eval(TreeNode* ptr){ switch(ptr->info.whichType) { case OPERAND : returnptr->info.operand ; case OPERATOR : switch ( tree->info.operation ){ case ‘+’: return ( Eval( ptr->left ) + Eval( ptr->right ) ) ; case ‘-’: return ( Eval( ptr->left ) -Eval( ptr->right ) ) ; case ‘*’: return ( Eval( ptr->left ) * Eval( ptr->right ) ) ; case ‘/’: return ( Eval( ptr->left ) / Eval( ptr->right ) ) ; } } } KTLT4-2.120 Cây định (tự đọc) • Dùng để biểu diễn lời giải toán cần định lựa chọn • Bài tốn đồng tiền vàng: – – – – Có đồng tiền vàng a, b, c, d, e, f, g, h Có đồng có trọng lượng khơng chuẩn Sử dụng cân Roberval (2 đĩa) Output: • Đồng tiền k chuẩn nặng hay nhẹ • Số phép cân KTLT4-2.121 KTLT4-2.122 void EightCoins(a, b, c, d, e, f, g, h) { if (a+b+c == d+e+f) { if (g > h) Compare(g, h, a); else Compare(h, g, a); } else if (a+b+c > d+e+f){ if (a+d == b+e) Compare(c, f, a); else if (a+d > b+e) Compare(a, e, b); else Compare(b, d, a); } else{ if (a+d == b+e) Compare(f,c,a); else if (a+d > b+e) Compare(d, b, a); else Compare(e, a, b); } } // so sánh x với đồng tiền chuẩn z void Compare(x,y,z){ if(x>y) printf(“x nặng”); else printf(“y nhẹ”); } KTLT4-2.123 ... xây dựng từ kiểu liệu (cơ bản, có cấu trúc) khác – Có thể ngơn ngữ lập trình định nghĩa sẵn lập trình viên tự định nghĩa KTLT4-2.3 Các khái niệm Dữ liệu, kiểu liệu, cấu trúc liệu Machine Level... Các khái niệm Cấu trúc liệu • Cấu trúc dữ liệu cách tổ chức thao tác có hệ thống dữ liệu • Một cấu trúc dữ liệu : – Mơ tả • Các liệu cấu thành • Mối liên kết mặt cấu trúc liệu – Xác định... liệu – Xác định thao tác liệu KTLT4-2.2 Các khái niệm Kiểu liệu • Kiểu dữ liệu (primitive data type) – Đại diện cho liệu giống nhau, phân chia nhỏ – Thường ngôn ngữ lập trình định nghĩa sẵn –