Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 29 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
29
Dung lượng
525,8 KB
Nội dung
Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác 11.2.2 Các thao tác bổ trợ 11.3 Cài đặt hàng đợi trỏ (Linked list) 11.4 Vài ứng dụng hàng đợi 11.4.1 Palindromes 11.4.2 Demerging 11.4.3 Tính giá trị biểu thức 11.4 Bài tập thực hành Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác 11.2.2 Các thao tác bổ trợ 11.3 Cài đặt hàng đợi trỏ (Linked list) 11.4 Vài ứng dụng hàng đợi 11.4.1 Palindromes 11.4.2 Demerging 11.4.3 Tính giá trị biểu thức 11.4 Bài tập thực hành 11.1 Khái niệm hàng đợi 11.1 Khái niệm hàng đợi Trong ứng dụng máy tính, định nghĩa CTDL hàng đợi danh sách, việc thêm phần tử thực đầu danh sách (cuối hàng đợi) việc lấy phần tử thực cuối danh sách (đầu hàng) Hàng đợi gọi danh sách FIFO (First In First Out) 11.1 Khái niệm hàng đợi Định nghĩa: Một hàng đợi phần tử kiểu T chuỗi nối tiếp phần tử T kèm theo số tác vụ sau: Tạo đối tượng hàng rỗng; Thêm phần tử vào hàng, giả sử hàng đợi chưa đầy (phần tử liệu thêm vào cuối hàng); Loại phần tử khỏi hàng, giả sử hàng chưa rỗng (phần tử bị loại phần tử đầu hàng, thường phần tử vừa xử lý xong); Xem phần tử đầu hàng (phần tử xử lý) 11.1 Khái niệm hàng đợi Số lượng ứng dụng hàng đợi không thua (hơn) ngăn xếp VD: máy tính làm việc, có nhiều hàng đợi chức khác sử dụng: hàng đợi máy in; việc truy xuất đĩa; sử dụng CPU; chuyển đổi từ Infix sang Prefix Phần tử đầu hàng đợi phục vụ trước, phần tử thường gọi front hay head Phần tử thêm vào gọi rear hay tail 11.1 Khái niệm hàng đợi Một số dạng hàng đợi: Hàng đợi tuyến tính - Linear Queues Tổ chức hàng đợi theo nghĩa thông thường Hàng đợi vòng - Circular Queues Giải việc thiếu nhớ sử dụng hàng đợi Hàng đợi ưu tiên - Priority Queues Mỗi phần tử có kết hợp thêm thơng tin độ ưu tiên Khi chương trình cần lấy phần tử khỏi hàng đợi, xét phần tử có độ ưu tiên cao trước Multi-Headed Queues Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác 11.2.2 Các thao tác bổ trợ 11.3 Cài đặt hàng đợi trỏ (Linked list) 11.4 Vài ứng dụng hàng đợi 11.4.1 Palindromes 11.4.2 Demerging 11.4.3 Tính giá trị biểu thức 11.4 Bài tập thực hành 11.2 Cài đặt hàng đợi mảng Cài đặt hàng đợi mảng tuyến tính: Lúc khởi tạo hàng đợi rỗng: front = rear = -1 Lần lượt thêm phần tử 0, 1, 2, 3: front = 0; rear = 3; Lấy phần tử: front = 2; rear = 3; Tiếp tục thêm vào phần tử: front = 2; rear = 5; Tiếp tục thêm vào phần tử nữa: front = 2; rear = 7; Hàng đợi đầy, thêm nữa; 11.2 Cài đặt hàng đợi mảng Cài đặt: Tạo mảng với kích cỡ cho trước (n); Dùng biến front rear để quản lý index phần tử cuối hàng đợi; Thao tác khởi tạo hàng đợi: front = rear = -1; Hàng đợi rỗng: front = rear; Hàng đợi đầy: rear = n-1; Cho phép thêm phần tử vào hàng đợi hàng đợi chưa đầy: rear = rear +1; Cho phép xóa phần tử hàng đợi không rỗng: front = front + 1; 11.3 Cài đặt hàng đợi DSLK Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: Dữ liệu cần lưu trữ; Liên kết đến nút Data next Link Node 60 1000 800 45 800 90 55 90 NULL 11.3 Cài đặt hàng đợi DSLK Khai báo cấu trúc liệu liên kết struct Node{ int info; struct Node *next; }; typedef struct Node *QueueNode; typedef struct{ QueueNode head ; QueueNode tail ; }Queue; 11.3 Cài đặt hàng đợi DSLK Thêm phần tử vào hàng đợi void Put(Queue &q, int x){ QueueNode ql = (QueueNode) malloc(sizeof(struct Node)); ql->info=x; ql->next=NULL; if(QueueEmpty(q)) { q.head=q.tail=ql; } else{ q.tail->next=ql; q.tail=ql; } } 11.3 Cài đặt hàng đợi DSLK Xóa phần tử khỏi hàng đợi int Get(Queue &q){ if(QueueEmpty(q)) printf("Queue is empty!"); else{ QueueNode temp=q.head; int x=temp->info; q.head=q.head->next; if(temp->next=NULL) q.tail=NULL; free(temp); return x; } } 11.3 Cài đặt hàng đợi DSLK Khởi tạo hàng đợi Kiểm tra hàng đợi có rỗng khơng void QueueInitialize(Queue &q) { q.head=NULL; q.tail=NULL; } int QueueEmpty(Queue q) { return (q.head==NULL); } Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác 11.2.2 Các thao tác bổ trợ 11.3 Cài đặt hàng đợi trỏ (Linked list) 11.4 Vài ứng dụng hàng đợi 11.4.1 Palindromes 11.4.2 Demerging 11.4.3 Tính giá trị biểu thức 11.4 Bài tập thực hành 11.4.1 Palindromes Khái niệm: Một chuỗi gọi Palindrome đọc xi giống đọc ngược Bài tốn: Cho trước chuỗi, kiểm tra xem chuỗi có phải chuỗi palindrome hay khơng? Ví dụ chuỗi palindrome: Able was I ere I saw Elba Giải pháp: Để tránh ảnh hưởng tới chuỗi ban đầu, đọc chuỗi nói vào stack queue So sánh phần tử stack queue, giống cặp chuỗi Palindrome, ngược lại chuỗi khơng phải chuỗi Palindrome Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác 11.2.2 Các thao tác bổ trợ 11.3 Cài đặt hàng đợi trỏ (Linked list) 11.4 Vài ứng dụng hàng đợi 11.4.1 Palindromes 11.4.2 Demerging 11.4.3 Tính giá trị biểu thức 11.4 Bài tập thực hành 11.4.2 Demerging Tổ chức liệu hợp lý - Demerging Bài toán: Xem xét toán sau: Giả sử, với hệ thống quản lý nhân Các ghi lưu file Mỗi ghi gồm trường: Họ tên, giới tính, ngày tháng năm sinh, Dữ liệu theo ngày tháng năm sinh Cần tổ chức lại liệu cho nữ liệt kê trước nam giữ tính theo ngày tháng năm sinh 11.4.2 Demerging Tổ chức liệu hợp lý - Demerging Cách giải quyết: Ý tưởng không hiệu quả: Sử dụng thuật toán xếp Độ phức tạp thuật toán O(n log n) trường hợp tốt Ý tưởng hiệu hơn: Sử dụng giải thuật demerging Độ phức tạp giải thuật O(n) 11.4.2 Demerging Giải thuật Demerging: Tạo queue rỗng, có tên NU NAM Với ghi p, xem xét: 1 Xét queue NU, queue chưa rỗng: Lấy phần tử queue Ghi vào file output Xét queue NAM, queue chưa rỗng: Nếu p có giới tính nữ, đưa vào queue NU Nếu p có giới tính nam, đưa vào queue NAM Lấy phần tử queue Ghi tiếp vào file output Kết thúc giải thuật ... Hàng đợi tuyến tính - Linear Queues Tổ chức hàng đợi theo nghĩa thơng thường Hàng đợi vịng - Circular Queues Giải việc thiếu nhớ sử dụng hàng đợi Hàng đợi ưu tiên - Priority Queues Mỗi phần tử... trình cần lấy phần tử khỏi hàng đợi, xét phần tử có độ ưu tiên cao trước Multi-Headed Queues Lecture 11 – Hàng đợi (Queues) 11.1 Khái niệm hàng đợi 11.2 Cài đặt hàng đợi mảng 11.2.1 Các thao tác... QueueNode ql = (QueueNode) malloc(sizeof(struct Node)); ql->info=x; ql->next=NULL; if(QueueEmpty(q)) { q.head=q.tail=ql; } else{ q.tail->next=ql; q.tail=ql; } } 11.3 Cài đặt hàng đợi DSLK Xóa