Chương 1Kỹ thuật lập trìnhChương 4: Khái quát về cấu trúc dữ

32 9 0
Chương 1Kỹ thuật lập trìnhChương 4: Khái quát về cấu trúc dữ

Đ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

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

Ngày đăng: 11/05/2021, 02:30

Mục lục

  • Kỹ thuật lập trình

  • Nội dung chương 4

  • 4.1 Giới thiệu chung

  • Vấn đề: Biểu diễn tập hợp dữ liệu

  • Vấn đề: Quản lý (tập hợp) dữ liệu

  • Quản lý DL thế nào là hiệu quả?

  • Các cấu trúc dữ liệu thông dụng

  • Các cấu trúc dữ liệu thông dụng (tiếp)

  • 4.2 Mảng và quản lý bộ nhớ động

  • Mảng động

  • Cấp phát và giải phóng bộ nhớ động

  • Một số điều cần lưu ý

  • Cấp phát bộ nhớ động cho biến đơn

  • Ý nghĩa của sử dụng bộ nhớ động

  • Ví dụ sử dụng bộ nhớ động trong hàm

  • Tham số đầu ra là con trỏ?

  • 4.3 Xây dựng cấu trúc Vector

  • Định nghĩa cấu trúc Vector

  • Định nghĩa các hàm cơ bản

  • Ví dụ sử dụng

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan