1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình cấu trúc dữ liệu và thuật giải 1 phần 1 đh đà lạt

76 309 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

TRƯỜNG ĐẠI HỌC ĐÀ LẠT KHOA CÔNG NGHỆ THÔNG TIN NGUYỄN THỊ THANH BÌNH TRẦN TUẤN MINH GIÁO TRÌNH CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI Dành cho sinh viên ngành Công Nghệ Thông Tin Đà Lạt - 2010 Cấu trúc liệu thuật giải MỤC LỤC MỤC LỤC LỜI NÓI ĐẦU Chương Giới Thiệu Cấu Trúc Dữ Liệu Và Phân Tích Thuật Giải 1.1 .4 Từ toán đến chương trình 1.1.1 Mô hình hóa toán thực tế 1.1.2 Thuật giải (algorithms) 1.2 Kiểu liệu trừu tượng (Abstract Data Type - ADT) 12 1.2.1 Khái niệm trừu tượng hóa 12 1.2.2 Trừu tượng hóa chương trình 12 1.2.3 Trừu tượng hóa liệu 13 1.2.4 Kiểu liệu, cấu trúc liệu kiểu liệu trừu tượng (Data Types, Data Structures, Abstract Data Types) 14 1.3 PHÂN TÍCH THUẬT GIẢI 15 1.3.1 Thuật giải vấn đề liên quan 15 1.3.2 Tính hiệu thuật giải 16 1.3.3 Ký hiệu O biểu diễn thời gian chạy ký hiệu O 19 1.3.4 Đánh giá thời gian chạy thuật giải 23 Chương Tìm kiếm xếp .35 2.1 Các phương pháp tìm kiếm 35 2.1.1 Phương pháp tìm kiếm tuyến tính 35 2.1.2 2.2 Tìm kiếm nhị phân 37 Các phương pháp xếp 39 2.2.1 Thuật giải xếp chọn (Selection Sort) 40 2.2.2 Thuật giải xếp chèn (Insertion Sort) 43 2.2.3 Thuật giải xếp đổi chỗ trực tiếp (Interchange Sort) 46 2.2.4 Thuật giải xếp bọt (Bubble Sort) 48 2.2.5 Thuật giải shaker (Shaker Sort) 50 Cấu trúc liệu thuật giải 2.2.6 Thuật giải Shell (Shell Sort) 51 2.2.7 Thuật giải vun đống (Heap Sort) 53 2.2.8 Thuật giải xếp nhanh (Quick Sort) 57 2.2.9 Thuật giải xếp trộn (Merge Sort) 61 2.2.10 Phương pháp xếp theo số (Radix Sort) 66 Chương Cấu trúc danh sách liên kết 76 3.1 Giới thiệu đối tượng liệu trỏ 76 3.1.1 Cấu trúc liệu tĩnh cấu trúc liệu động 76 3.1.2 Kiểu trỏ 76 3.2 Danh sách liên kết 79 3.2.1 Định nghĩa 79 3.2.2 Tổ chức danh sách liên kết 80 3.3 Danh sách liên kết đơn 81 3.3.1 Tổ chức danh sách theo cách cấp phát liên kết 81 3.3.2 Định nghĩa cấu trúc danh sách liên kết 82 3.3.3 Các thao tác danh sách liên kết đơn 84 3.4 Cài đặt tập hợp danh sách liên kết đơn 101 3.5 Cài đặt đa thức rời rạc danh sách liên kết đơn 105 3.6 Một số cấu trúc đặc biệt danh sách liên kết đơn 110 3.6.1 Ngăn xếp (Stack) 110 3.6.2 Hàng đợi (Queue) 122 3.7 Một số cấu trúc liệu dạng danh sách liên kết khác 128 3.7.1 Danh sách liên kết vòng 128 3.7.2 Danh sách liên kết kép 131 TÀI LIỆU THAM KHẢO .147 Cấu trúc liệu thuật giải LỜI NÓI ĐẦU Cấu trúc liệu thuật giải kiến thức tảng chương trình đào tạo ngành công nghệ thông tin Trong hệ thống tín chương trình đào tạo khoa Công nghệ thông tin trường Đại học Đà Lạt, lĩnh vực tổ chức thành học phần: cấu trúc liệu thuật giải 1, cấu trúc liệu thuật giải Nội dung học phần cấu trúc liệu thuật giải tổ chức chương: • Chương trình bày tổng quan cấu trúc liệu thuật giải o Các bước lập trình để giải cho toán, o Các khái niệm kiểu liệu, kiểu liệu trừu tượng, o Tiếp cận phân tích thuật giải • Chương trình bày phương pháp tìm kiếm xếp o Phương pháp tìm kiếm tuyến tính, tìm kiếm nhị phân; o Các thuật giải xếp: Chọn trực tiếp, Chèn trực tiếp, đổi chỗ trực tiếp, Heap sort, Quick sort, • Chương trình bày cấu trúc liệu danh sách liên kết o Định nghĩa tổ chức danh sách liên kết o Danh sách liên kết đơn: định nghĩa, cách tổ chức thao tác o Các cấu trúc đặc biệt danh sách liên kết đơn: Ngăn xếp, Hàng đợi o Các cấu trúc liệu dạng danh sách liên kết khác danh sách liên kết vòng, danh sách liên kết kép Vì trình độ người biên soạn có hạn nên tập giáo trình không tránh khỏi nhiều khiếm khuyết, Chúng mong góp ý bạn đồng nghiệp sinh viên Cuối cùng, Chúng cảm ơn động viên, giúp đỡ bạn đồng nghiệp khoa Công nghệ thông tin để tập giáo trình tóm tắt hoàn thành Các tác giả Cấu trúc liệu thuật giải Chương Giới Thiệu Cấu Trúc Dữ Liệu Và Phân Tích Thuật Giải Mục tiêu Sau học xong chương này, sinh viên sẽ: - Nắm bước lập trình để giải cho toán - Nắm vững khái niệm kiểu liệu trừu tượng, khác kiểu liệu, kiểu liệu trừu tượng cấu trúc liệu - Tiếp cận phân tích thuật giải Kiến thức cần thiết Các kiến thức cần thiết để học chương bao gồm: Khả nhận biết giải toán theo hướng tin học hóa Nội dung cốt lõi Chương nghiên cứu vấn đề sau: 1.1 - Cách tiếp cận từ toán đến chương trình - Kiểu liệu trừu tượng (Abstract Data Type) - Kiểu liệu – Kiểu liệu trừu tượng – Cấu trúc liệu - Phân tích thuật giải Từ toán đến chương trình 1.1.1 Mô hình hóa toán thực tế Để giải toán thực tế máy tính ta phải việc xác định toán Nhiều thời gian công sức bỏ để xác định toán cần giải quyết, tức phải trả lời rõ ràng câu hỏi "phải làm gì?" sau "làm nào?" Thông thường, khởi đầu, hầu hết toán không đơn giản, không rõ ràng Để giảm bớt phức Cấu trúc liệu thuật giải tạp toán thực tế, ta phải hình thức hóa nó, nghĩa phát biểu lại toán thực tế thành toán hình thức (hay gọi mô hình toán) Có thể có nhiều toán thực tế có mô hình toán Ví dụ 1.1: Tô màu đồ giới Ta cần phải tô màu cho nước đồ giới Trong nước tô màu hai nước láng giềng (cùng biên giới) phải tô hai màu khác Hãy tìm phương án tô màu cho số màu sử dụng Ta xem nước đồ giới đỉnh đồ thị, hai nước láng giềng hai đỉnh ứng với nối với cạnh Bài toán lúc trở thành toán tô màu cho đồ thị sau: Mỗi đỉnh phải tô màu, hai đỉnh có cạnh nối phải tô hai màu khác ta cần tìm phương án tô màu cho số màu sử dụng Ví dụ 1.2: Đèn giao thông Cho ngã năm hình I.1, C E đường chiều theo chiều mũi tên, đường khác hai chiều Hãy thiết kế bảng đèn hiệu điều khiển giao thông ngã năm cách hợp lý, nghĩa là: phân chia lối ngã năm thành nhóm, nhóm gồm lối đi đồng thời không xảy tai nạn giao thông (các hướng không cắt nhau), số lượng nhóm Ta xem đầu vào (input) toán tất lối ngã năm này, đầu (output) toán nhóm lối đi đồng thời mà không xảy tai nạn giao thông, nhóm tương ứng với pha điều khiển đèn hiệu, ta phải tìm kiếm lời giải với số nhóm để giao thông không bị tắc nghẽn phải chờ đợi lâu Cấu trúc liệu thuật giải Trước hết ta nhận thấy ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED Tất nhiên, để giải toán ta phải tìm cách để thể mối liên quan lối Lối với lối đồng thời, lối lối đồng thời Ví dụ cặp AB EC đồng thời, AD EB không, hướng giao thông cắt Ở ta dùng sơ đồ trực quan sau: tên 13 lối viết lên mặt phẳng, hai lối đồng thời xảy đụng (tức hai hướng cắt qua nhau) ta nối lại đoạn thẳng, cong, ngoằn ngoèo tuỳ thích Ta có sơ đồ hình I.2 Như vậy, sơ đồ này, hai lối có cạnh nối lại với hai lối cho đồng thời Với cách biểu diễn ta có đồ thị (Graph), tức ta mô hình hoá toán giao thông theo mô hình toán đồ thị; lối trở thành đỉnh đồ thị, hai lối đồng thời nối đoạn ta gọi cạnh đồ thị Bây ta phải xác định nhóm, với số nhóm nhất, nhóm gồm lối đi đồng thời, ứng với pha đèn hiệu điều khiển giao thông Giả sử rằng, ta dùng màu để tô lên đỉnh đồ thị cho: - Các lối cho phép đồng thời có màu: Dễ dàng nhận thấy hai đỉnh có cạnh nối không tô màu - Số nhóm nhất: ta phải tính toán cho số màu dùng Tóm lại, ta phải giải toán sau: Cấu trúc liệu thuật giải "Tô màu cho đồ thị hình I.2 cho: - Hai đỉnh có cạnh nối với (hai gọi hai đỉnh kề nhau) không màu - Số màu dùng nhất." Hai toán thực tế “tô màu đồ giới” “đèn giao thông” xem khác biệt sau mô hình hóa, chúng thực chất một, toán “tô màu đồ thị” Đối với toán hình thức hoá, tìm kiếm cách giải thuật ngữ mô hình xác định có hay không chương trình có sẵn để giải Nếu chương trình tìm biết mô hình dùng tính chất mô hình để xây dựng thuật giải tốt 1.1.2 Thuật giải (algorithms) Khi có mô hình thích hợp cho toán ta cần cố gắng tìm cách giải toán mô hình Khởi đầu tìm thuật giải, chuỗi hữu hạn thị (instruction) mà thị có ý nghĩa rõ ràng thực lượng thời gian hữu hạn Knuth (1973) định nghĩa thuật giải chuỗi hữu hạn thao tác để giải toán Các tính chất quan trọng thuật giải là: - Hữu hạn (finiteness): thuật giải phải luôn kết thúc sau số hữu hạn bước Cấu trúc liệu thuật giải - Xác định (definiteness): bước thuật giải phải xác định rõ ràng phải thực xác, quán - Hiệu (effectiveness): thao tác thuật giải phải thực lượng thời gian hữu hạn Ngoài thuật giải phải có đầu vào (input) đầu (output) Nói tóm lại, thuật giải phải giải xong công việc ta cho liệu vào Có nhiều cách để thể thuật giải: dùng lời, dùng lưu đồ, Và lối dùng phổ biến dùng ngôn ngữ mã giả, kết hợp ngôn ngữ tự nhiên cấu trúc ngôn ngữ lập trình Ví dụ 1.3: Thiết kế thuật giải để giải toán “ tô màu đồ thị” Bài toán tô màu cho đồ thị thuật giải tốt để tìm lời giải tối ưu, tức là, thuật giải khác "thử tất khả năng" hay "vét cạn" tất trường hợp có, để xác định cách tô màu cho đỉnh đồ thị cho số màu dùng Thực tế, ta "vét cạn" trường hợp đồ thị có số đỉnh nhỏ, trường hợp ngược lại ta "vét cạn" tất khả lượng thời gian hợp lý, ta phải suy nghĩ cách khác để giải vấn đề: Thêm thông tin vào toán để đồ thị có số tính chất đặc biệt dùng tính chất đặc biệt ta dễ dàng tìm lời giải, thay đổi yêu cầu toán cho dễ giải quyết, lời giải tìm chưa lời giải tối ưu Một cách làm toán "Cố gắng tô màu cho đồ thị màu cách nhanh chóng" Ít màu có nghĩa số màu mà ta tìm luôn số màu lời giải tối ưu (ít nhất) đa số trường hợp trùng với đáp số lời giải tối ưu có chênh lệch "không chênh lệch nhiều" so với lời giải tối ưu, bù lại ta "vét cạn" khả có thể! Nói khác đi, ta không dùng thuật giải "vét cạn" khả để tìm lời giải tối ưu mà tìm giải pháp để đưa lời giải hợp lý cách khả thi thời gian Một giải pháp gọi HEURISTIC HEURISTIC cho toán tô màu đồ thị, thường gọi thuật giải "háu ăn" (GREEDY) là: Cấu trúc liệu thuật giải - Chọn đỉnh chưa tô màu tô màu C - Duyệt danh sách đỉnh chưa tô màu Đối với đỉnh chưa tô màu, xác định xem có kề với đỉnh tô màu C không Nếu không có, tô màu C Ý tưởng Heuristic đơn giản: dùng màu để tô cho nhiều đỉnh (các đỉnh xét theo thứ tự đó), tô với màu dùng dùng màu khác Như ta "hi vọng" số màu cần dùng Ví dụ 1.4: Đồ thị hình I.3 cách tô màu cho Tô theo GREEDY Tối ưu (xét theo số thứ tự đỉnh) (thử tất khả năng) 1: đỏ; 2: đỏ 1,3,4 : đỏ 3: xanh;4: xanh 2,5 : xanh 5: vàng Rõ ràng cách tô màu thuật giải "háu ăn" không luôn cho lời giải tối ưu thực cách nhanh chóng Trở lại toán giao thông áp dụng HEURISTIC Greedy cho đồ thị hình I.2 (theo thứ tự đỉnh liệt kê trên), ta có kết quả: - Tô màu xanh cho đỉnh: AB,AC,AD,BA,DC,ED - Tô màu đỏ cho đỉnh: BC,BD,EA Cấu trúc liệu thuật giải if(i < r) QuickSort(a,i,r); } e Đánh giá Thuật giải Hiệu thực thuật giải QuickSort phụ thuộc vào việc chọn giá trị mốc Trường hợp tốt xảy lần phân hoạch chọn phần tử median (phần tử lớn (hay bằng) nửa số phần tử, nhỏ (hay bằng) nửa số phần tử lại) làm mốc, dãy phân chia thành phần cần log2(N) lần phân hoạch xếp xong Nhưng lần phân hoạch lại chọn nhằm phần tử có giá trị cực đại (hay cực tiểu) mốc, dãy bị phân chia thành phần không đều: phần có phần tử, phần lại gồm (N-1) phần tử, cần phân hoạch n lần xếp xong Ta có bảng tổng kết 2.2.9 Thuật giải xếp trộn (Merge Sort) a Ý tưởng Ðể xếp dãy a0, a1, ,aN-1, thuật giải Merge Sort dựa nhận xét sau: Mỗi dãy a0, a1, , aN-1 coi tập hợp dãy liên tiếp mà mồi dãy có thứ tự Ví dụ dãy 12, 2, 8, 5, 1, 6, 4, 15 coi gồm dãy không giảm (12); (2, 8); (5); (1, 6); (4, 15) Dãy có thứ tự coi có dãy Như vậy, cách tiếp cận để xếp dãy tìm cách làm giảm số dãy không giảm Ðây hướng tiếp cận thuật giải xếp theo phương pháp trộn 61 Cấu trúc liệu thuật giải Trong phương pháp Merge sort, mấu chốt vấn đề cách phân hoạch dãy ban đầu thành dãy Sau phân hoạch xong, dãy ban đầu tách thành dãy phụ theo nguyên tắc phân phối luân phiên Trộn cặp dãy hai dãy phụ thành dãy dãy ban đầu, ta nhân lại dãy ban đầu với số lượng dãy giảm nửa Lặp lại qui trình sau số bước, ta nhận dãy gồm dãy không giảm Nghĩa dãy ban đầu xếp Thuật giải trộn trực tiếp phương pháp trộn đơn giản Việc phân hoạch thành dãy đơn giản tách dãy gồm N phần tử thành N dãy Ðòi hỏi Thuật giải tính có thứ tự dãy thỏa cách phân hoạch dãy gồm phân tử có thứ tự Cứ lần tách trộn, chiều dài dãy nhân đôi b Thuật giải - Bước 1: // Chuẩn bị k = 1; // k chiều dài dãy bước hành - Bước 2: Tách dãy a0 , a1 , , aN-1 thành dãy b, c theo nguyên tắc luân phiên nhóm k phần tử: b = a0, , ak-1, a2k, , a3k-1 , … c = ak, , a2k-1, a3k, , a4k-1 , - Bước 3: Trộn cặp dãy gồm k phần tử dãy b, c vào a - Bước 4: k = k*2; Nếu k < n trở lại bước Ngược lại: Dừng c Cài đặt 62 Cấu trúc liệu thuật giải void MergeSort(int a[], int N) { int p, pb, pc; //các số mảng a, b, c int i, k = 1; //độ dài dãy phân hoạch // tách a thành b c { p = pb = pc = 0; while(p < N) { for(i = 0; (p < n)&&(i < k); i++) b[pb++] = a[p++]; for(i = 0; (p < n)&&(i < k); i++) c[pc++] = a[p++]; } Merge(a, pb, pc, k); //trộn b c thành a k *= 2; }while(k < N); } Trong hàm Merge cài đặt sau: void Merge(int a[], int nb, int nc, int k) { int p, pb, pc, ib, ic, kb, kc; p = pb = pc = 0; ib = ic = 0; while((0 < nb)&&(0 < nc)) { kb = min(k, nb); kc = min(k, nc); 63 Cấu trúc liệu thuật giải if(b[pb+ib] [...]... ngữ lập trình 13 Cấu trúc dữ liệu và thuật giải 1 1.2.4 Kiểu dữ liệu, cấu trúc dữ liệu và kiểu dữ liệu trừu tượng (Data Types, Data Structures, Abstract Data Types) Mặc dù các thuật ngữ kiểu dữ liệu (hay kiểu - data type), cấu trúc dữ liệu (data structure), kiểu dữ liệu trừu tượng (abstract data type) nghe như nhau, nhưng chúng có ý nghĩa rất khác nhau Kiểu dữ liệu là một tập hợp các giá trị và một... dữ liệu vào chính là cỡ n của mảng Đương nhiên là có vô số dữ liệu vào cùng một cỡ Nói chung trong phần lớn các thuật giải, cỡ của dữ liệu vào là một số nguyên dương n Thời gian chạy của thuật giải phụ thuộc vào cỡ của dữ liệu vào; chẳng hạn tính định thức của ma trận cấp 20 đòi hỏi thời gian chạy nhiều hơn tính định thức của ma trận cấp 10 17 Cấu trúc dữ liệu và thuật giải 1 Nói chung, cỡ của dữ liệu. .. một kiểu dữ liệu trừu tượng trên một ngôn gnữ lập trình cụ thể, chúng ta phải thực hiện hai nhiệm vụ: 1 Biểu diễn kiểu dữ liệu trừu tượng bằng một cấu trúc dữ liệu hoặc một kiểu dữ liệu trừu tượng khác đã được cài đặt 2 Viết các chương trình con thực hiện các phép toán trên kiểu dữ liệu trừu tượng mà ta thường gọi là cài đặt các phép toán 14 Cấu trúc dữ liệu và thuật giải 1 1.3 PHÂN TÍCH THUẬT GIẢI Với... hiện các kiểu dữ liệu trừu tượng, các bước của thuật giải được thể hiện bằng các lệnh và các cấu trúc điều khiển trong ngôn ngữ lập trình được dùng để cài đặt thuật giải Tóm tắt các bước như sau: 11 Cấu trúc dữ liệu và thuật giải 1 1.2 Kiểu dữ liệu trừu tượng (Abstract Data Type - ADT) 1. 2 .1 Khái niệm trừu tượng hóa Trong tin học, trừu tượng hóa nghĩa là đơn giản hóa, làm cho nó sáng sủa hơn và dễ hiểu... mỗi thuật giải có một dữ liệu vào (Input) và một dữ liệu ra (Output); khi thực hiện thuật giải (thực hiện các bước đã mô tả), thuật giải cần cho ra các dữ liệu ra tương ứng với các dữ liệu vào Biểu diễn thuật giải Để đảm bảo tính chính xác, chỉ có thể hiểu một cách duy nhất, thuật giải cần được mô tả trong một ngôn ngữ lập trình thành một chương trình (hoặc một hàm, một thủ tục), tức là thuật giải. .. hằng số c1, c2, c3 và n1, n2, n3 sao cho: T1(n) = n1 T2(n) = n2 g(n) = n3 Đặt n0= max(n1, n2, n3) Khi đó với mọi n >= n0, ta có: T1(n) + T2(n) ... học Đà Lạt, lĩnh vực tổ chức thành học phần: cấu trúc liệu thuật giải 1, cấu trúc liệu thuật giải Nội dung học phần cấu trúc liệu thuật giải tổ chức chương: • Chương trình bày tổng quan cấu trúc. .. ví dụ Chạy thuật giải xếp chèn 43 Cấu trúc liệu thuật giải i = 1: i = 2: i = 3: i = 4: i = 5: i = 6: i = 7: 7 7 25 15 8 15 25 15 15 8 25 18 15 18 18 18 25 18 15 6 6 25 18 15 4 4 25 18 0 0 0 25... 25 6 6 15 25 7 7 15 25 8 18 15 15 15 15 18 15 25 18 18 18 18 18 25 25 c Cài đặt void BubbleSort(int a[], int N ) { int i, j; for (i = ; ii ; j ) if(a[j]< a[j -1 ] ) Hoanvi(a[j],a[j -1 ] );

Ngày đăng: 03/12/2015, 02:01

Xem thêm: Giáo trình cấu trúc dữ liệu và thuật giải 1 phần 1 đh đà lạt

TỪ KHÓA LIÊN QUAN

w