1. Trang chủ
  2. » Giáo án - Bài giảng

Cấu trúc dữ liệu và giải thuật (Data Structure and Algorithms): Giải thuật tham lam (Greedy Algorithm)

2 261 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 2
Dung lượng 153,27 KB

Nội dung

NGUYỄN VĂN LINH TRẦN CAO ĐỆ TRƯƠNG THỊ THANH TUYỀN LÂM HOÀI BẢO PHAN HUY CƯỜNG TRẦN NGÂN BÌNH CẤU TRÚC DỮ LIỆU Trang 1 Cấu trúc dữ liệu Lời nói đầu ĐẠI HỌC CẦN THƠ – 12/2003 LỜI NÓI ĐẦU Để đáp ứng nhu cầu học tập của các bạn sinh viên, nhất là sinh viên chuyên ngành tin học, Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ chúng tôi đã tiến hành biên soạn các giáo trình, bài giảng chính trong chương trình học. Giáo trình môn Cấu Trúc Dữ Liệu này được biên soạn cơ bản dựa trên quyển "Data Structures and Algorithms" của Alfred V. Aho, John E. Hopcroft Jeffrey D. Ullman do Addison-Wesley tái bản năm 1987. Giáo trình này cũng được biên soạn dựa trên kinh nghiệm giảng dạy nhiều năm môn Cấu Trúc Dữ Liệu Giải Thuật của chúng tôi. Tài liệu này được soạn theo đề cương chi tiết môn Cấu Trúc Dữ Liệu của sinh viên chuyên ngành tin học của Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ. Mục tiêu của nó nhằm giúp các bạn sinh viên chuyên ngành có một tài liệu cô đọng dùng làm tài liệu học tập, nhưng chúng tôi cũng không loại trừ toàn bộ các đối tượng khác tham khảo. Chúng tôi nghĩ rằng các bạn sinh viên không chuyên tin những người quan tâm tới cấu trúc dữ liệu giải thuật sẽ tìm được trong này những điều hữu ích. Mặc đã rất cố gắng nhiều trong quá trình biên soạn giáo trình nhưng chắc chắn giáo trình sẽ còn nhiều thiếu sót hạn chế. Rất mong nhận được sự đóng góp ý kiến quý báu của sinh viên các bạn đọc để giáo trình ngày một hoàn thiện hơn. Cần thơ, ngày 10 tháng 11 năm 2003 Các tác giả Trần Cao Đệ Nguyễn Văn Linh Trương Thị Thanh Tuyền Lâm Hoài Bảo Phan Huy Cường Trần Ngân Bình Trang 2 Cấu trúc dữ liệu Mục lục MỤC LỤC CHƯƠNG I MỞ ĐẦU 9 UI. TỪ BÀI TOÁN ĐẾN CHƯƠNG TRÌNH .9 1. Mô hình hóa bài toán thực tế 9 2. Giải thuật (algorithms) .12 3. Ngôn ngữ giả tinh chế từng bước (Pseudo-language and stepwise refinement) .15 4. Tóm tắt 17 II. KIỂU DỮ LIỆU TRỪU TƯỢNG (ABSTRACT DATA TYPE) 18 1. Khái niệm trừu tượng hóa .18 2. Trừu tượng hóa chương trình .18 3. Trừu tượng hóa dữ liệu .19 III. KIỂU DỮ LIỆU - CẤU TRÚC DỮ LIỆU KIỂU DỮ LIỆU TRỪU TƯỢNG (DATA TYPES, DATA STRUCTURES, ABSTRACT DATA TYPES) 20 CHƯƠNG II CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN .22 (BASIC ABSTRACT DATA TYPES) 22 I. KIỂU DỮ LIỆU TRỪU TƯỢNG DANH SÁCH (LIST) .24 1. Khái niệm danh sách 24 2. Các phép toán trên danh sách Giải thuật tham lam (Greedy Algorithm) Giải thuật tham lam ? Tham lam (hay tham ăn) phương pháp phổ biến để thiết kế giải thuật Nếu bạn đọc truyện dân gian có câu chuyện này: mâm cỗ có nhiều ăn, ngon ta ăn trước, ăn hết ta chuyển sang ngon thứ hai, chuyển tiếp sang thứ ba, … Rất nhiều giải thuật tiếng thiết kế dựa ý tưởng tham lam, ví dụ giải thuật khung nhỏ Dijkstra, giải thuật khung nhỏ Kruskal, … Giải thuật tham lam (Greedy Algorithm) giải thuật tối ưu hóa tổ hợp Giải thuật tìm kiếm, lựa chọn giải pháp tối ưu địa phương bước với hi vọng tìm giải pháp tối ưu toàn cục Giải thuật tham lam lựa chọn giải pháp cho tốt thời điểm sau giải toán nảy sinh từ việc thực lựa chọn Lựa chọn giải thuật tham lam phụ thuộc vào lựa chọn trước Việc định sớm thay đổi hướng giải thuật với việc không xét lại định cũ dẫn đến kết giải thuật không tối ưu để tìm giải pháp toàn cục Bạn theo dõi toán đơn giản để thấy cách thực giải thuật tham lam lại nói giải thuật không tối ưu Bài toán đếm số đồng tiền Yêu cầu lựa chọn số lượng đồng tiền nhỏ cho tổng mệnh giá đồng tiền với lượng tiền cho trước Nếu tiền đồng có mệnh giá 1, 2, 5, 10 xu lượng tiền cho trước 18 xu giải thuật tham lam thực sau:  Bước 1: Chọn đồng 10 xu, 18 – 10 = xu  Bước 2: Chọn đồng xu, xu  Bước 3: Chọn đồng xu, lại xu  Bước 4: Cuối chọn đồng xu giải xong toán Bạn thấy cách làm ổn, số lượng đồng tiền cần phải lựa chọn đồng tiền Nhưng thay đổi toán chút hướng tiếp cận không đem lại kết tối ưu Chẳng hạn, hệ thống tiền tệ khác có đồng tiền có mệnh giá 1, 10 xu lượng tiền cho trước thay đổi thành 15 xu theo giải thuật tham lam số đồng tiền cần chọn nhiều Với giải thuật tham lam thì: 10 + + +1 + + 1, tổng cộng đồng tiền Trong toán xử lý việc chọn đồng tiền (7 + +1) Do kết luận rằng, giải thuật tham lam tìm kiếm giải pháp ưu bước lại thất bại việc tìm giải pháp tối ưu toàn cục Ví dụ áp dụng giải thuật tham lam Có nhiều giải thuật tiếng thiết kế dựa tư tưởng giải thuật tham lam Dưới số giải thuật này:  Bài toán hành trình người bán hàng  Giải thuật khung nhỏ Prim  Giải thuật khung nhỏ Kruskal  Giải thuật khung nhỏ Dijkstra  Bài toán xếp lịch công việc  Bài toán xếp ba lô  Mục lục Giáo trình Cấu trúc dữ liệu Giải thuật iMỤC LỤC Phần 1 – PHẦN MƠÛ ĐẦU Chương 1 – GIỚI THIỆU 1.1. Về phương pháp phân tích thiết kế hướng đối tượng .1 1.2. Giới thiệu môn học Cấu trúc dữ liệu (CTDL) giải thuật .1 1.3. Cách tiếp cận trong quá trình tìm hiểu các lớp CTDL 4 1.3.1. Các bước trong quá trình phân tích thiết kế hướng đối tượng .4 1.3.2. Quá trình xây dựng các lớp CTDL 5 1.4. Một số đònh nghóa cơ bản .6 1.4.1. Đònh nghóa kiểu dữ liệu .6 1.4.2. Kiểu nguyên tố các kiểu có cấu trúc .6 1.4.3. Chuỗi nối tiếp danh sách 6 1.4.4. Các kiểu dữ liệu trừu tượng 7 1.5. Một số nguyên tắc phương pháp để học tốt môn CTDL giải thuật 8 1.5.1. Cách tiếp cận phương hướng suy nghó tích cực 8 1.5.2. Các nguyên tắc 9 1.5.3. Phong cách lập trình (style of programming) các kỹ năng: .10 1.6. Giới thiệu về ngôn ngữ giả: 14 Phần 2 – CÁC CẤU TRÚC DỮ LIỆU Chương 2 – NGĂN XẾP 2.1. Đònh nghóa ngăn xếp .17 2.2. Đặc tả ngăn xếp .18 2.3. Các phương án hiện thực ngăn xếp 22 2.4. Hiện thực ngăn xếp .22 2.4.1. Hiện thực ngăn xếp liên tục 22 2.4.2. Hiện thực ngăn xếp liên kết 25 2.4.3. Ngăn xếp liên kết với sự an toàn 29 2.4.4. Đặc tả ngăn xếp liên kết đã hiệu chỉnh .34 Mục lục Giáo trình Cấu trúc dữ liệu Giải thuật ii Chương 3 – HÀNG ĐI 3.1. Đònh nghóa hàng . 37 3.2. Đặc tả hàng . 38 3.3. Các phương án hiện thực hàng 41 3.3.1. Các phương án hiện thực hàng liên tục . 41 3.3.2. Phương án hiện thực hàng liên kết 45 3.4. Hiện thực hàng 46 3.4.1. Hiện thực hàng liên tục . 46 3.4.2. Hiện thực hàng liên kết 48 3.4.3. Hàng liên kết mở rộng 50 Chương 4 – DANH SÁCH 4.1. Đònh nghóa danh sách 51 4.2. Đặc tả các phương thức cho danh sách . 51 4.3. Hiện thực danh sách . 54 4.3.1. Hiện thực danh sách liên tục 54 4.3.2. Hiện thực danh sách liên kết đơn giản . 56 4.3.3. Lưu lại vò trí hiện tại . 61 4.3.4. Danh sách liên kết kép . 63 4.4. So sánh các cách hiện thực của danh sách . 66 4.5. Danh sách liên kết trong mảng liên tục . 67 4.5.1. Phương pháp . 67 4.5.2. Các tác vụ quản lý vùng nhớ . 70 4.5.3. Các tác vụ khác CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT DATA STRUCTURE AND ALGORITHMS GV: Phạm Tuấn Hiệp Email: hiep0109@yahoo.com Ôn tập tốt nghiệp Nội dung ôn tập  Chương 1: Ôn tập Kỹ thuật lập trình  Chương 2: Tìm kiếm, Sắp xếp  Chương 3: Danh sách liên kết  Chương 4: Cây 2 Ôn tập tốt nghiệp Tài liệu học tập  Giáo trình:  C & Data Structures, P. S. Deshpande, O. G. Kakde - CHARLES RIVER MEDIA, INC. Hingham, Massachusetts.  Tham khảo:  Giáo trình Cấu trúc dữ liệu 1, Trần Hạnh Nhi – Dương Anh Đức, Trường ĐHKHTN – ĐHQG TP.HCM.  Phần mềm lập trình:  C-Free 4.0  Borland C++  … 3 Chương 1: Ôn tập Kỹ thuật lập trình 4 Ôn tập tốt nghiệp Nội dung  Con trỏ  Mảng 1 chiều  Đệ quy 5    Ôn tập tốt nghiệp Con trỏ  Cách khai báo con trỏ  Các phép toán trên con trỏ 6 void main(){ int x=10, y=20; int *p, *q; p=&x; q=&y; cout<<x<<" "<<y<<endl; cout<<*p<<" "<<*q<<end; } Cho biết kết quả in ra màn hình? x = 10 y = 10 p = 10 q = 10 Ôn tập tốt nghiệp Con trỏ void main(){ int x=10, y=20; int *p, *q; p=&x; q=&y; *p=50; *q=90; cout<<x<<" "<<y<<endl; cout<<*p<<" "<<*q<<end; } Cho biết kết quả in ra màn hình? 7 x = 50 y = 90 p = 50 q = 90 Ôn tập tốt nghiệp Con trỏ void main(){ int x=10, y=20; int *p, *q; p=&x; q=&y; *p=50; *q=90; p=q; cout<<x<<" "<<y<<endl; cout<<*p<<" "<<*q<<end; } Cho biết kết quả in ra màn hình? 8 x = 50 y = 90 p = 90 q = 90 Ôn tập tốt nghiệp Con trỏ Cho biết kết quả của chương trình sau: int Test(int &a, int b, int &c) { a ; a+=b; ++c=a+b; return a+b+c; } int x=5, y=2, z=2011; void main(){ cout<<Test(x,y,z)<<" "<<x<<" "<<y<<" "<<z<<endl; } 9 A. 16 6 2 2011 B. 16 5 2 8 C. 16 5 2 2011 D. 16 6 2 8 Ôn tập tốt nghiệp Nội dung  Con trỏ  Mảng 1 chiều  Đệ quy 10    Ôn tập tốt nghiệp Mảng 1 chiều  Khai báo mảng  Các phép toán trên mảng 11 void function(char *s1, char *s2){ while (*(s1++)=*(s2++)); } void main(){ char s2[100]; char s1[]="Giao Trinh Ngon Ngu C++"; function(s2,s1); cout<<s2; } Cho biết kết quả in ra màn hình? Giao Trinh Ngon Ngu C++ Ôn tập tốt nghiệp Mảng 1 chiều void main(){ float a[5]={5, 4, 3, 2, 1}; float x; int i; for(i=0; i<5; i++) a[i] += a[0]; x=a[1]+a[4]; cout<<x; } Cho biết kết quả in ra màn hình? 12 A. 125 B. 5 C. 100 D. 25 Ôn tập tốt nghiệp Mảng 1 chiều Cho biết kết quả của chương trình sau: void main(){ int a[]={5,1,12,11,8,20,14,12,7}; for(int i=4;i<=7;i++) for(int j=i+1;j<=8;j++) if(a[i]>a[j]){ int t=a[i]; a[i]=a[j]; a[j]=t; } cout<<a[6]; } 13 A. 7 B. 12 C. 8 D. 20 Ôn tập tốt nghiệp Nội dung  Con trỏ  Mảng 1 chiều  Đệ quy 14    Ôn tập tốt nghiệp Đệ quy  Đệ quy là sự gọi lại chính nó khi thực hiện  Thường được dùng cho các bài toán truy hồi 15 Cho hàm đệ quy sau: int Func(int n){ if(n == 5) return 5; else return 2 * Func(n+1); } Giá trị của Func(2) là? A. 50 B. 2 C. 5 D. 40 Ôn tập tốt nghiệp Đệ quy void Foo(int x){ if(x>0) Foo(x-3); cout<<x<<" "; } Cho biết kết quả in ra màn hình khi goi hàm Foo(6)? 16 A. 6 3 B. 0 3 6 C. 0 3 D. 6 3 0 Chương 2: Tìm kiếm, Sắp xếp 17 Ôn tập tốt nghiệp Nội dung  Tìm kiếm tuyến tính, nhị phân  Các thuật toán sắp xếp  Đổi chỗ trực tiếp (Interchange sort)  Nổi bọt (Bubble sort)  Chèn trực tiếp (Insertion sort)  Chọn trực tiếp (Selection sort)  Dựa trên phân hoạch (Quick sort) 18    Ôn tập tốt nghiệp Tìm kiếm CấU TRÚC Dữ LIệU GIảI THUẬT DATA STRUCTURE AND ALGORITHMS 1 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Nội dung môn học  Chương 0: Giới thiệu chung về CTDL GT  Chương 1: Ôn tập C/C++  Chương 2: Đệ quy (Recursion)  Chương 3: Tìm kiếm (Searching)  Chương 4: Sắp xếp (Sorting)  Chương 5: Ngăn xếp - Hàng đợi (Stacks - Queues)  Chương 6: Danh sách liên kết (Linked List)  Chương 7: Cây (Tree) 2 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Đánh giá kết quả 1. Kiểm tra giữa kỳ: thực hành  Điểm Kiểm tra giữa kỳ < 4  không được thi kết thúc môn  học lại 2. Kiểm tra cuối kỳ: thực hành  Điểm Kiểm tra cuối kỳ < 5  không được thi kết thúc môn  học lại 3. Bài tập lớn: làm các bài tập trong module  Điểm Đề tài < 5  không được thi kết thúc môn  học lại 4. Thi kết thúc môn: trắc nghiệm 5. Kiểm tra thường kỳ 3 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Tài liệu học tập  Giáo trình:  C & Data Structures, P. S. Deshpande, O. G. Kakde - CHARLES RIVER MEDIA, INC. Hingham, Massachusetts.  Tham khảo:  Giáo trình Cấu trúc dữ liệu 1, Trần Hạnh Nhi – Dương Anh Đức, Trường ĐHKHTN – ĐHQG TP.HCM.  Phần mềm lập trình:  C-Free  Borland C++  … 4 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Nhắc nhở một số quy định  Đi học đúng giờ  Đeo thẻ SV  Không để chuông điện thoại reo trong giờ học  Không nghe điện thoại, nhắn tin trong giờ học  Không nói chuyện riêng, làm ồn khi nghe giảng  Mang đầy đủ tài liệu học tập của môn học (khi học LT TH): giáo trình, bài tập, tập chép bài (hoặc slide bài giảng), usb để lưu bài tập  Phải làm bài tập ở nhà  Nếu vi phạm: Nhắc nhở chung  Bị mời ra khỏi lớp  Xóa tên khỏi môn học 5 Chương 0: Giới thiệu chung 6 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Nội dung  Cấu trúc dữ liệuThuật toán  Độ phức tạp của thuật toán 7  Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Cấu trúc dữ liệu  (1) Sự tổ chức hợp lý của các thành phần dữ liệu,  (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. 8 Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Nội dung  Cấu trúc dữ liệuThuật toán  Độ phức tạp của thuật toán 9  Chương 1: Ôn tập C/C++ Chương 1: Ôn tập C/C++ Thuật toán  Tập các bước có thể tính toán được để đạt được kết quả mong muốn (A computable set of steps to achieve a desired result)  Ví dụ: Tính tổng các số nguyên lẻ từ 1  n  B1: S=0  B2: i=1  B3: Nếu i>n thì sang B7, ngược lại sang B4  B4: S=S+i  B5: i=i+2  B6: Quay lại B3  B7: Tổng cần tìm là S 10 [...]... của CTDL thuật toán 11 CTDL + Thuật toán = Chương trình Chương 1: Ôn tập Nội dung 12  Cấu trúc dữ liệuThuật toán  Độ phức tạp của thuật toán (algorithm  complexity) Chương 1: Ôn tập Thời gian thực Cấu trúc liệu giải thuật (Data Structure and Algorithms): Cấu trúc liệu mảng Cấu trúc liệu mảng Cấu trúc liệu mảng gì? Mảng (Array) cấu trúc liệu cũ quan trọng Mảng lưu giữ số phần tử cố định phần tử có kiểu Hầu hết cấu trúc liệu sử dụng mảng để triển khai giải thuật Dưới khái niệm quan trọng liên quan tới Mảng • Phần tử: Mỗi mục lưu giữ mảng gọi phần tử • Chỉ mục (Index): Mỗi vị trí phần tử mảng có mục số sử dụng để nhận diện phần tử Mảng gồm ghi có kiểu giống nhau, có kích thước cố định, phần tử xác định số Mảng cấu trúc liệu cấp phát lien tục Ưu điểm mảng: • Truy câp phần tử với thời gian số O(1) • Sử dụng nhớ hiệu • Tính cục nhớ Nhược điểm • Không thể thay đổi kích thước mảng chương trình dang thực Mảng động Mảng động (dynamic aray): cấp phát nhớ cho mảng cách động trình chạy chương trình C malloc calloc, C++ new Sử dụng mảng động ta bắt đầu với mảng có phàn tử, số lượng phàn tử vượt qua khả ảng ta gấp đôi kích thước mảng cuc copy phàn tử mảng cũ vào nửa đầu mảng Ưu điểm: tránh lãng phí nhớ phải khai báo mảng có kích thước lớn từ đầu Nhược điểm: + phải thực them thao tác copy phần tử thay đổi kích thước + số thời gian thực thao tác không số Biểu diễn Cấu trúc liệu mảng Mảng khai báo theo nhiều cách đa dạng ngôn ngữ lập trình Để minh họa, sử dụng phép khai báo mảng ngôn ngữ C: Hình minh họa phần tử mục: Dưới số điểm cần ghi nhớ cấu trúc liệu mảng: • Chỉ mục bắt đầu với • Độ dài mảng 10, nghĩa mảng lưu giữ 10 phần tử • Mỗi phần tử truy cập thông qua mục phần tử Ví dụ, lấy giá trị phần tử mục 27 Phép toán hỗ trợ mảng Dưới hoạt động hỗ trợ mảng: • Duyệt: In tất phần tử mảng theo cách in phần tử • Chèn: Thêm phần tử vào mảng mục cho • Xóa: Xóa phần tử từ mảng mục cho • Tìm kiếm: Tìm kiếm phần tử sử dụng mục hay giá trị • Cập nhật: Cập nhật giá trị phần tử mục Trong ngôn ngữ C, mảng khởi tạo với kích cỡ ban đầu, gán giá trị mặc định cho phần tử mảng theo thứ tự sau: Kiểu liệu Giá trị mặc định bool false char int float 0.0 double 0.0f void wchar_t Hoạt động chèn phần tử vào mảng Hoạt động chèn để chèn nhiều phần tử liệu vào mảng Tùy theo yêu cầu, phần tử chèn vào vị trí đầu, vị trí cuối vị trí mục cho mảng Phần triển khai hoạt động chèn ví dụ thực Trong ví dụ này, chèn liệu vào cuối mảng Ví dụ Giả sử LA mảng tuyến tính thứ tự có N phần tử K số nguyên dương thỏa mãn K = K Gán LA[J+1] = LA[J] Gán J = J-1 Gán LA[K] = ITEM Kết thúc Sau code đầy đủ giải thuật ngôn ngữ C: #include main() { int LA[] = {1,3,5,7,8}; int item = 10, k = 3, n = 5; int i = 0, j = n; printf("Danh sach phan tu mang ban dau:\n"); for(i = 0; i= k){ LA[j+1] = LA[j]; j = j - 1; } LA[k] = item; printf("Danh sach phan tu cua mang sau hoat dong chen:\n"); for(i = 0; i ... bước lại thất bại việc tìm giải pháp tối ưu toàn cục Ví dụ áp dụng giải thuật tham lam Có nhiều giải thuật tiếng thiết kế dựa tư tưởng giải thuật tham lam Dưới số giải thuật này:  Bài toán hành... cần chọn nhiều Với giải thuật tham lam thì: 10 + + +1 + + 1, tổng cộng đồng tiền Trong toán xử lý việc chọn đồng tiền (7 + +1) Do kết luận rằng, giải thuật tham lam tìm kiếm giải pháp ưu bước... Dưới số giải thuật này:  Bài toán hành trình người bán hàng  Giải thuật khung nhỏ Prim  Giải thuật khung nhỏ Kruskal  Giải thuật khung nhỏ Dijkstra  Bài toán xếp lịch công việc  Bài toán

Ngày đăng: 08/09/2017, 03:31

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN