Chương 1 Kỹ thuật lập trình Chương 4: Khái quát về cấu trúc dữ liệu 0101010101010101100001 0101010101010101100001 StateController 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 start() 1100101100100010000010 1100101100100010000010 stop() 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 1010011000110010010010+ B*u; 1010011000110010010010 y = A*x 1100101100100010000010+ d*u; 1100101100100010000010 x = C*x LQGController 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 start() 1010011000110010010010 stop() 1010011000110010010010 1100101100100010000010 1100101100100010000010 © 2004, HOÀNG MINH SƠN 9/8/2006 Nội dung chương 4 4.1 4.2 4.2 4.3 Cấu trúc dữ liệu là gì? Mảng và quản lý bộ nhớ ₫ộng Xây dựng cấu trúc Vector Xây dựng cấu trúc List © 2004, HOÀNG MINH SƠN Chương 4: Khái quát về...
© 2004, HOÀNG MINH SƠN Chương Kỹ thuật lập trình Chương 4: Khái quát cấu trúc liệu 0101010101010101100001 0101010101010101100001 StateController 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 start() 1100101100100010000010 1100101100100010000010 stop() 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 y = A*x + B*u; 1100101100100010000010 1100101100100010000010 x = C*x + d*u; LQGController 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 start() 1010011000110010010010 stop() 1010011000110010010010 1100101100100010000010 1100101100100010000010 9/8/2006 © 2004, HỒNG MINH SƠN Nội dung chương 4.1 4.2 Cấu trúc liệu gì? Mảng quản lý nhớ ₫ộng 4.2 4.3 Xây dựng cấu trúc Vector Xây dựng cấu trúc List Chương 4: Khái quát cấu trúc liệu 4.1 Giới thiệu chung Phần lớn toán thực tế liên quan tới liệu phức hợp, kiểu liệu ngơn ngữ lập trình khơng ₫ủ biểu diễn Ví dụ: © 2004, HỒNG MINH SƠN — — — — Dữ liệu sinh viên: Họ tên, ngày sinh, quê quán, mã số SV, Mô hình hàm truyền: Đa thức tử số, ₫a thức mẫu số Mơ hình trạng thái: Các ma trận A, B, C, D Dữ liệu trình: Tên ₫ại lượng, dải ₫o, giá trị, ₫ơn vị, thời gian, cấp sai số, ngưỡng giá trị, — Đối tượng ₫ồ họa: Kích thước, màu sắc, ₫ường nét, phông chữ, Phương pháp biểu diễn liệu: ₫ịnh nghĩa kiểu liệu sử dụng cấu trúc (struct, class, union, ) Chương 4: Khái quát cấu trúc liệu Vấn ₫ề: Biểu diễn tập hợp liệu © 2004, HỒNG MINH SƠN Đa số liệu thuộc ứng dụng có liên quan với => cần biểu diễn tập hợp có cấu trúc, ví dụ: — Danh sách sinh viên: Các liệu sinh viên ₫ược xếp theo 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ần tương tác — Dữ liệu trình: Một tập liệu mang giá trị ₫ại lượng vào thời ₫iểm gián ₫oạn, liệu ₫ầu vào liên quan tới liệu ₫ầu — Đối tượng ₫ồ họa: Một cửa sổ bao gồm nhiều ₫ối tượng ₫ồ họa, vẽ bao gồm nhiều ₫ối tượng ₫ồ họa Thông thường, liệu tập hợp có kiểu, tương thích kiểu với Kiểu mảng phù hợp! Chương 4: Khái quát cấu trúc liệu Vấn ₫ề: Quản lý (tập hợp) liệu © 2004, HỒNG MINH SƠN Sử dụng kết hợp cách khéo léo kiểu cấu trúc kiểu mảng ₫ủ ₫ể biểu diễn tập hợp liệu Các giải thuật (hàm) thao tác với liệu, nhằm quản lý liệu cách hiệu quả: — Bổ sung mục liệu vào danh sách, bảng, tập hợp, — Xóa mục liệu danh sách, bảng, tập hợp, — Tìm mục liệu danh sách, bảng tập hợp, theo tiêu chuẩn cụ thể — Sắp xếp danh sách theo tiêu chuẩn ₫ó — Chương 4: Khái quát cấu trúc liệu Quản lý DL hiệu quả? Tiết kiệm nhớ: Phần "overhead" không ₫áng kể so với phần liệu thực Truy nhập nhanh, thuận tiện: Thời gian cần cho bổ sung, tìm kiếm xóa bỏ mục liệu phải ngắn Linh hoạt: Số lượng mục liệu khơng (hoặc ít) bị hạn chế cố ₫ịnh, không cần biết trước tạo cấu trúc, phù hợp với toán nhỏ lớn © 2004, HỒNG MINH SƠN Hiệu quản lý liệu phụ thuộc vào — Cấu trúc liệu ₫ược sử dụng — Giải thuật ₫ược áp dụng cho bổ sung, tìm kiếm, xếp, xóa bỏ Chương 4: Khái quát cấu trúc liệu Các cấu trúc liệu thông dụng Mảng (nghĩa rộng): Tập hợp liệu truy nhập tùy ý theo số Danh sách (list): Tập hợp liệu ₫ược móc nối ₫ơi với truy nhập Cây (tree): Tập hợp liệu ₫ược móc nối với theo cấu trúc cây, truy nhập từ gốc — Nếu nút có tối ₫a hai nhánh: nhị phân (binary tree) © 2004, HỒNG MINH SƠN Bìa, bảng (map): Tập hợp liệu có xếp, truy nhập nhanh theo mã khóa (key) Hàng ₫ợi (queue): Tập hợp liệu có xếp tuần tự, bổ sung vào từ ₫ầu lấy từ ₫ầu lại Chương 4: Khái quát cấu trúc liệu Các cấu trúc liệu thông dụng (tiếp) Tập hợp (set): Tập hợp liệu ₫ược xếp tùy ý truy nhập cách hiệu Ngăn xếp (stack): Tập hợp liệu ₫ược xếp tuần tự, truy nhập ₫ược từ ₫ầu © 2004, HỒNG MINH SƠN Bảng hash (hash table): Tập hợp liệu ₫ược xếp dựa theo mã số nguyên tạo từ hàm ₫ặc biệt Bộ nhớ vòng (ring buffer): Tương tự hàng ₫ợi, dung lượng có hạn, hết chỗ ₫ược ghi quay vòng Trong toán học ₫iều khiển: vector, ma trận, ₫a thức, phân thức, hàm truyền, Chương 4: Khái quát cấu trúc liệu 4.2 Mảng quản lý nhớ ₫ộng Mảng cho phép biểu diễn quản lý liệu cách hiệu quả: — Đọc ghi liệu nhanh qua số qua ₫ịa — Tiết kiệm nhớ Các vấn ₫ề mảng tĩnh: © 2004, HOÀNG MINH SƠN VD: Student student_list[100]; — Số phần tử phải số (biết trước biên dịch, người sử dụng nhập số phần tử, cho số phần từ biến) => linh hoạt — Chiếm chỗ cứng ngăn xếp (₫ối với biến cục bộ) nhớ liệu chương trình (₫ối với biến tồn cục) => sử dụng nhớ hiệu quả, linh hoạt Chương 4: Khái quát cấu trúc liệu Mảng ₫ộng Mảng ₫ộng mảng ₫ược cấp phát nhớ theo yêu cầu, chương trình chạy #include /* C */ int n = 50; float* p1= (float*) malloc(n*sizeof(float)); /* C */ double* p2= new double[n]; // C++ © 2004, HỒNG MINH SƠN Sử dụng trỏ ₫ể quản lý mảng ₫ộng: Cách sử dụng không khác so với mảng tĩnh p1[0] = 1.0f; p2[0] = 2.0; Sau sử dụng xong => giải phóng nhớ: free(p1); /* C */ delete [] p2; // C++ Chương 4: Khái quát cấu trúc liệu 10 Định nghĩa cấu trúc Vector Tên file: vector.h Cấu trúc liệu: struct Vector { double *data; int nelem; }; © 2004, HỒNG MINH SƠN Khai báo hàm 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 cấu trúc liệu 18 Định nghĩa hàm © 2004, HOÀNG MINH SƠN Tên file: vector.cpp #include #include "vector.h" Vector createVector(int n, double init) { Vector v; v.nelem = n; v.data = (double*) malloc(n*sizeof(double)); while (n ) v.data[n] = init; return v; } void destroyVector(Vector v) { free(v.data); } double getElem(Vector v, int i) { if (i < v.nelem && i >= 0) return v.data[i]; return 0; } Chương 4: Khái quát cấu trúc liệu 19 © 2004, 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}; return c; } Chương 4: Khái quát cấu trúc 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); // © 2004, HOÀNG MINH SƠN destroyVector(a); destroyVector(b); destroyVector(c); } Chương 4: Khái quát cấu trúc liệu 21 4.4 Xây dựng cấu trúc List Vấn ₫ề: Xây dựng cấu trúc ₫ể quản lý cách hiệu linh hoạt liệu ₫ộng, ví dụ: — — — — Hộp thư ₫iện tử Danh sách việc cần làm Các ₫ối tượng ₫ồ họa hình vẽ Các khâu ₫ộng học sơ ₫ồ mô hệ thống (tương tự SIMULINK) © 2004, HỒNG MINH SƠN Các yêu cầu ₫ặc thù: — Số lượng mục liệu danh sách thay ₫ổi thường xuyên — Các thao tác bổ sung xóa liệu cần ₫ược thực nhanh, ₫ơn giản — Sử dụng tiết kiệm nhớ Chương 4: Khái quát cấu trúc liệu 22 Sử dụng kiểu mảng? © 2004, HOÀNG MINH SƠN Số phần tử mảng thực chất không thay ₫ổi ₫ược Dung lượng nhớ vào thời ₫iểm cấp phát phải biết trước, không thực co giãn ₫ược Nếu không thực sử dụng hết dung lượng ₫ã cấp phát => lãng phí nhớ Nếu ₫ã sử dụng hết dung lượng muốn bổ sung phần tử phải cấp phát lại chép toàn liệu sang mảng => cần nhiều thời gian số phần tử lớn Nếu muốn chèn phần tử/xóa phần tử ₫ầu mảng phải chép dịch tồn phần liệu cịn lại => thời gian Chương 4: Khái quát cấu trúc liệu 23 Danh sách móc nối (linked list) © 2004, HỒNG MINH SƠN pHead Item A Dữ liệu A Item B Dữ liệu B Item C Dữ liệu C Item X Dữ liệu X Item Y 0x00 Chương 4: Khái quát cấu trúc liệu Dữ liệu Y 24 Bổ sung liệu pHead © 2004, HOÀNG MINH SƠN pHead pHead Dữ liệu T Dữ liệu A Dữ liệu A Dữ liệu B Dữ liệu B Dữ liệu T Dữ liệu C Dữ liệu C Dữ liệu X Dữ liệu X 0x00 Dữ liệu Y Bổ sung vào ₫ầu danh sách Chương 4: Khái quát cấu trúc liệu 0x00 Dữ liệu Y Bổ sung vào danh sách 25 Xóa bớt liệu © 2004, HOÀNG MINH SƠN pHead 0x00 pHead Dữ liệu A Dữ liệu A Dữ liệu B Dữ liệu B Dữ liệu C Dữ liệu C Dữ liệu X Dữ liệu X Dữ liệu Y Xóa liệu ₫ầu danh sách Chương 4: Khái quát cấu trúc liệu 0x00 Dữ liệu Y Xóa liệu danh sách 26 Các ₫ặc ₫iểm Ưu ₫iểm: — Sử dụng linh hoạt, cấp phát nhớ cần xóa khơng cần — Bổ sung xóa bỏ liệu ₫ược thực thông qua chuyển trỏ, thời gian thực số, không phụ thuộc vào chiều dài vị trí — Có thể truy nhập duyệt phần tử theo kiểu © 2004, HỒNG MINH SƠN Nhược ₫iểm: — Mỗi liệu bổ sung ₫ều phải ₫ược cấp phát nhớ ₫ộng — Mỗi liệu xóa bỏ ₫i ₫ều phải ₫ược giải phóng nhớ tương ứng — Nếu kiểu liệu khơng lớn phần overhead chiếm tỉ lệ lớn — Tìm kiếm liệu theo kiểu tuyến tính, thời gian Chương 4: Khái quát cấu trúc liệu 27 Ví dụ: Danh sách thông báo (hộp thư) #include using namespace std; © 2004, HOÀNG MINH SƠN struct MessageItem { string subject; string content; MessageItem* pNext; }; struct MessageList { MessageItem* pHead; }; void initMessageList(MessageList& l); void addMessage(MessageList&, const string& sj, const string& ct); bool removeMessageBySubject(MessageList& l, const string& sj); void removeAllMessages(MessageList&); Chương 4: Khái quát cấu trúc liệu 28 © 2004, HOÀNG MINH SƠN #include "List.h" void initMessageList(MessageList& l) { l.pHead = 0; } void addMessage(MessageList& l, const string& sj, const string& ct) { MessageItem* pItem = new MessageItem; pItem->content = ct; pItem->subject = sj; pItem->pNext = l.pHead; l.pHead = pItem; } void removeAllMessages(MessageList& l) { MessageItem *pItem = l.pHead; while (pItem != 0) { MessageItem* pItemNext = pItem->pNext; delete pItem; pItem = pItemNext; } l.pHead = 0; } Chương 4: Khái quát cấu trúc liệu 29 © 2004, HOÀNG MINH SƠN bool removeMessageBySubject(MessageList& l, const string& sj) { MessageItem* pItem = l.pHead; MessageItem* pItemBefore; while (pItem != && pItem->subject != sj) { pItemBefore = pItem; pItem = pItem->pNext; } if (pItem != 0) { if (pItem == l.pHead) l.pHead = 0; else pItemBefore->pNext = pItem->pNext; delete pItem; } return pItem != 0; } Chương 4: Khái quát cấu trúc liệu 30 Chương trình minh họa © 2004, HỒNG MINH SƠN #include #include "list.h" using namespace std; void main() { MessageList myMailBox; initMessageList(myMailBox); addMessage(myMailBox,"Hi","Welcome, my friend!"); addMessage(myMailBox,"Test","Test my mailbox"); addMessage(myMailBox,"Lecture Notes","Programming Techniques"); removeMessageBySubject(myMailBox,"Test"); MessageItem* pItem = myMailBox.pHead; while (pItem != 0) { cout subject > c; removeAllMessages(myMailBox); } Chương 4: Khái quát cấu trúc liệu 31 Bài tập nhà Xây dựng kiểu danh sách móc nối chứa ngày lễ năm ý nghĩa ngày (string), cho phép: — — — — Bổ sung ngày lễ vào ₫ầu danh sách Tìm ý nghĩa ngày (₫ưa ngày tháng tham số) Xóa bỏ ₫i ngày lễ ₫ầu danh sách Xóa bỏ ₫i ngày lễ danh sách (₫ưa ngày tháng tham số) — Xóa bỏ ₫i tồn danh sách © 2004, HỒNG MINH SƠN Viết chương trình minh họa cách sử dụng Chương 4: Khái quát cấu trúc liệu 32 ... 4: Khái quát cấu trúc liệu Dữ liệu Y 24 Bổ sung liệu pHead © 2004, HOÀNG MINH SƠN pHead pHead Dữ liệu T Dữ liệu A Dữ liệu A Dữ liệu B Dữ liệu B Dữ liệu T Dữ liệu C Dữ liệu C Dữ liệu X Dữ liệu... gian Chương 4: Khái quát cấu trúc liệu 23 Danh sách móc nối (linked list) © 2004, HỒNG MINH SƠN pHead Item A Dữ liệu A Item B Dữ liệu B Item C Dữ liệu C Item X Dữ liệu X Item Y 0x00 Chương 4: Khái. .. 2004, HOÀNG MINH SƠN Nội dung chương 4.1 4.2 Cấu trúc liệu gì? Mảng quản lý nhớ ₫ộng 4.2 4.3 Xây dựng cấu trúc Vector Xây dựng cấu trúc List Chương 4: Khái quát cấu trúc liệu 4.1 Giới thiệu chung