Tài liệu Kỹ thuật lập trình - Chương 4: Khái quát về cấu trúc dữ liệu doc

32 917 1
Tài liệu Kỹ thuật lập trình - Chương 4: Khái quát về cấu trúc dữ liệu doc

Đ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

© 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+ B*u; 1010011000110010010010 y = A*x 1100101100100010000010+ d*u; 1100101100100010000010 x = C*x LQGController 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 start() 1010011000110010010010 stop() 1010011000110010010010 1100101100100010000010 1100101100100010000010 9/8/2006 Nội dung chương Cấu trúc liệu gì? Mảng quản lý nhớ ₫ộng 4.2 4.3 © 2004, HOÀNG MINH SƠN 4.1 4.2 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ê qn, 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 q 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, HOÀ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 tốn nhỏ lớn © 2004, HOÀ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 qt 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 © 2004, HỒNG MINH SƠN — Nếu nút có tối ₫a hai nhánh: nhị phân (binary tree) 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) © 2004, HỒNG MINH SƠN 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 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 tố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, HỒ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, HỒ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 qt cấu trúc liệu 19 © 2004, HỒ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, HỒ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, HOÀ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 © 2004, HOÀNG MINH SƠN Sử dụng kiểu mảng? 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 tồ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 toàn phần liệu 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) pHead Dữ liệu A Item B Dữ liệu B Item C Dữ liệu C Item X © 2004, HOÀNG MINH SƠN Item A 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 pHead Dữ liệu A Dữ liệu A Dữ liệu B Dữ liệu B Dữ liệu T Dữ liệu C © 2004, HOÀNG MINH SƠN pHead Dữ liệu T 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 pHead pHead Dữ liệu B Dữ liệu C Dữ liệu C Dữ liệu X 0x00 Dữ liệu A Dữ liệu B © 2004, HỒNG MINH SƠN Dữ liệu A 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, HOÀ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 ... A Dữ liệu B Dữ liệu B Dữ liệu T Dữ liệu C © 2004, HOÀNG MINH SƠN pHead Dữ liệu T 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ữ. .. pHead Dữ liệu A Item B Dữ liệu B Item C Dữ liệu C Item X © 2004, HOÀNG MINH SƠN Item A 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 pHead Dữ liệu A Dữ liệu. .. 0x00 Dữ liệu Y Bổ sung vào danh sách 25 Xóa bớt liệu pHead pHead Dữ liệu B Dữ liệu C Dữ liệu C Dữ liệu X 0x00 Dữ liệu A Dữ liệu B © 2004, HỒNG MINH SƠN Dữ liệu A Dữ liệu X Dữ liệu Y Xóa liệu ₫ầu

Ngày đăng: 19/01/2014, 13:20

Từ khóa liên quan

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

Tài liệu liên quan