1. Trang chủ
  2. » Thể loại khác

Cấu trúc dữ liệu và giải thuật - PTITVL GiaoTrinh

153 192 0

Đ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

Nội dung

LỜI NÓI ĐẦU Cấu trúc liệu giải thuật môn học sinh viên ngành Công nghệ thông tin Các cấu trúc liệu giải thuật đƣợc xem nhƣ yếu tố quan trọng lập trình, nhƣ câu nói tiếng Niklaus Wirth: Chƣơng trình = Cấu trúc liệu + Giải thuật (Programs = Data Structures + Algorithms) Nắm vững cấu trúc liệu giải thuật sở để sinh viên tiếp cận với việc thiết kế xây dựng phần mềm nhƣ sử dụng cơng cụ lập trình đại Cấu trúc liệu đƣợc xem nhƣ phƣơng pháp lƣu trữ liệu máy tính nhằm sử dụng cách có hiệu liệu Và để sử dụng liệu cách hiệu cần phải có thuật tốn áp dụng liệu Do vậy, cấu trúc liệu giải thuật yếu tố khơng thể tách rời có liên quan chặt chẽ với Việc lựa chọn cấu trúc liệu ảnh hƣởng lớn tới việc lựa chọn áp dụng giải thuật Tài liệu “Cấu trúc liệu giải thuật” bao gồm chƣơng, trình bày cấu trúc liệu giải thuật tin học Chƣơng trình bày phân tích thiết kế thuật tốn Đầu tiên cách phân tích vấn đề, từ thực tiễn chƣơng trình, cách thiết kế giải pháp cho vấn đề theo cách giải máy tính Tiếp theo, phƣơng pháp phân tích, đánh giá độ phức tạp thời gian thực giải thuật đƣợc xem xét chƣơng Chƣơng trình bày đệ qui, khái niệm tốn học khoa học máy tính Việc sử dụng đệ qui xây dựng đƣợc chƣơng trình giải đƣợc vấn đề phức tạp số câu lệnh, đặc biệt vấn đề mang chất đệ qui Chƣơng 3, 4, 5, trình bày cấu trúc liệu đƣợc sử dụng thông dụng nhƣ mảng danh sách liên kết, ngăn xếp hàng đợi, cây, đồ thị Đó cấu trúc liệu gần gũi với cấu trúc thực tiễn Chƣơng trình bày thuật tốn xếp tìm kiếm Các thuật tốn với kỹ thuật đƣợc sử dụng đƣợc coi kỹ thuật sở cho lập trình máy tính Các thuật tốn đƣợc xem xét bao gồm lớp thuật toán đơn giản thuật toán cài đặt phức tạp nhƣng có thời gian thực tối ƣu Cuối phần có câu hỏi tập để sinh viên ôn luyện tự kiểm tra kiến thức Cuối tài liệu có phụ lục hƣớng dẫn trả lời câu hỏi, mã nguồn tham khảo tài liệu tham khảo Về nguyên tắc, cấu trúc liệu giải thuật đƣợc biểu diễn cài đặt ngơn ngữ lập trình đại Tuy nhiên, để có đƣợc phân tích sâu sắc có kết thực tế hơn, tác giả sử dụng ngơn ngữ lập trình C để minh hoạ cho cấu trúc liệu thuật toán Do vậy, kiến thức tin học, ngƣời đọc cần có kiến thức ngơn ngữ lập trình C Cuối cùng, cố gắng nhƣng chắn khơng tránh khỏi thiếu sót Tác giả mong nhận đƣợc góp ý bạn đọc đồng nghiệp để tài liệu đƣợc hoàn thiện Hà nội, tháng 10/2007 MỤC LỤC CHƢƠNG I: PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT 1.1 GIẢI THUẬT VÀ NGÔN NGỮ DIỄN ĐẠT GIẢI THUẬT 1.1.1 Giải thuật 1.1.2 Ngôn ngữ diễn đạt giải thuật kỹ thuật tinh chỉnh bƣớc 1.2 PHÂN TÍCH THUẬT TỐN 1.2.1 Ƣớc lƣợng thời gian thực chƣơng trình 10 1.2.2 Tính tốn thời gian thực chƣơng trình 11 1.3 TÓM TẮT CHƢƠNG 13 1.4 CÂU HỎI VÀ BÀI TẬP 13 CHƢƠNG 2: ĐỆ QUI 14 2.1 KHÁI NIỆM 14 2.1.1 Điều kiện để viết chƣơng trình đệ qui 15 2.1.2 Khi không nên sử dụng đệ qui 15 2.2 THIẾT KẾ GIẢI THUẬT ĐỆ QUI 17 2.2.1 Chƣơng trình tính hàm n! 17 2.2.2 Thuật tốn Euclid tính ƣớc số chung lớn số nguyên dƣơng 18 2.2.3 Các giải thuật đệ qui dạng chia để trị (divide and conquer) 18 2.2.4 Thuật toán quay lui (backtracking algorithms) 23 2.3 TÓM TẮT CHƢƠNG 32 2.4 CÂU HỎI VÀ BÀI TẬP 32 CHƢƠNG 3: MẢNG VÀ DANH SÁCH LIÊN KẾT 34 3.1 CẤU TRÚC DỮ LIỆU KIỂU MẢNG (ARRAY) 34 3.2 DANH SÁCH LIÊN KẾT 35 3.2.1 Khái niệm 35 3.2.2 Các thao tác danh sách liên kết 36 3.2.3 Một số dạng khác danh sách liên kết 45 3.3 TÓM TẮT CHƢƠNG 48 3.4 CÂU HỎI VÀ BÀI TẬP 48 I CHƢƠNG 4: NGĂN XẾP VÀ HÀNG ĐỢI 49 4.1 NGĂN XẾP (STACK) 49 4.1.1 Khái niệm 49 4.1.2 Cài đặt ngăn xếp mảng 50 4.1.3 Cài đặt ngăn xếp danh sách liên kết 52 4.1.4 Một số ứng dụng ngăn xếp 55 4.2 HÀNG ĐỢI (QUEUE) 63 4.2.1 Khái niệm 63 4.2.2 Cài đặt hàng đợi mảng 64 4.2.3 Cài đặt hàng đợi danh sách liên kết 67 4.3 TÓM TẮT CHƢƠNG 68 4.4 CÂU HỎI VÀ BÀI TẬP 69 CHƢƠNG 5: CẤU TRÚC DỮ LIỆU KIỂU CÂY 70 5.1 KHÁI NIỆM 70 5.2 CÀI ĐẶT CÂY 71 5.2.1 Cài đặt mảng nút cha 71 5.2.2 Cài đặt thông qua danh sách nút 72 5.3 DUYỆT CÂY 73 5.3.1 Duyệt thứ tự trƣớc 73 5.3.2 Duyệt thứ tự 74 5.3.3 Duyệt thứ tự sau 74 5.4 CÂY NHỊ PHÂN 75 5.4.1 Cài đặt nhị phân mảng 76 5.4.2 Cài đặt nhị phân danh sách liên kết 77 5.4.3 Duyệt nhị phân 78 5.5 TÓM TẮT CHƢƠNG 78 5.6 CÂU HỎI VÀ BÀI TẬP 79 CHƢƠNG 6: ĐỒ THỊ 80 6.1 CÁC KHÁI NIỆM CƠ BẢN 80 6.1.1 Đồ thị có hƣớng 80 6.1.2 Đồ thị vô hƣớng 81 6.1.3 Đồ thị có trọng số 81 6.2 BIỂU DIỄN ĐỒ THỊ 82 II 6.2.1 Biểu diễn đồ thị ma trận kề 82 6.2.2 Biểu diễn đồ thị danh sách kề 84 6.3 DUYỆT ĐỒ THỊ 84 6.3.1 Duyệt theo chiều sâu 84 6.3.2 Duyệt theo chiều rộng 86 6.3.3 Ứng dụng duyệt đồ thị để kiểm tra tính liên thơng 88 6.4 TÓM TẮT CHƢƠNG 88 6.5 CÂU HỎI VÀ BÀI TẬP 89 CHƢƠNG 7: SẮP XẾP VÀ TÌM KIẾM 90 7.1 BÀI TOÁN SẮP XẾP 90 7.2 CÁC GIẢI THUẬT SẮP XẾP ĐƠN GIẢN 91 7.2.1 Sắp xếp chọn 91 7.2.2 Sắp xếp chèn 93 7.2.3 Sắp xếp bọt 95 7.3 QUICK SORT 97 7.3.1 Giới thiệu 97 7.3.2 Các bƣớc thực giải thuật 98 7.3.3 Cài đặt giải thuật 99 7.4 HEAP SORT 100 7.4.1 Giới thiệu 100 7.4.2 Các thuật toán heap 101 7.5 MERGE SORT (SẮP XẾP TRỘN) 109 7.5.1 Giới thiệu 109 7.5.2 Trộn dãy 109 7.5.3 Sắp xếp trộn 113 7.6 BÀI TỐN TÌM KIẾM 115 7.7 TÌM KIẾM TUẦN TỰ 115 7.8 TÌM KIẾM NHỊ PHÂN 115 7.9 CÂY NHỊ PHÂN TÌM KIẾM 117 7.9.1 Tìm kiếm nhị phân tìm kiếm 118 7.9.2 Chèn phần tử vào nhị phân tìm kiếm 119 7.9.3 Xố nút khỏi nhị phân tìm kiếm 121 7.10 TÓM TẮT CHƢƠNG 122 III 7.11 CÂU HỎI VÀ BÀI TẬP 123 PHỤ LỤC I: HƢỚNG DẪN GIẢI CÂU HỎI VÀ BÀI TẬP 124 PHỤ LỤC II: MÃ NGUỒN THAM KHẢO 127 TÀI LIỆU THAM KHẢO 148 IV CHƢƠNG PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT Chƣơng trình bày khái niệm giải thuật phƣơng pháp tinh chỉnh bƣớc chƣơng trình đƣợc thể qua ngôn ngữ diễn đạt giải thuật Chƣơng nêu phƣơng pháp phân tích đánh giá thuật tốn, khái niệm liên quan đến việc tính tốn thời gian thực chƣơng trình Trong phần có minh hoạ cụ thể Phần đầu đƣa ví dụ tốn nút giao thơng phƣơng pháp giải tốn từ phân tích vấn đề thiết kế giải thuật, tinh chỉnh bƣớc mức cụ thể Phần đƣa ví dụ phân tích tính tốn thời gian thực giải thuật xếp bọt Để học tốt chƣơng này, sinh viên cần nắm vững phần lý thuyết tìm ví dụ tƣơng tự để thực hành phân tích, thiết kế, đánh giá giải thuật 1.1 GIẢI THUẬT VÀ NGÔN NGỮ DIỄN ĐẠT GIẢI THUẬT 1.1.1 Giải thuật Trong thực tế, gặp phải vấn đề cần phải giải quyết, ta cần phải đƣa phƣơng pháp để giải vấn đề Khi muốn giải vấn đề cách sử dụng máy tính, ta cần phải đƣa giải pháp phù hợp với việc thực thi chƣơng trình máy tính Thuật ngữ “thuật tốn” đƣợc dùng để giải pháp nhƣ Thuật tốn đƣợc định nghĩa nhƣ sau: Thuật toán chuỗi hữu hạn lệnh Mỗi lệnh có ngữ nghĩa rõ ràng thực với lượng hữu hạn tài nguyên khoảng hữu hạn thời gian Chẳng hạn lệnh x = y + z lệnh có tính chất Trong thuật tốn, lệnh lặp lặp lại nhiều lần, nhiên liệu đầu vào nào, thuật toán phải kết thúc sau thực thi số hữu hạn lệnh Nhƣ nói trên, lệnh thuật tốn phải có ngữ nghĩa rõ ràng đƣợc thực thi khoảng thời gian hữu hạn Tuy nhiên, đơi lệnh có ngữ nghĩa rõ ràng ngƣời nhƣng lại không rõ ràng ngƣời khác Ngồi ra, thƣờng khó để chứng minh lệnh đƣợc thực khoảng hữu hạn thời gian Thậm chí, kể biết rõ ngữ nghĩa lệnh, khó để chứng minh với liệu đầu vào nào, thuật toán dừng Tiếp theo, xem xét ví dụ xây dựng thuật tốn cho tốn đèn giao thơng: Giả sử ngƣời ta cần thiết kế hệ thống đèn cho nút giao thơng có nhiều đƣờng giao phức tạp Để xây dựng tập trạng thái đèn giao thông, ta cần phải xây dựng chƣơng trình có đầu vào tập ngã rẽ đƣợc phép nút giao thông (lối thẳng đƣợc xem nhƣ ngã rẽ) chia tập thành số nhóm, cho tất ngã rẽ nhóm đƣợc lúc mà khơng xảy tranh chấp Sau đó, gắn trạng thái đèn giao thơng với nhóm vừa đƣợc phân chia Với cách phân chia có số nhóm nhất, ta xây dựng đƣợc hệ thống đèn giao thơng có trạng thái Chẳng hạn, ta xem xét tốn với nút giao thơng đƣợc cho nhƣ hình 1.1 dƣới Trong nút giao thơng trên, C E đƣờng chiều, đƣờng lại chiều Có tất 13 ngã rẽ nút giao thơng Một số ngã rẽ đƣợc đồng thời, chẳng hạn ngã rẽ AB (từ A rẽ sang B) EC Một số ngã rẽ khơng đƣợc đồng thời (gây tuyến giao thông xung đột nhau), chẳng hạn AD EB Hệ thống đèn nút giao thông phải hoạt động cho ngã rẽ xung đột (chẳng hạn AD EB) không đƣợc cho phép thời điểm, ngã rẽ không xung đột đƣợc thời điểm E D C B A Hình 1.1 Nút giao thơng Chúng ta mơ hình hóa vấn đề cấu trúc toán học gọi đồ thị (sẽ đƣợc trình bày chi tiết chƣơng 5) Đồ thị cấu trúc bao gồm tập điểm gọi đỉnh tập đƣờng nối điểm, gọi cạnh Vấn đề nút giao thơng đƣợc mơ hình hóa đồ thị, ngã rẽ đỉnh, có cạnh nối đỉnh biểu thị ngã rẽ khơng thể đồng thời Khi đó, đồ thị nút giao thơng hình 1.1 đƣợc biểu diễn nhƣ hình 1.2 AB AC AD BA BC BD DA DB DC EA EB EC ED Hình 1.2 Đồ thị ngã rẽ Ngồi cách biểu diễn trên, đồ thị đƣợc biểu diễn thơng qua bảng, phần tử hàng i, cột j có giá trị có cạnh nối đỉnh i đỉnh j AB AC AD AB BA BC BD DA 1 1 AC DB DC EA EB EC 1 AD 1 1 BA BC BD 1 DA 1 DB 1 1 EB EC 1 1 1 1 1 1 DC EA 1 1 1 ED Bảng 1.1 Biểu diễn đồ thị ngã rẽ bảng ED Ta sử dụng đồ thị để giải vấn đề thiết kế hệ thống đèn cho nút giao thơng nhƣ nói Việc tơ màu đồ thị việc gán cho đỉnh đồ thị màu cho khơng có hai đỉnh đƣợc nối cạnh lại có màu Dễ thấy vấn đề nút giao thơng đƣợc chuyển thành tốn tơ màu đồ thị ngã rẽ cho phải sử dụng số màu Bài tồn tơ màu đồ thị toán xuất đƣợc nghiên cứu từ lâu Tuy nhiên, để tô màu đồ thị với số màu tốn phức tạp Để giải toán này, ngƣời ta thƣờng sử dụng phƣơng pháp “vét cạn” để thử tất khả Có nghĩa, thử tiến hành tô màu đồ thị màu, dùng màu, màu, v.v tìm phƣơng pháp tơ màu thoả mãn u cầu Phƣơng pháp vét cạn thích hợp với đồ thị nhỏ, nhiên đồ thị phức tạp tiêu tốn nhiều thời gian thực nhƣ tài nguyên hệ thống Ta tiếp cận vấn đề theo hƣớng cố gắng tìm giải pháp đủ tốt, khơng thiết phải giải pháp tối ƣu Chẳng hạn, ta cố gắng tìm giải pháp tơ màu cho đồ thị ngã rẽ với số màu ít, gần với số màu nhất, thời gian thực việc tìm giải pháp nhanh Giải thuật tìm giải pháp đủ tốt nhƣng chƣa phải tối ƣu nhƣ gọi giải thuật tìm theo “cảm tính” Đối với tốn tơ màu đồ thị, thuật tốn cảm tính thƣờng đƣợc sử dụng thuật toán “tham ăn” (greedy) Theo thuật toán này, ta sử dụng màu để tô nhiều số đỉnh có thể, thoả mãn yêu cầu tốn Tiếp theo, sử dụng màu thứ để tơ đỉnh chƣa đƣợc tô bƣớc 1, sử dụng đến màu thứ để tô đỉnh chƣa đƣợc tô bƣớc 2, v.v Để tô màu đỉnh với màu mới, thực bƣớc: - Lựa chọn đỉnh chƣa đƣợc tô màu tơ màu - Duyệt qua đỉnh chƣa đƣợc tô màu Với đỉnh dạng này, kiểm tra xem có cạnh nối với đỉnh vừa đƣợc tô màu hay không Nếu cạnh ta tơ màu đỉnh màu Thuật toán đƣợc gọi “tham ăn” bƣớc tơ màu tất đỉnh mà khơng cần phải xem xét xem việc tơ màu có để lại điểm bất lợi cho bƣớc sau hay không Trong nhiều trƣờng hợp, tơ màu đƣợc nhiều đỉnh màu bớt “tham ăn” bỏ qua số đỉnh tơ màu đƣợc bƣớc trƣớc Ví dụ, xem xét đồ thị hình 1.3, đỉnh đƣợc tơ màu đỏ Ta thấy hồn tồn tơ đỉnh màu đỏ, với điều kiện ta không tô đỉnh số màu đỏ Tuy nhiên, ta áp dụng thuật toán tham ăn theo thứ tự đỉnh lớn dần đỉnh đỉnh màu đỏ, đỉnh 3, không đƣợc tô màu đỏ 4 a) Đồ thị ban đầu b) Tơ màu theo thuật tốn tham ăn c) Một cách tô màu tốt Hình 1.3 Đồ thị Bây ta xem xét thuật toán tham ăn đƣợc áp dụng đồ thị ngã rẽ hình 1.2 nhƣ Giả sử ta đỉnh AB tô cho đỉnh màu xanh Khi đó, ta tơ cho đỉnh AC màu xanh khơng có cạnh nối đỉnh với AB AD tơ màu xanh khơng có cạnh nối AD với AB, AC Đỉnh BA khơng có cạnh nối tới AB, AC, AD nên đƣợc tô màu xanh Tuy nhiên, đỉnh BC không tô đƣợc màu xanh tồn cạnh nối BC AB Tƣơng tự nhƣ vậy, BD, DA, DB tô màu xanh tồn cạnh nối chúng tới đỉnh tơ màu xanh Cạnh DC tơ màu xanh Cuối cùng, cạnh EA, EB, EC tô màu xanh ED đƣợc tơ màu xanh AB AC AD BA BC BD DA DB DC EA EB EC Hình 1.4 Tô màu xanh cho đỉnh đồ thị ngã rẽ ED return; } int StackEmpty(stack s){ return (s.top == NULL); } void Push(stack *s, int x){ stacknode p; p = (stacknode) malloc (sizeof(struct node)); p-> item = x; p-> next = s->top; s->top = p; return; } int Pop(stack *s){ stacknode p; if (StackEmpty(*s)){ printf("Ngan xep rong !"); }else{ p = s-> top; s-> top = s-> top-> next; return p->item; } } CÀI ĐẶT HÀNG ĐỢI BẰNG MẢNG #include #include #define MAX 10 typedef struct { int head, tail, count; int node[MAX]; } queue; void QueueInitialize(queue *); 134 int QueueEmpty(queue); void Put(queue *, int); int Get(queue *); void QueueInitialize(queue *q){ q-> head = 0; q-> tail = MAX-1; q-> count = 0; return; } int QueueEmpty(queue q){ return (q.count count >= MAX) printf("Hang doi day !\n"); else { if (q->tail==MAX-1 ) q->tail=0; else q->tail++; q->node[q->tail]=x; q->count++; } return; } int Get(queue *q){ int x; if (QueueEmpty(*q)){ printf("Hang doi rong !"); }else{ x = q-> node[q-> head]; if (q->head==MAX-1 ) q->head=0; else (q->head)++; q-> count ; } return x; } 135 CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾT #include #include struct node { int item; struct node *next; }; typedef struct node *queuenode; typedef struct { queuenode head; queuenode tail; }queue; void QueueInitialize(queue *q){ q-> head = q-> tail = NULL; return; } int QueueEmpty(queue q){ return (q.head == NULL); } void Put(queue *q, int x){ queuenode p; p = (queuenode) malloc (sizeof(struct node)); p-> item = x; p-> next = NULL; q-> tail-> next = p; q-> tail = q-> tail-> next; if (q-> head == NULL) q-> head = q-> tail; return; } 136 int Get(queue *q){ queuenode p; if (QueueEmpty(*q)){ printf("Ngan xep rong !"); return 0; }else{ p = q-> head; q-> head = q-> head-> next; return p->item; } } CHƢƠNG TRÌNH SẮP XẾP CHỌN #include #include #include #include #include int *a, n, m; void selection_sort(); void Init(); void In(); void Init(){ int i; printf("\n Tao lap day so:"); for (i=0; i

Ngày đăng: 23/11/2017, 17:46

TỪ KHÓA LIÊN QUAN