Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 128 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
128
Dung lượng
0,95 MB
Nội dung
Cấutrúcliệuthuậtgiải 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 BÀI GIẢNG TĨM TẮT CẤUTRÚCDỮLIỆUVÀTHUẬTGIẢI Dành cho sinh viên ngành công nghệ thông tin (Lưu hành nội bộ) Đà Lạt 2008 Cấutrúcliệuthuậtgiải MỤC LỤC MỤC LỤC LỜI NÓI ĐẦU CHƯƠNG 1: GIỚI THIỆU CẤUTRÚCDỮLIỆUVÀ PHÂN TÍCH THUẬTGIẢI 1.1 Từ tốn đến chương trình 1.1.1 Mơ hình hóa tốn thực tế 1.1.2 Thuậtgiải (algorithms) 1.2 Kiểu liệu trừu tượng (Abstract Data Type - ADT) 13 1.2.1 Khái niệm trừu tượng hóa 13 1.2.2 Trừu tượng hóa chương trình 13 1.2.3 Trừu tượng hóa liệu 14 1.2.4 Kiểu liệu, cấutrúcliệu kiểu liệu trừu tượng (Data Types, Data Structures, Abstract Data Types) 15 1.3 PHÂN TÍCH THUẬTGIẢI 16 1.3.1 Thuậtgiải vấn đề liên quan 16 1.3.2 Tính hiệu thuậtgiải 17 1.3.3 Ký hiệu O biểu diễn thời gian chạy ký hiệu O 20 1.3.4 Đánh giá thời gian chạy thuậtgiải 24 CHƯƠNG 2: TÌM KIẾM VÀ SẮP XẾP TRONG 33 2.1 Các phương pháp tìm kiếm 33 2.1.1 Phương pháp tìm kiếm tuyến tính 33 2.1.2 Tìm kiếm nhị phân 35 2.2 Các phương pháp xếp 37 2.2.1 Thuậtgiải xếp chọn (Selection Sort) 38 2.2.2 Thuậtgiải xếp chèn (Insertion Sort) 41 2.2.3 Thuậtgiải xếp đổi chỗ trực tiếp (Interchange Sort) 44 2.2.4 Thuậtgiải xếp bọt (Bubble Sort) 46 2.2.5 Thuậtgiải shaker (Shaker Sort) 48 2.2.6 Thuậtgiải Shell (Shell Sort) 49 2.2.7 Thuậtgiải vun đống (Heap Sort) 51 2.2.8 Thuậtgiải xếp nhanh (Quick Sort) 55 2.2.9 Thuậtgiải xếp trộn (Merge Sort) 59 2.2.10 Phương pháp xếp theo số (Radix Sort) 64 CHƯƠNG 3: CẤUTRÚC DANH SÁCH LIÊN KẾT 72 3.1 Giới thiệu đối tượng liệu trỏ 72 3.1.1 Cấutrúcliệu tĩnh cấutrúcliệu động 72 3.1.2 Kiểu trỏ 72 3.2 Danh sách liên kết 75 3.2.1 Định nghĩa 75 Cấutrúcliệuthuậtgiải 3.2.2 Tổ chức danh sách liên kết 76 3.3 Danh sách liên kết đơn 77 3.3.1 Tổ chức danh sách theo cách cấp phát liên kết 77 3.3.2 Định nghĩa cấutrúc danh sách liên kết 79 3.3.3 Các thao tác danh sách liên kết đơn 80 3.4 Sắp xếp danh sách 94 3.5 Một số cấutrúc đặc biệt danh sách liên kết đơn 97 3.5.1 Ngăn xếp (Stack) 97 3.5.2 Hàng đợi (Queue) 103 3.6 Một số cấutrúcliệu dạng danh sách liên kết khác 108 3.6.1 Danh sách liên kết vòng 108 3.6.2 Danh sách liên kết kép 112 TÀI LIỆU THAM KHẢO Cấutrúcliệuthuậtgiải LỜI NÓI ĐẦU Cấutrúcliệuthuậtgiả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ấutrúcliệuthuậtgiải 1, cấutrúcliệuthuậtgiải Nội dung học phần cấutrúcliệuthuậtgiải tổ chức chương: • Chương trình bày tổng quan cấutrúcliệuthuậtgiả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ậtgiả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ậtgiả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ấutrúcliệ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ấutrúc đặc biệt danh sách liên kết đơn: Ngăn xếp, Hàng đợi o Các cấutrúcliệ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ấutrúcliệuthuậtgiải Chương 1: Giới Thiệu CấuTrúcDữLiệuVà Phân Tích ThuậtGiả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ấutrúcliệu - Tiếp cận phân tích thuậtgiả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: - Cách tiếp cận từ tố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ấutrúcliệu - Phân tích thuậtgiải 1.1 Từ tốn đến chương trình 1.1.1 Mơ hình hóa tốn thực tế Để giải toán thực tế máy tính ta phải việc xác định tố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 tốn khơng đơn giản, không rõ ràng Để giảm bớt phức Cấutrúcliệuthuậtgiải tạp tố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 tốn hình thức (hay gọi mơ hình tốn) Có thể có nhiều tốn thực tế có mơ hình tốn Ví dụ 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 tố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ụ 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ấutrúcliệuthuậtgiả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 tố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 hố tốn giao thơng theo mơ hình tố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ấutrúcliệuthuậtgiả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 tố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, tốn “tơ màu đồ thị” Đối với tốn hình thức hố, tìm kiếm cách giảithuật ngữ mơ hình xác định có hay khơng chương trình có sẵn để giải Nếu khơng có 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ậtgiải tốt 1.1.2 Thuậtgiải (algorithms) Khi có mơ hình thích hợp cho tốn ta cần cố gắng tìm cách giải tố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ậtgiải chuỗi hữu hạn thao tác để giải tốn Các tính chất quan trọng thuậtgiải là: - Hữu hạn (finiteness): thuậtgiải phải luôn kết thúc sau số hữu hạn bước Cấutrúcliệuthuậtgiải - Xác định (definiteness): bước thuậtgiải phải xác định rõ ràng phải thực xác, quán - Hiệu (effectiveness): thao tác thuậtgiải phải thực lượng thời gian hữu hạn Ngoài thuậtgiải phải có đầu vào (input) đầu (output) Nói tóm lại, thuậtgiả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ấutrúc ngơn ngữ lập trình Ví dụ: Thiết kế thuậtgiải để giải tốn “ tơ màu đồ thị” Bài tốn tơ màu cho đồ thị khơng có thuậtgiải tốt để tìm lời giải tối ưu, tức là, khơng có thuậtgiả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 tố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 u cầu tố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 tố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 khơng phải ln ln 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ậtgiả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 tốn tơ màu đồ thị, thường gọi thuậtgiải "háu ăn" (GREEDY) là: Cấutrúcliệuthuậtgiả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ự đó), khơng thể 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ụ: Đồ 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ậtgiải "háu ăn" không ln cho lời giải tối ưu thực cách nhanh chóng Trở lại tố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 10 Cấutrúcliệuthuậtgiải - Chèn nút vào trước phần tử p Chèn đầu danh sách - void AddFirst(DLIST &l, DNODE* new_ele) - { - if (l.pHead==NULL) //DS rỗng - { - l.pHead = new_ele; - l.pTail = l.pHead; - } - else - { - new_ele->pNext = l.pHead; - l.pHead->pPrev = new_ele;// (2) - l.pHead = new_ele; // (3) - // (1) } } Chèn phần tử vào cuối danh sách liên kết 114 Cấutrúcliệuthuậtgiải - void AddTail(DLIST &l, DNODE *new_ele) - { - if (l.pHead==NULL) - { - l.pHead = new_ele; - l.pTail = l.pHead; - } - else - { - l.pTail->Next = new_ele; // (1) - new_ele->pPrev = l.pTail; // (2) - l.pTail = new_ele; // (3) - } } Chèn phần tử sau phần tử q danh sách - void AddAfter(DLIST &l, DNODE* q,DNODE* new_ele) - { - DNODE* p = q->pNext; - if ( q!=NULL) - { - new_ele->pNext = p; //(1) - new_ele->pPrev = q; //(2) - q->pNext = new_ele; //(3) - if(p != NULL) p->pPrev = new_ele; //(4) 115 Cấutrúcliệuthuậtgiải - if(q == l.pTail) l.pTail = new_ele; - } - else //chèn đầu danh sách - AddFirst(l, new_ele); } Chèn phần tử vào trước phần tử q danh sách Hình III.10: chèn phần tử x trước phần tử q - void AddBefore(DLIST &l, DNODE q, DNODE* new_ele) - { - DNODE* p = q->pPrev; - if ( q!=NULL) - { - new_ele->pNext = q; //(1) - new_ele->pPrev = p; //(2) - q->pPrev = new_ele; //(3) - if(p != NULL) p->pNext = new_ele; //(4) - if(q == l.pHead) l.pHead = new_ele; - } - else //chèn vào cuối danh sách - AddTail(l, new_ele); } Hủy phần tử khỏi danh sách Có thao tác thông dụng để hủy phần tử khỏi danh sách liên kết kép 116 Cấutrúcliệuthuậtgiải - Hủy phần tử đầu danh sách - Hủy phần tử đầu danh sách - Hủy phần tử sau phần tử q - Hủy phần tử trước phần tử q - Hủy phần tử có khóa k Hủy phần tử đầu xâu - Data RemoveHead(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pHead != NULL) - { - p = l.pHead; x = p->Info; - l.pHead = l.pHead->pNext; - l.pHead->pPrev = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } Hủy phần tử cuối xâu - Data RemoveTail(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pTail != NULL) - { 117 Cấutrúcliệuthuậtgiải - p = l.pTail; x = p->Info; - l.pTail = l.pTail->pPrev; - l.pTail->pNext = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } Hủy phần tử đứng sâu phần tử q - Data RemoveTail(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pTail != NULL) - { - p = l.pTail; x = p->Info; - l.pTail = l.pTail->pPrev; - l.pTail->pNext = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } Hủy phần tử đứng truớc phần tử q - void RemoveBefore (DLIST &l, DNODE *q) - { 118 Cấutrúcliệuthuậtgiải - DNODE *p; - if ( q != NULL) - { - p = q ->pPrev; - if ( p != NULL) - { - q->pPrev = p->pPrev; - if(p == l.pHead) l.pHead = q; - else p->pPrev->pNext = q; - delete p; - } - } - else - RemoveTail(l); } Hủy phần tử có khóa k - int RemoveNode(DLIST &l, Data k) - { - DNODE *p = l.pHead; - NODE *q; - while( p != NULL) - { - if(p->Info == k) break; - p = p->pNext; - } - if(p == NULL) return 0; //Khơng tìm k - q = p->pPrev; - if ( q != NULL) 119 Cấutrúcliệuthuậtgiải - { - p = q ->pNext ; - if ( p != NULL) - { - q->pNext = p->pNext; - if(p == l.pTail) l.pTail = q; - else p->pNext->pPrev = q; - } - } - else //p phần tử đầu danh sách - { - l.pHead = p->pNext; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - delete p; - return 1; - } Sắp xếp danh sách liên kết kép Việc xếp danh sách liên kết kép khơng khác danh sách liên kết đơn Ta cần lưu ý điều cần bảo toàn mối liên kết hai chiều xếp Ví dụ: cài đặt thuật toán xếp QuickSort - void - { DListQSort(DLIST & l) - DNODE *p, *X; // X đến phần tử cầm canh - DLIST l1, l2; - if(l.pHead == l.pTail) return;//đã có thứ tự 120 Cấutrúcliệuthuậtgiải - l1.pHead == l1.pTail = NULL; //khởi tạo - l2.pHead == l2.pTail = NULL; - X = l.pHead; l.pHead = X->pNext; - while(l.pHead != NULL) //Tách l thành l1, l2; - { - p = l.pHead; - l.pHead = p->pNext; p->pNext = NULL; - if (p->Info Info) AddTail(l1, p); - else AddTail(l2, p); - } - DListQSort(l1); //Gọi đệ qui để l1 - DListQSort(l2); //Gọi đệ qui để l2 - //Nói l1, X, l2 thành l - if(l1.pHead != NULL) - { - l.pHead = l1.pHead; l1.pTail->pNext = X; - X->pPrev = l1.pTail; - } - else l.pHead = X; - X->pNext = l2; - if(l2.pHead != NULL) - { - l.pTail = l2.pTail; - l2->pHead->pPrev = X; - } - else l.pTail = X; - } Nhận xét 121 Cấutrúcliệuthuậtgiải Xâu kép co có tính chất giống xâu đơn, nhiên cómột số tính chất khác sau: - Xâu kép có mối liên kết hai chiều nên từ phần tử truy xuất phần tử khác Trong xâu đơn ta truy xuất đến phần tử đứng sau phần tử cho trước Điều dẫn đến việc ta dễ dàng hủy phần tử cuối xâu kép, xâu đơn thao tác tốnchi phí O(n) - Bù lại, xâu kép tốn chi phí gấp đơi so với xâu đơn cho việc lưu trữ mối liên kết Điều khiến việc cập nhật nặng nề số trường hợp Như ta cần cân nhắc lựa chọn CTDL hợp lý cài đặtcho ứng dụng cụ thể Bài tập: Bài 1: Kiểu Data định nghĩa sau: struct Data { char HoTen[30]; double Luong; 122 Cấutrúcliệuthuậtgiải char CMND[15]; } Viết chương trình thực thao tác danh sách liên kết đơn Yêu cầu chương trình : - In hình menu có chức sau : Xuất liệu danh sách hình Kiem tra danh sách rỗng hay không? 3, Đảo ngược danh sách cho Tìm phần tử danh sách Chèn phần tử vào danh sách Hủy phần tử khỏi danh sách Đếm số nút danh sách Copy danh sách cho sang danh sách khác Tách nút danh sách l sang danh sách đơn l1, l2 10 Tách danh sách l sang danh sách đơn l1, l2 l1 chứa nửa số nút đầu l, l2 chứa nút lại 11 Sắp xếp tăng dần danh sách liên kết theo khóa lương 12 Thốt - Nhập liệu cho danh sách , muốn thực thao tác chọn chức tương ứng menu Bài 2: Viết chương trình thực phép toán tập hợp (tập hợp cài đặt danh sách liên kết đơn) Yêu cầu chương trình : 123 Cấutrúcliệuthuậtgiải - In hình menu có chức sau: Xem tập hợp Tính hợp tập hợp Tính giao tập hợp Kiểm tra phần tử có thuộc vào tập hợp Tính A\B Tính hiệu đối xứng tập hợp: (A\B)U(B\A) Tính lực lượng tập hợp Thốt - Nhập liệu cho tập hợp, muốn thực thao tác chọn chức tương ứng menu Bài 3: Viết chương trình thực phép toán Đa thức (dùng danh sách liên kết đơn lưu trử hệ số khác số mũ tương ứng) Yêu cầu chương trình : - In hình menu có chức sau: Xuất đa thức hình Cộng đa thức Trừ đa thức Nhân đa thức Tính giá trị cuta đa thức x Thoát - Nhập liệu cho tập hợp, muốn thực thao tác chọn chức tương ứng menu Bài 4: Viết chương trình thực thao tác Stack Yêu cầu chương trình : 124 Cấutrúcliệuthuậtgiải - In hình menu có chức sau : Xuất liệu Stack hình Kiem tra Stack rỗng hay khơng? 3, Xem đỉnh Stack Tìm phần tử Stack Thêm phần tử vào đầu Stack Hủy phần tử đầu khỏi Stack Đếm số nút Stack Copy Stack cho sang Stack khác Thoát - Nhập liệu cho Stack , muốn thực thao tác chọn chức tương ứng menu Bài 5: Ứng dụng cấutrúcliệu Stack, viết chương trình đổi số nguyên dương hệ 10 sang hệ Bài 6: Viết chương trình thực thao tác Queue (cài đặt danh sách liên kết đơn).Yêu cầu chương trình : - In hình menu có chức sau : Xuất liệu Queue hình Kiem tra Queue rỗng hay khơng? Tìm phần tử Queue Thêm phần tử vào cuối Queue Hủy phần tử đầu khỏi Queue Đếm số nút Queue 125 Cấutrúcliệuthuậtgiải Thoát - Nhập liệu cho Queue , muốn thực thao tác chọn chức tương ứng menu Bài 7: Viết chương trình thực thao tác danh sách liên kết vòng (đơn) u cầu chương trình : - In hình menu có chức sau : Xuất liệu danh sách hình Kiem tra danh sách rỗng hay khơng? Tìm phần tử danh sách Chèn phần tử vào danh sách Hủy phần tử khỏi danh sách Thoát - Nhập liệu cho danh sách , muốn thực thao tác chọn chức tương ứng menu Bài (Bài tốn Josephus): Một nhóm binh sĩ bị kẻ thù bao vây binh sĩ chọn để cầu cứu Việc chọn thực theo cách sau đây: “ Một số nguyên n binh sĩ chọn ngẫu nhiên Các binh sĩ theo vòng tròn họ đếm từ binh sĩ chọn ngẫu nhiên Khi đạt đến n, binh sĩ tương ứng lấy khỏi vòng việc đếm lại binh sĩ Quá trình tiếp tục lại binh sĩ chọn để cầu cứu” Hãy viết thuật toán cài đặt cách chọn này, dùng danh sách liên kết vòng để lưu trữ tên binh sĩ 126 Cấutrúcliệuthuậtgiải 127 Cấutrúcliệuthuậtgiải TÀI LIỆU THAM KHẢO [1] ALFRED V AHO & JOHN E.HOPCROFT & JOHN D ULMANN (1983), “Data structures and algorithms”, Addison Wesley [2] LARRY NYHOFF & SANFORD LESSTMA, “Lập trình nâng cao Passcal với cấutrúc liệu” (bản dịch: Lê Minh Trung (1997)) [3] NIKLAUS WIRTH, “Algorithms + data structures = Programs”, Prentice-Hall INC (Bản dịch Nguyễn Quốc Cường (1983)) [4] S.E.GOODMAN & S.T HEDETNIEMI (1977), “Introduction to the design and analysis of algorithms”, Mcgraw-Hill [5] TRẦN HẠNH NHI (1997), “Cấu trúc liệu”, Trung tâm phát triển Cơng nghệ thơng tin t.p Hồ Chí Minh [] TRƯƠNG CHÍ TÍN (2000), “Cấu trúcliệuthuậtgiải 1”, Đại học Đà Lạt []ĐỖ XUÂN LÔI (1995), “Cấu trúcliệugiải thuật”, Nhà xuất Khoa học Kỹ thuật, Hà Nội 128 ... 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. .. cấp 10 18 Cấu trúc liệu thuật giải Nói chung, cỡ liệu lớn thời gian thực thuật giải lớn Nhưng thời gian thực thuật giải không phụ thuộc vào cỡ liệu vào mà phụ thuộc vào liệu vào Trong số liệu vào... ta chọn cấu trúc liệu thích hợp có ngơn ngữ lập trình cấu trúc liệu phức hợp xây dựng lên từ kiểu liệu ngôn ngữ lập trình 14 Cấu trúc liệu thuật giải 1. 2.4 Kiểu liệu, cấu trúc liệu kiểu liệu trừu