1 / 129

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040). Giới thiệu. Môn học giới thiệu: Các cấu trúc dữ liệu cơ bản Các giải thuật điển hình trên các cấu trúc dữ liệu đó Dùng phương pháp hướng đối tượng. Ngôn ngữ lập trình minh hoạ: Mã giả (pseudocode) C++ (không được giảng dạy chính thức trong môn học).

lesley-dyer
Download Presentation

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

  2. Giới thiệu • Môn học giới thiệu: • Các cấu trúc dữ liệu cơ bản • Các giải thuật điển hình trên các cấu trúc dữ liệu đó • Dùng phương pháp hướng đối tượng. • Ngôn ngữ lập trình minh hoạ: • Mã giả (pseudocode) • C++ (không được giảng dạy chính thức trong môn học)

  3. Nội dung • Chương 1. Tổng quan • Chương 2. Stack • Chương 3. Queue • Chương 4. Đệ qui • Chương 5. List và String • Chương 6. Cây nhị phân • Chương 7. Tìm kiếm • Chương 8. Sắp xếp

  4. Programming Fundamentals Một số thuật ngữ căn bản • Một chương trình máy tính (computer program) là tập các câu lệnh để điều khiển một máy tính sinh ra một kết quả cụ thể • Viết các chương trình máy tính gọi là lập trình máy tính (computer programming) • Ngôn ngữ để tạo các chương trình máy tính gọi là ngôn ngữ lập trình • Software là một chương trình hay tập hợp các chương trình

  5. Programming Fundamentals Ngôn ngữ máy • Cấp thấp nhất. Các chương trình bao gồm 0, 1. • Lập trình bằng ngôn ngữ máy có thể điều khiển trực tiếp đến phần cứng máy tính • Ví dụ  00101010 000000000001 000000000010 10011001 000000000010 000000000011 Instruction part (opcode – tác vụ được thực hiện) address parts (địa chỉ bộ nhớ của dữ liệu

  6. Programming Fundamentals Assembly languages • Thực hiện cùng nhiệm vụ ngôn ngữ máy nhưng sử dụng tên tượng trưng cho opcode và các toán tử thay vì 1, 0 • LOAD BASEPAY ADD OVERPAY STORE GROSSPAY • Chương trình ngôn ngữ assembly phải được dịch sang ngôn ngữ máy trước khi có thể thực thi bởi máy tính

  7. Programming Fundamentals Assembler Translation program (assembler) Machine language program Assembly language program

  8. Programming Fundamentals Ngôn ngữ lập trình cấp cao • Sử dụng các câu lệnh dễ hiểu hơn. • Các chương trình sử dụng ngônn ngữ cấp cao phải được dịch sang ngôn ngữ cấp thấp bằng cách sử dụng một chương trình gọi là compiler

  9. Programming Fundamentals High-level Programming Languages (cont.) • Cho phép người lập trình viết các câu lệnh như câu tiếng Anh và các kí hiệu toán học thông dụng • Mỗi dòng trong chương trình ngôn ngữ mức cao gọi là câu lệnh • Example: Result = (First + Second)*Third

  10. Programming Fundamentals Phần mềm ứng dụng và phần mềm hệ thống • 2 loại chương trình máy tính • Application software bao gồm những chương trình được viết để thực thi các nhiệm vụ cụ thể được yêu cầu bởi user • System software là tập các chươg trình phải luôn được sẵn sàng đến bất kì hệ thống máy tính cho nó vận hành (hệ điều hành, bộ chuyển đổi ngôn ngữ)

  11. Programming Fundamentals PROGRAMMING LANGUAGES • Một số ngôn ngữ thông dụng FORTRAN 1957 COBOL 1960s BASIC 1960s PASCAL 1971 Structure programming C C++ Object-oriented programming Java • Cú pháp (syntax) Cú pháp của một ngôn ngữ lập trình là tập các luật để viết các câu lệnh chính xác

  12. Programming Fundamentals The C Programming Language • In the 1970s, at Bell Laboratories, Dennis Ritchie and Brian Kernighan designed the C programming language. • C was used exclusively on UNIX and on mini-computers. During the 1980s, C compilers were written for other flatforms, including PCs. • To provide a level of standardization for C language, in 1989, ANSI created a standard version of C, called ANSI C. • One main benefit of C : it is much closer to assembly language other than other high-level programming languages. • The programs written in C often run faster and more efficiently than programs written in other high-level programming language.

  13. Programming Fundamentals The C++ Programming Language • In 1985, at Bell Laboratories, Bjarne Stroutrup created C++ based on the C language. C++ is an extension of C that adds object-oriented programming capabilities. • C++ is now the most popular programming language for writing programs that run on Windows and Macintosh. • The standardized version of C++ is referred to as ANSI C++. • The ANSI standards also define run-time libraries, which contains useful functions, variables, constants, and other programming items that you can add to your programs. • The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library

  14. Programming Fundamentals Giải thuật • Dùng C++ để diễn tả?  có vấn đề • Có thể diễn tả giải thuật bằng cách sử dụng flowchart • Flow chart thể hiện nét phát thảo cấu trúc căn bản và tính logic của chương trình • Một cách khác để diễn tả giải thuật là sử dụng mã giả pseudocode • Giả lập, thường là dễ hiểu, không chi tiết đến các kỹ thuật lập trình • Ở cấp độ hết sức tổng quát: gần ngôn ngữ tự nhiên • Hoặc rất chi tiết: như dùng ngôn ngữ tựa Pascal, tựa C++

  15. Các tính chất quan trọng của giải thuật là: 􀂾 Hữu hạn (finiteness): giải thuật phải luôn luôn kết thúc sau một số hữu hạn bước. 􀂾 Xác định (definiteness): mỗi bước của giải thuật phải được xác định rõ ràng và phải được thực hiện chính xác, nhất quán. 􀂾 Hiệu quả (effectiveness): các thao tác trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn. Ngoài ra một giải thuật còn phải có đầu vào (input) và đầu ra (output). Giải thuật (Algorithm) 15

  16. Programming Fundamentals Flowchart symbols Terminal Input/output Process Flowlines  Decision Connector Predefined process

  17. Programming Fundamentals Example Note: Name, Hours and Pay are variables in the program.

  18. Programming Fundamentals Algorithms in pseudo-code • Sử dụng các cụm từ như tiếng Anh để mô tả pseudocode. • Example: Input the three values into the variables Name, Hours, Rate. Calculate Pay = Hours  Rate. Display Name and Pay.

  19. Programming Fundamentals Loops Note: 1.Loop is a very important concept in programming. 2.NUM  NUM + 1 means old value of NUM + 1 becomes new value of NUM. The algorithm can be described in pseudocode as follows: NUM  4 do SQNUM NUM2 Print NUM, SQNUM NUM  NUM + 1 while (NUM <= 9)

  20. Giải thuật bằng mã giả • Ví dụ: Mã giả của bubble sort

  21. Giải thuật bằng ngôn ngữ lập trình • Ví dụ: Lập trình cụ thể Bubble sort

  22. So sánh mã giả và NNLT • Nhận xét: • Mã giả 1: gần với cách trao đổi của con người nhất nhưng khó lập trình nhất • Mã giả 2: dễ lập trình hơn • Phương pháp: • Đầu tiên: cách giải quyết vấn đề bằng máy tính số (giải thuật bằng mã giả) • Sau đó: ngôn ngữ lập trình cụ thể • Học: • Nhớ giải thuật (mã giả) • Dùng NNLT cụ thể để minh chứng

  23. Giải bài toán bằng phần mềm • 1. Xác định bài toán • 2. Thiết kế phần mềm • 3. Thiết kế dữ liệu • 4. Thiết kế và phân tích giải thuật • 5. Lập trình và gỡ rối • 6. Kiểm tra phần mềm • 7. Bảo trì

  24. Lập trình hướng đối tượng (OOP) • Chương trình = tập các đối tượng tương tác nhau. • Đối tượng (object) = thuộc tính + tác vụ local data of object đối tượng (object) entry local data of operation

  25. Kiểu trừu tượng • Kiểu trừu tượng (abstract type): định nghĩa interface (tập các entry) • Entry • Tên method • Danh sách tham số hình thức • Đặc tả chức năng • Chưa có dữ liệu bên trong, chưa dùng được • Chỉ dùng để thiết kế ý niệm

  26. Hiện thực và sử dụng • Class: hiện thực của abstract type • Định nghĩa các dữ liệu • Định nghĩa các phương thức + hàm phụ trợ (nội bộ) • Định nghĩa các phương phức ‘constructor’ và ‘destructor’ nếu cần • Đối tượng = một instance của một class • Thông điệp (message): • dùng tương tác lẫn nhau = lời gọi phương thức của các đối tượng Student aStudent; aStudent.print();

  27. Cấu trúc dữ liệu • (1) Là một cách tổ chức và lưu trữ dữ liệu hợp lý để sử dụng một cách hiệu quả, • (2) Tập các thao tác để truy cập các thành phần dữ liệu. • Ví dụ: • Mảng (Array) • Danh sách liên kết (Linked List) • Ngăn xếp (Stack) • Hàng đợi (Queue) • Cây (Tree) • … • (1) the logical arrangement of data elements, combined with • (2) the set of operations we need to access the elements.

  28. Mối quan hệ của CTDL và thuật toán CTDL + Thuật toán = Chương trình • Cấu trúc dữ liệu cụ thể: chọn giải thuật • Giải thuật cụ thể: chọn cấu trúc dữ liệu • Khi có cấu trúc dữ liệu tốt và giải thuật phù hợp thì xây dựng chương trình chỉ phụ thuộc thời gian. • Một chương trình máy tính chỉ hoàn thiện khi có đầy đủ cấu trúc dữ liệu và giải thuật.

  29. Kiểu dữ liệu trừu tượng và cấu trúc dữ liệu • Abstract data type: ,ột định nghĩa mức cao các kiểu dữ liệu • Tập các dữ liệu • Tập các thao tác trên dữ liệu hoặc tập con dữ liệu • Không thể hiện cách hiện thực bên trong • Cấu trúc dữ liệu: Cụ thể hơn, một kỹ thuật hay chiến slược để hiện thực abstract data type • Ví dụ: abstract stack (push, pop, isEmpty, size) • Sử dụng array hay danh sách liên kết để hiện thực lớp stack (ArrayStack)

  30. Đặc điểm của OOP • Tính bao đóng: • Che dấu cấu trúc dữ liệu bên trong. • Che dấu cách thức hiện thực đối tượng. • Kế thừa: • Định nghĩa thêm các dữ liệu và phương thức cần thiết từ một class có sẵn. • Cho phép override/overload. • Cho phép dùng thay thế và khả năng dynamic biding. • Bao gộp: • Một đối tượng chứa nhiều đối tượng khác.

  31. Internal data Internal function method Internal function method method Cấu trúc của đối tượng

  32. Khai báo một class trên C++ class Student { private: int StudentID; string StudentName; public: Student(); Student(const Student &) ~Student() void operator=(const Student &) void print(); }; void main() { Student aStudent; sStudent.print(); } khai báo một lớp mới khai báo dữ liệu bên trong constructor copy constructor destructor overload assignment operator phương thức (hành vi) khai báo một đối tượng gọi phương thức

  33. Dùng ghi chú làm rõ nghĩa • 1. Ghi chú vào đầu mỗi hàm • (a) Người lập trình, ngày, bản sao • (b) Mục đích của hàm • (c) Input, output • (d) Các chỉ dẫn đến các tài liệu khác (nếu có) • Có thể dùng dạng: Precondition và Postcondition • 2. Ghi chú vào mỗi biến, hằng, kiểu • 3. Ghi chú vào mỗi phần của chương trình • 4. Ghi chú mỗi khi dùng các kỹ thuật đặc biệt

  34. Dùng ghi chú làm rõ nghĩa – Ví dụ void Life::update() /* Pre: grid đang chứa một trạng thái của thực thể sống Post: grid sẽ chứa trạng thái tiến hóa mới của thực thể sống này */ { int row, col; int new_grid[maxrow + 2][maxcol + 2]; //Chứa trạng thái mới vào đây for (row = 1; row <= maxrow; row++) for (col = 1; col <= maxcol; col++) switch (neighbor_count(row, col)) { case 2: //Trạng thái của tế bào không đổi new_grid[row][col] = grid[row][col]; break; case 3: //Tế bào sẽ sống new_grid[row][col] = 1; break; default: //Tế bào sẽ chết new_grid[row][col] = 0; } for (row = 1; row <= maxrow; row++) for (col = 1; col <= maxcol; col++) grid[row][col] = new_grid[row][col]; //Cập nhật các tế bào cùng lúc }

  35. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040) Chương 2: Stack

  36. Mô tả stack • Một stack là một cấu trúc dữ liệu mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh – top của stack). • Là một dạng vào sau ra trước – LIFO (Last In First Out)

  37. Ví dụ về stack • Stack rỗng: • Đẩy (push) Q vào: • Đẩy A vào: • Lấy (pop) ra một => được A: • Lấy ra một => được Q và stack rỗng: Q A Q A Q Q

  38. Ứng dụng: Đảo ngược danh sách • Yêu cầu: Đảo ngược một danh sách nhập vào • Giải thuật: 1. Lặp lại n lần 1.1. Nhập vào một giá trị 1.2. Đẩy nó vào stack 2. Lặp khi stack chưa rỗng 2.1. Lấy một giá trị từ stack 2.2. In ra

  39. Cần nhập 4 số vào Ban đầu Nhập 1 Nhập 5 Nhập 7 Nhập 3 7 5 5 1 1 1 Stack đã rỗng Ngừng Lấy ra => 3 Lấy ra => 7 Lấy ra => 5 Lấy ra => 1 7 5 5 1 1 1 Đảo ngược danh sách – Ví dụ 3 7 5 1 3 7 5 1

  40. Đảo ngược danh sách – Mã C++ sử dụng STL (Standard Template Library) #include <stack> usingnamespace std; int main( ) { int n; double item; stack<double> numbers; cout << "Bao nhieu so nhap vao? " cin >> n; for (int i = 0; i < n; i++) { cin >> item; numbers.push(item); } while (!numbers.empty( )) { cout << numbers.top( ) << " "; numbers.pop( ); } } khai báo một stack có kiểu dữ liệu của các phân tử bên trong là double đẩy một số vào trong stack kiểm tra xem stack có khác rỗng không lấy giá trị trên đỉnh của stack ra, stack không đổi lấy giá trị trên đỉnh của stack ra khỏi stack, đỉnh của stack bây giờ là giá trị kế tiếp

  41. Kiểu trừu tượng (abstract data type) • ĐN1: Một kiểu (type) • một tập hợp • mỗi thành phần của tập hợp này là các giá trị (value) • Ví dụ: int, float, char là các kiểu cơ bản • ĐN2: Một dãy của kiểu T • có chiều dài bằng 0 là rỗng • có chiều dài n (n>=1): bộ thứ tự (Sn-1, t) • Sn-1: dãy có chiều dài n-1 thuộc kiểu T • t là một giá trị thuộc kiểu T.

  42. Stack trừu tượng • Một stack kiểu T: • Một dãy hữu hạn kiểu T • Một số tác vụ: • 1. Khởi tạo stack rỗng (create) • 2. Kiểm tra rỗng (empty) • 3. Đẩy một giá trị vào trên đỉnh của stack (push) • 4. Bỏ giá trị đang có trên đỉnh của stack (pop) • 5. Lấy giá trị trên đỉnh của stack, stack không đổi (top)

  43. Thiết kế stack enum Error_code {fail, success, overflow, underflow}; template <class Entry> class Stack { public: Stack(); //constructor bool empty() const; //kiểm tra rỗng Error_code push(const Entry &item); //đẩy item vào Error_code pop(); //bỏ phần tử trên đỉnh Error_code top(Entry &item); //lấy giá trị trên đỉnh //khai báo một số phương thức cần thiết khác private: //khai báo dữ liệu và hàm phụ trợ chỗ này };

  44. Thiết kế các phương thức template <class Entry> bool Stack<Entry>::empty() const; Pre: Không có Post: Trả về giá trị true nếu stack hiện tại là rỗng, ngược lại thì trả về false template <class Entry> Error_code Stack<Entry>::push(const Entry &item); Pre: Không có Post: Nếu stack hiện tại không đầy, item sẽ được thêm vào đỉnh của stack. Ngược lại trả về giá trị overflow của kiểu Error_code và stack không đổi. template <class Entry> Error_code Stack<Entry>::pop() const; Pre: Không có Post: Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ bị hủy bỏ. Ngược lại trả về giá trị underflow của kiểu Error_code và stack không đổi. template <class Entry> Error_code Stack<Entry>::top(Entry &item) const; Pre: Không có Post: Nếu stack hiện tại không rỗng, đỉnh của stack hiện tại sẽ được chép vào tham biến item. Ngược lại trả về giá trị fail của kiểu Error_code.

  45. Hiện thực stack liên tục

  46. Khai báo stack liên tục constint maxstack = 10; //small number for testing template <class Entry> class Stack { public: Stack( ); bool empty( ) const; Error_code pop( ); Error_code top(Entry &item) const; Error_code push(const Entry &item); private: int count; Entry entry[maxstack]; };

  47. top 5 1 Đẩy một phần tử vào stack • Giải thuật: 1. Nếu còn chỗ trống trong stack 1.1. Tăng vị trí đỉnh lên 1 1.2. Chứa giá trị vào vị trí đỉnh của stack 1.3. Tăng số phần tử lên 1 7 count=3 count=2

  48. top 7 5 1 Bỏ phần tử trên đỉnh stack • Giải thuật: 1. Nếu còn phần tử trong stack 1.1. Giảm vị trí đỉnh đi 1 1.2. Giảm số phần tử đi 1 count=2 count=3

  49. Thêm/Bỏ phần tử - Mã C++ template <class Entry> Error_code Stack<Entry>:: push(const Entry &item) { if (count >= maxstack) return overflow; else entry[count++] = item; return success; } template <class Entry> Error_code Stack<Entry>:: pop() { if (count == 0) return underflow; else count--; return success; }

  50. Lấy giá trị trên đỉnh stack • Giải thuật: 1. Nếu còn phần tử trong stack 1.1. Trả về giá trị tại vị trí đỉnh • Mã C++: template <class Entry> Error_code Stack<Entry>:: top(Entry &item) { if (count == 0) return underflow; else item = entry[count - 1]; return success; }

More Related