© 2004, HOÀNG MINH SƠN Chươn g 1 Kỹ thuật lập trình 0101010101010101100001 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 1010011000110010010010 1100101100100010000010 1100101100100010000010 1100101100100010000010 0101010101010101100001 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 1010011000110010010010 1100101100100010000010 1100101100100010000010 1100101100100010000010 0101010101010101100001 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 1010011000110010010010 1100101100100010000010 1100101100100010000010 1100101100100010000010 9/8/2006 y = A*x + B*u; x = C*x + d*u; StateController start() stop() LQGController start() stop() Chương 4: Khái quát về cấu trúc dữ liệu 2 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Nộidung chương 4 4.1 Cấutrúcdữ liệulàgì? 4.2 Mảng và quảnlýbộ nhớ₫ộng 4.2 Xây dựng cấu trúc Vector 4.3 Xây dựng cấutrúcList 3 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu 4.1 Giớithiệuchung Phầnlớn các bài toán trong thựctế liên quan tớicác dữ liệuphứchợp, những kiểudữ liệucơ bảntrong ngôn ngữ lập trình không ₫ủ biểudiễn Ví dụ: —Dữ liệu sinh viên: Họ tên, ngày sinh, quê quán, mã số SV, —Môhìnhhàmtruyền: Đathứctử số, ₫athứcmẫusố —Môhìnhtrạng thái: Các ma trận A, B, C, D —Dữ liệuquátrình: Tên₫ạilượng, dải ₫o, giá trị, ₫ơnvị, thời gian, cấpsaisố, ngưỡng giá trị, — Đốitượng ₫ồ họa: Kích thước, màu sắc, ₫ường nét, phông chữ, Phương pháp biểudiễndữ liệu: ₫ịnh nghĩakiểudữ liệumớisử dụng cấu trúc (struct, class, union, ) 4 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Vấn ₫ề: Biểudiễntậphợpdữ liệu Đasố những dữ liệuthuộcmột ứng dụng có liên quan với nhau => cầnbiểudiễntrongmộttậphợpcócấu trúc, ví dụ: — Danhsáchsinhviên: Cácdữ liệu sinh viên ₫ượcsắpxếptheo thứ tự Alphabet —Mộ hình tổng thể cho hệ thống ₫iều khiển: Bao gồm nhiều thành phầntương tác —Dữ liệuquátrình: Mộttậpdữ liệucóthể mang giá trị của một ₫ạilượng vào các thời ₫iểmgián₫oạn, các dữ liệu ₫ầu vào liên quan tớidữ liệu ₫ầura — Đốitượng ₫ồ họ a: Mộtcửasổ bao gồm nhiều ₫ốitượng ₫ồ họa, mộtbảnvẽ cũng bao gồm nhiều ₫ốitượng ₫ồ họa Thông thường, các dữ liệutrongmộttậphợpcócùng kiểu, hoặcítralàtương thích kiểuvớinhau Kiểumảng không phải bao giờ cũng phù hợp! 5 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Vấn ₫ề: Quảnlý(tậphợp) dữ liệu Sử dụng kếthợpmộtcáchkhéoléokiểucấutrúcvà kiểumảng ₫ủ ₫ể biểudiễncáctậphợpdữ liệubấtkỳ Các giảithuật (hàm) thao tác vớidữ liệu, nhằmquản lý dữ liệumộtcáchhiệuquả: —Bổ sung mộtmụcdữ liệumớivàomột danh sách, mộtbảng, mộttậphợp, —Xóamộtmụcdữ liệutrongmột danh sách, bảng, tậphợp, —Tìmmộtmụcdữ liệutrongmột danh sách, bảng tậphợp, theo mộttiêuchuẩncụ thể —Sắpxếpmột danh sách theo mộttiêuchuẩnnào₫ó — 6 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu QuảnlýDL thế nàolàhiệuquả? Tiếtkiệmbộ nhớ: Phần "overhead" không ₫áng kể so vớiphầndữ liệuthực Truy nhập nhanh, thuậntiện: Thờigiancầnchobổ sung, tìm kiếm và xóa bỏ các mụcdữ liệuphảingắn Linh hoạt: Số lượng các mụcdữ liệu không (hoặcít) bị hạnchế cố₫ịnh, không cầnbiếttrướckhitạocấu trúc, phù hợpvớicả bài toán nhỏ và lớn Hiệuquả quảnlýdữ liệuphụ thuộcvào —Cấutrúcdữ liệu ₫ượcsử dụng —Giảithuật ₫ượcápdụng cho bổ sung, tìm kiếm, sắpxếp, xóa bỏ 7 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Các cấutrúcdữ liệu thông dụng Mảng (nghĩarộng): Tậphợpcácdữ liệucóthể truy nhậptùyý theochỉ số Danh sách (list): Tậphợpcácdữ liệu ₫ược móc nối ₫ôi mộtvớinhauvàcóthể truy nhậptuầntự Cây (tree): Tậphợpcácdữ liệu ₫ược móc nốivới nhau theo cấutrúccây, cóthể truy nhậptuầntự từ gốc —Nếumỗi nút có tối ₫a hai nhánh: cây nhị phân (binary tree) Bìa, bảng (map): Tậphợpcácdữ liệucósắpxếp, có thể truy nhậprất nhanh theo mã khóa (key) Hàng ₫ợi (queue): Tậphợpcácdữ liệucósắpxếp tuầntự, chỉ bổ sung vào từ một ₫ầuvàlấyratừ₫ầu còn lại 8 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Các cấutrúcdữ liệu thông dụng (tiếp) Tậphợp(set): Tậphợpcácdữ liệu ₫ượcsắpxếptùyý nhưng có thể truy nhậpmộtcáchhiệuquả Ngănxếp (stack): Tậphợpcácdữ liệu ₫ượcsắpxếp tuầntự, chỉ truy nhập ₫ượctừ một ₫ầu Bảng hash (hash table): Tậphợpcácdữ liệu ₫ượcsắp xếpdựatheomộtmãsố nguyên tạoratừ mộthàm ₫ặ cbiệt Bộ nhớ vòng (ring buffer): Tương tự như hàng ₫ợi, nhưng dung lượng có hạn, nếuhếtchỗ sẽ₫ượcghi quay vòng Trong toán họcvàtrong₫iềukhiển: vector, ma trận, ₫athức, phân thức, hàm truyền, 9 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu 4.2 Mảng và quảnlýbộ nhớ₫ộng Mảng cho phép biểudiễnvàquảnlýdữ liệumộtcách khá hiệuquả: — Đọcvàghidữ liệurất nhanh qua chỉ số hoặcqua ₫ịachỉ —Tiếtkiệmbộ nhớ Các vấn ₫ề củamảng tĩnh: VD: Student student_list[100]; —Số phầntử phảilàhằng số (biếttrước khi biên dịch, ngườisử dụng không thể nhậpsố phầntử, không thể cho số phầntừ là mộtbiến) => kém linh hoạt —Chiếmchỗ cứng trong ngănxếp(₫ốivớibiếncụcbộ) hoặc trong bộ nhớ dữ liệuchương trình (₫ốivớibiếntoàncục) => sử dụng bộ nhớ kém hi ệuquả, kém linh hoạt 10 © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về cấutrúcdữ liệu Mảng ₫ộng Mảng ₫ộng là mộtmảng ₫ượccấpphátbộ nhớ theo yêu cầu, trong khi chương trình chạy #include <stdlib.h> /* C */ int n = 50; float* p1= (float*) malloc(n*sizeof(float)); /* C */ double* p2= new double[n]; // C++ Sử dụng con trỏ₫ểquảnlýmảng ₫ộng: Cách sử dụng không khác so vớimảng tĩnh p1[0] = 1.0f; p2[0] = 2.0; Sau khi sử dụng xong => giải phóng bộ nhớ: free(p1); /* C */ delete [] p2; // C++ [...]... return c; } Chương 4: Khái quát về c u tr c dữ liệu 20 Ví dụ sử dụng #include "vector.h" void main() { int n = 10; Vector a,b ,c; a = createVector(10,1.0); b = createVector(10,2.0); c = addVector(a,b); // © 20 04, HOÀNG MINH SƠN destroyVector(a); destroyVector(b); destroyVector (c) ; } Chương 4: Khái quát về c u tr c dữ liệu 21 4. 4 Xây dựng c u tr c List Vấn ₫ề: Xây dựng một c u tr c ₫ể quản lý một c ch hiệu... Vector Tên file: vector.h C u tr c dữ liệu: struct Vector { double *data; int nelem; }; © 20 04, HOÀNG MINH SƠN Khai báo c c hàm c bản: Vector void double void Vector Vector double createVector(int n, double init); destroyVector(Vector); getElem(Vector, int i); putElem(Vector, int i, double d); addVector(Vector, Vector); subVector(Vector, Vector); scalarProd(Vector, Vector); Chương 4: Khái quát về c u... c c dữ liệu ₫ộng, ví dụ: — — — — Hộp thư ₫iện tử Danh sách những vi c cần làm C c ₫ối tượng ₫ồ họa trên hình vẽ C c khâu ₫ộng h c trong sơ ₫ồ mô phỏng hệ thống (tương tự trong SIMULINK) © 20 04, HOÀNG MINH SƠN C c yêu c u ₫ c thù: — Số lượng m c dữ liệu trong danh sách c thể thay ₫ổi thường xuyên — C c thao t c bổ sung ho c xóa dữ liệu c n ₫ư c th c hiện nhanh, ₫ơn giản — Sử dụng tiết kiệm bộ nhớ Chương... ps->code = 1000; delete ps; Một biến ₫ơn kh c với mảng một phần tử! Chương 4: Khái quát về c u tr c dữ liệu 13 Ý nghĩa c a sử dụng bộ nhớ ₫ộng Hiệu suất: — Bộ nhớ ₫ư c cấp phát ₫ủ dung lượng theo yêu c u và khi ₫ư c yêu c u trong khi chương trình ₫ã chạy — Bộ nhớ ₫ư c cấp phát nằm trong vùng nhớ tự do c n lại c a máy tính (heap), chỉ phụ thu c vào dung lượng bộ nhớ c a máy tính — Bộ nhớ c thể ₫ư c. .. danh sách Chương 4: Khái quát về c u tr c dữ liệu 0x00 Dữ liệu Y Xóa dữ liệu giữa danh sách 26 C c ₫ c ₫iểm chính Ưu ₫iểm: — Sử dụng rất linh hoạt, c p phát bộ nhớ khi c n và xóa khi không c n — Bổ sung và xóa bỏ một dữ liệu ₫ư c th c hiện thông qua chuyển con trỏ, thời gian th c hiện là hằng số, không phụ thu c vào chiều dài và vị trí — C thể truy nhập và duyệt c c phần tử theo kiểu tuần tự © 20 04, HOÀNG... 0; } Chương 4: Khái quát về c u tr c dữ liệu 19 © 20 04, HOÀNG MINH SƠN void putElem(Vector v, int i, double d) { if (i >=0 && i < v.nelem) v.data[i] = d; } Vector addVector(Vector a, Vector b) { Vector c = {0,0}; if (a.nelem == b.nelem) { c = createVector(a.nelem,0.0); for (int i=0; i < a.nelem; ++i) c. data[i] = a.data[i] + b.data[i]; } return c; } Vector subVector(Vector a, Vector b) { Vector c = {0,0};... mới => c n nhiều thời gian nếu số phần tử lớn Nếu muốn chèn một phần tử/xóa một phần tử ở ₫ầu ho c giữa mảng thì phải sao chép và dịch toàn bộ phần dữ liệu c n lại => rất mất thời gian Chương 4: Khái quát về c u tr c dữ liệu 23 Danh sách m c nối (linked list) pHead Dữ liệu A Item B Dữ liệu B Item C Dữ liệu C Item X © 20 04, HOÀNG MINH SƠN Item A Dữ liệu X Item Y 0x00 Chương 4: Khái quát về c u tr c dữ... tử c a mảng c n c p phát bộ nhớ (trong vùng heap), trả về con trỏ c kiểu, trả về 0 nếu không thành c ng — Toán tử delete[] yêu c u tham số là con trỏ c kiểu — Toán tử new và delete c n c thể áp dụng cho c p phát và giải phóng bộ nhớ cho một biến ₫ơn, một ₫ối tượng chứ không nhất thiết phải một mảng Chương 4: Khái quát về c u tr c dữ liệu 11 Một số ₫iều c n lưu ý © 20 04, HOÀNG MINH SƠN Con trỏ c ... holidays:"; cin >> n; Date* date_list; createDateList(n, date_list); for (int i=0; i < n; ++i) { } for ( ) { cout subject > c; removeAllMessages(myMailBox); } Chương 4: Khái quát về c u tr c dữ liệu 31 Bài tập về nhà Xây dựng kiểu danh sách m c nối chứa c c ngày lễ trong năm và ý nghĩa c a mỗi ngày (string), cho phép: Bổ sung một ngày lễ vào ₫ầu danh sách Tìm ý nghĩa c a một ngày (₫ưa ngày tháng là tham số) Xóa bỏ ₫i một ngày lễ ở ₫ầu danh sách . chương 4 4.1 C utrúcdữ liệulàgì? 4. 2 Mảng và quảnlýbộ nhớ₫ộng 4. 2 Xây dựng c u tr c Vector 4. 3 Xây dựng c utrúcList 3 © 20 04, HOÀNG MINH SƠN Chương 4: Khái quát về c utrúcdữ liệu 4. 1 Giớithiệuchung . MINH SƠN Chương 4: Khái quát về c utrúcdữ liệu C c cấutrúcdữ liệu thông dụng Mảng (nghĩarộng): Tậphợpcácdữ liệucóthể truy nhậptùyý theochỉ số Danh sách (list): Tậphợpcácdữ liệu ₫ư c m c nối. SƠN Chương 4: Khái quát về c utrúcdữ liệu C c cấutrúcdữ liệu thông dụng (tiếp) Tậphợp(set): Tậphợpcácdữ liệu ₫ượcsắpxếptùyý nhưng c thể truy nhậpmộtcáchhiệuquả Ngănxếp (stack): Tậphợpcácdữ liệu