Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 80 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
80
Dung lượng
823,5 KB
Nội dung
Giáo trình cấu trúc liệu & giải thuật Chương Trường CĐCN Huế THUẬT TOÁN VÀ CẤU TRÚC DỮ LIỆU 1.1 Thuật cấu trúc liệu 1.1.1 Thuật toán (algorithm) 1.1.1.1 Định nghĩa thuật toán Thuật toán dãy hữu hạn bước, bước mô tả xác phép toán hành động cần thực để giải vấn đề đặt 1.1.1.2 Đặc trưng thuật toán Thuật toán có đặc trưng sau: i Dữ liệu đầu vào (input data): Mỗi thuật toán cần có số (có thể 0) liệu vào (input) Đó giá trị cần đưa vào thuật toán bắt đầu làm việc Các liệu cần lấy từ tập hợp giá trị cụ thể ii Dữ liệu đầu (output data): Mỗi thuật toán có nhiều liệu (output) Đó giá trị có quan hệ hoàn toàn xác định với liệu đầu vào kết việc thực thuật toán iii Tính xác định (defineteness): Mỗi bước thuật toán cần phải xác định rõ ràng phải thực cách xác quán Để đảm bảo tính xác định, thuật toán cần phải mô tả thông qua ngôn ngữ lập trình Trong ngôn ngữ này, mệnh đề tạo thành theo qui tắc, cú pháp nghiêm ngặt có ý nghĩa iv Tính hữu hạn (finiteness): thuật toán phải kết thúc sau số hữu hạn bước v Tính hiệu (effectiveness): bước thuật toán phải thực lượng thời gian hữu hạn 1.1.2 Cấu trúc liệu (data structure) 1.1.2.1 Khái niệm Dữ liệu mà bạn làm việc chương trình thường liệu có cấu trúc gọi cấu trúc liệu Việc chọn loại liệu giúp ta giải toán đơn giản hiệu quả, ngược lại toán trở nên nặng nề hiệu 1.1.2.2 Các loại cấu trúc liệu Cấu trúc liệu gồm loại: mảng, ghi, tập hợp, trỏ, ngăn xếp, hàng đợi, cây, đồ thị, file, … Những loại liệu có cấu trúc thường có sẵn ngôn ngữ lập trình Khi làm việc cấu trúc liệu, ta phải ý đến: từ khóa khai báo loại cấu trúc liệu, phép toán, hàm phục vụ cho cấu trúc liệu 1.1.3 Ngôn ngữ diễn đạt thuật toán Có nhiều phương pháp biểu diễn thuật toán Có thể biểu diễn thuật toán danh sách bước, bước diễn đạt ngôn ngữ tự nhiên ký hiệu toán học Có thể biểu diễn sơ đồ khối Tuy nhiên, trình bày, để đảm bảo tính định thuật toán nên thuật toán cần viết ngôn ngữ lập trình Trang Giáo trình cấu trúc liệu & giải thuật Trường CĐCN Huế 1.1.3.1 Sử dụng ngôn ngữ tự nhiên Ví dụ (Thuật toán pha mì tôm): Hãy chế biến tô mì tôm với nguyên liệu: gói mì tôm, 1/4 lít nước, trứng; dụng cụ chế biến: bếp gas, ấm đun, tô, đĩa Bước 1: Đỗ mì vào tô Bước 2: Đập trứng, sau cho vào tô (trừ vỏ) Bước 3: Đổ nước vào ấm Bước 4: Bật bếp gas Bước 5: Đặt ấm vào bếp gas Bước 6: Chờ đến nước sôi Bước 7: Đổ ấm vào tô mì Bước 8: Lấy đĩa đậy tô mì lại, sau chờ phút ăn 1.1.3.2 Sử dụng sơ đồ khối Sau số hình khối thường sử dụng Hình khối chức Khối bắt đầu Khối kết thúc Khối tính toán Khối nhập/xuất liệu Nhập n false Khối so sánh true Ví dụ: Giải thuật toán tính S = + + … + n (với n nhập từ bàn phím) sơ đồ khối Begin Nhập n S:= 0; i:=1 i0) { x1 = (-b – sqrt(Delta))/(2*a) x2 = (-b + sqrt(Delta))/(2*a) xuất kết quả: Phương trình có hai nghiệm x1 x2 } else if (Delta == 0) Xuất kết quả: Phương trình có nghiệm kép –b/(2*a) else {trường hợp Delta Giải thuật đệ quy viết dạng hàm đây: long Factorial(int n) { if(n==0)Factorial:=1; else Factorial = n*Factorial(n-1); } Trong hàm lời gọi đến nằm câu lệnh gán sau else Mỗi lần gọi đệ quy đến Factorial, giá trị n giảm Ví du, Factorial(4) gọi đến Factorial(3), gọi đến Factorial(2), gọi đến Factorial(1), gọi đến Factorial(0) trường hợp suy biến, tính theo cách đặc biệt Factorial(0) = ii Bài toán dãy số FIBONACCI Dãy số Fibonacci bắt nguồn từ toán cổ việc sinh sản cặp thỏ Bài toán đặt sau: - Các thỏ không chết - Hai tháng sau đời cặp thỏ sinh cặp thỏ - Khi sinh tháng chúng lại sinh cặp Giả sử cặp thỏ đời đến tháng thứ n có cặp? Ví dụ với n = 6, ta thấy Tháng thứ 1: cặp (cặp ban đầu) Tháng thứ 2: cặp (cặp ban đầu vẵn chưa đẻ) Tháng thứ 3: cặp (đã có thêm cặp con) Tháng thứ 4: cặp (cặp đầu đẻ thêm) Tháng thứ 5: cặp (cặp bắt đầu đẻ) Tháng thứ 6: cặp (cặp đẻ tiếp) Đặt F(n) số cặp thỏ tháng thứ n Ta thấy cặp thỏ có tháng thứ n-2 sinh tháng thứ n số cặp thỏ tháng thứ n là: Trang Giáo trình cấu trúc liệu & giải thuật Trường CĐCN Huế F(n) = f(n-2) + F(n-1) F(n) tính sau: nÕu n ≤ 1 F (n) = F(n - 2) + F(n - 1) nÕu n > Dãy số thể F(n) ứng với giá trị n = 1, 2, 3, , có dạng 1 13 21 34 55 gọi dãy số Fibonacci Nó mô hình nhiều tượng tự nhiên sử dụng nhiều tin học Sau thủ tục đệ quy thể giải thuật tính F(n) long F(int n) { if(n2) coi n-1 đĩa trên, đóng vai trò đĩa thứ xử lý giống trường hợp đĩa được, nghĩa là: - Chuyển n-1 đĩa từ A sang B - Chuyển đĩa thứ n từ A sang C - Chuyển n-1 đĩa từ B sang C Lược đồ thể bước sau: A B C A B C A B C A B C Bước Bước Bước Như vậy, toán “Tháp Hà Nội” tổng quát với n đĩa dẫn đến toán tương tự với kích thước nhỏ hơn, chẳng hạn từ chỗ chuyển n đĩa từ cọc A sang cọc C chuyển n-1 đĩa từ cọc A sang cọc B mức giải thuật lại là: Trang Giáo trình cấu trúc liệu & giải thuật Trường CĐCN Huế - Chuyển n-2 đĩa từ cọc A sang cọc C - Chuyển đĩa từ cọc A sang cọc B - Chuyển n-2 đĩa từ cọc B sang cọc C trường hợp suy biến xảy ra, trường hợp ứng với toán chuyển đĩa Vậy đặc điểm đệ quy giải thuật xác định ta viết giải thuật đệ quy toán “Tháp Hà Nôị” sau: void Chuyen(n, A, B, C) { if( n==1) chuyển đĩa từ A sang C else { call Chuyen(n-1, A, C, B); call Chuyen(1, A, B, C); call Chuyen(n-1, B, A, C) ; } } 1.2.4 Hiệu lực đệ quy Qua ví dụ ta thấy: đệ quy công cụ để giải toán Có toán, bên cạnh giải thuật đệ quy có giải thuật lặp đơn giản hữu hiệu Chẳng hạn giải thuật lặp tính n! viết: long Factorial(int n) { if (n==0 || n==1) gt=1; else { gt=1; for(int i=2; i[...]... vòng, DSLK kép Trang 33 Giáo trình cấu trúc dữ liệu & giải thuật Chương 3 Trường CĐCN Huế NGĂN XẾP VÀ HÀNG ĐỢI (Stacks anh Queues) Trong chương này ta nghiên cứu hai kiểu dữ liệu thường được thấy trong lĩnh vực khoa học máy tính, đó là stack và queue Các kiểu dữ liệu này là những trường hợp đặc biệt so với các kiểu dữ liệu thông thường mà ta đã học 3.1 Kiểu cấu trúc dữ liệu trừu tượng stack (the stack... lệnh này là O(n 2) và đây cũng là thời gian thực hiện của giải thuật Ví dụ 2: Phân tích thuật toán Euclid (thuật toán tìm ước số chung lớn nhất của hai số nguyên) int Euclid(int m, int n) { int r = m%n; while( r !=0 ) { m = n; n = r; r = m%n; } return n; } (1) (2) (3) (4) (5) (6) Trang 12 Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế Thời gian thực hiện thuật toán phụ thuộc vào số nhỏ nhất... biệt First, và trường liên kết của nút này trỏ đến chính nó Giải thuật: void Initialize() { First = new Tro; First->link = First;} Trang 24 Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế 2.3.3.2 Chèn một phần tử vào danh sách liên kết vòng Giải thuật: void Insert(int x) { Tro *q=First; while(q->link!=First)q=q->link; Tro *p=new Tro;p->nd=x;p->link=First;q->link=p; } Trong giải thuật này,... trước nó) và next (chỉ đến phần tử sau nó) pre Info next Trang 27 Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế Để biểu diễn danh sách liên kết kép, ta sử dụng kiểu dữ liệu con trỏ Ngoài các phần tử trong danh sách liên kết kép, ta còn sử dụng 2 biến chỉ điểm, biến chỉ điểm đầu First trỏ vào phần tử đầu tiên (hoặc chứa địa chỉ phần tử đầu tiên), biến chỉ điểm cuối Last trỏ vào phần tử... tử ở vị trí thứ i của danh sách 2.1.2 Các phép toán trên danh sách Khi mô tả một mô hình dữ liệu, chúng ta cần xác định các phép toán có thể thực hiện trên mô hình toán học được dùng làm cở sở cho mô hình dữ liệu Có rất nhiều phép toán trên danh sách Trong các ứng dụng, thông thường chúng ta chỉ sử dụng một nhóm các phép toán nào đó Sau đây là một số phép toán chính trên danh sách 1 Khởi tạo danh sách... toán tử new theo cú pháp sau: = new ; Để chèn phần tử có giá trị x vào DSLK kép có chỉ điểm đầu First, chỉ điểm cuối Last, ta sử dụng một trong 3 giải thuật sau: i Chèn vào đầu danh sách Giải thuật void InsertFirst(int x, Tro *&First, Tro *&Last) { Trang 28 Giáo trình cấu trúc dữ liệu & giải thuật } Trường CĐCN Huế Tro *p=new Tro; p->nd=x; p->next=First; p->pre=NULL; if(First==NULL)... p->link=last->link; last->link=p; } {1} {2} Trong giải thuật này có hai trường hợp xảy ra: Trường hợp if: tương tự như giải thuật chèn đầu vào danh sách rỗng Trường hợp else: ta phải tìm đến phần tử cuối cùng trong danh sách thông qua vòng lặp while Kết thúc vòng lặp while, ta có kết quả: x 8 last 5 First Trang 19 NULL Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế Tiếp theo: - Câu lệnh {1}... hiện thao tác xóa, ta có thể rơi vào một trong 3 cách sau: i Xóa phần tử đầu tiên trong DSLK Giải thuật void DeleteFirst(int x, Tro *&First) { if(First) {Tro *p=First; First=First->link; delete p;} } ii Xóa phần tử cuối cùng trong DSLK Giải thuật void DeleteLast(int x, Tro *&First) { if(First) if(First->link == NULL) Trang 21 Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế { Tro *p=First;... getch(); } Bài tập cuối chương 1 Khai báo và cài đặt các hàm sau bằng danh sách đặc: Trang 31 Giáo trình cấu trúc dữ liệu & giải thuật Trường CĐCN Huế a Hàm nhận một dãy các số nguyên nhập từ bàn phím, lưu trữ nó trong danh sách đặc theo thứ tự nhập vào b Hàm nhận một dãy các số nguyên nhập từ bàn phím, lưu trữ nó trong danh sách đặc theo thứ tự ngược với thứ tự nhập vào c Viết chương trình con in ra màn... thuật toán phụ thuộc vào số nhỏ nhất trong hai số m và n Giả sử m ≥ n > 0, khi đó cỡ của dữ liệu vào là n Các lệnh (1) và (6) có thời gian thực hiện là O(1) vì chúng là các câu lệnh gán Do đó thời gian thực hiện thuật toán là thời gian thực hiện các lệnh while, ta đánh giá thời gian thực hiện câu lệnh (2) Thân của lệnh này, là khối gồm ba lệnh (3), (4) và (5) Mỗi lệnh có thời gian thực hiện là O(1) Do ... chọn thuật toán số thuật toán có để giải toán cách hiệu Sau ta phân tích thuật toán đánh giá độ phức tạp tính toán 1.3.1.1 Tính hiệu thuật toán Khi giải vấn đề, cần chọn số thuật toán, thuật toán. .. cho liệu vào, no có ảnh hưởng định đến thời gian thực chương trình Cái mà chọn làm cỡ liệu vào phụ thuộc vào thuật toán cụ thể Chẳng hạn, thuật toán xếp mảng, cỡ liệu vào số thành phần mảng; thuật. .. hiệu thuật toán Tính hiệu thuật toán bao gồm hai nhân tố bản: i Dung lượng không gian nhớ cần thiết để lưu giữ liệu vào, kết tính toán trung gian kết thuật toán ii Thời gian cần thiết để thực thuật