Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
296 KB
Nội dung
CẤU TRÚC DỮ LIỆU ĐẶC BIỆT KHI KHAI THÁC STL TRONG C++ A MỞ ĐẦU I Lý chọn đề tài Trong chuyên đề hội thảo năm 2014 Vĩnh Phúc thầy cô phân tích trình bày đầy đủ nguyên lí hoạt động, cách cài đặt ứng dụng số cấu trúc liệu trừu tượng Hàng đợi, Ngăn xếp, Heap-max… ứng dụng Tuy nhiên cài đặt ngôn ngữ lập trình cụ thể người viết phải xây dựng số hàm thủ tục để từ khai thác thuận lợi Ở ngôn ngữ lập trình C++ có sẵn thư viện lưu trữ cấu trúc liệu nâng cao thường gặp xử lí thuật toán Có nhiều loại cấu trúc liệu đặc biệt, ta quan tâm đến lại cấu trúc: • Hàng đợi hai đầu : dequeue • Ngăn xếp: stack • Hàng đợi ưu tiên(đống) : priority-queue • Tập hợp ánh xạ (set/map) • Vector • Danh sách liên kết (list) Các thư viện có sẵn giúp giảm chi phí thời gian phải xây dựng hàm Đơn giản Pascal bạn phải viết thủ tục Quicksort (1,n) để xếp mảng gồm n phần tử C++ cần gõ dòng lệnh sort(a+1, a+n+1) mảng a xếp không giảm Tuy nhiên chuyên đề xin trình bày hai cấu trúc liệu: • Hàng đợi hai đầu : dequeue • Hàng đợi ưu tiên (đống): priority_queue II.Mục đích đề tài Hàng đợi ưu tiên Hàng đợi hai đầu hai cấu trúc liệu trừu tượng hữu ích trình giải toán kì thi học sinh giỏi Về nội dung kiến thức hàng đợi hai đầu hàng đợi ưu tiên có nhiều tài liệu đề cập đến, chuyên đề không trình bày lại khái niệm, nguyên lí hoạt động mà nhắc lại thao tác hàng đợi để đưa vào áp dụng để giải số toán cụ thế, tài liệu tham khảo cho học sinh giáo viên trình học tập giảng dạy đội tuyển học sinh giỏi B NỘI DUNG: I HÀNG ĐỢI HAI ĐẦU Khai báo thư viện hàng đợi: Để sử dụng hàng đợi hai đầu ta phải khai báo thư viện queue: #include Định nghĩa Hàng đợi hai đầu container cho phép thực thao tác sau: + Thêm phần tử x vào cuối hàng đợi q: q.push_back(x) + Lấy phần tử cuối hàng đợi q: q.pop_back() + Thêm phần tử xvào đầu hàng đợi q: q.push_front(x); + Lấy phần tử đầu hàng đợi q: q.pop_front(); Như việc lấy thêm vào diễn hai đầu hàng đợi + q.empty(): cho giá trị true hàng đợi rỗng, giá trị false hàng đợi không rỗng + q.front(): cho giá trị phần tử đứng đầu hàng đợi + q.back(): cho giá trị phần tử đứng cuối hàng đơi Một số ví dụ khai báo hàng đợi Ví dụ 1: Khai báo hàng đợi q có phần tử kiểu int: deque q; Ví dụ 2: Khai báo hàng đợi q có phần tử kiểu double: deque q; Ví dụ 3:Khai báo hàng đợi q có phần tử kiểu long long: deque q; *Chú ý: Các phần tử hàng đợi phải kiểu kiểu người lập trình tự định nghĩa Ví dụ : Hàng đợi có phần tử cặp: typedef pair< int, int> II; deque q; Ví dụ 2:Hàng đợi có phần tử cặp ba số nguyên: typedef pair III; deque q; Bài tập Bài tập (dqueue.cpp) Cho dãy số nguyên a1, a2, …,an m truy vấn Truy vấn dãy lệnh có dạng q(i,j) với ý nghĩa tìm phần tử nhỏ dãy ai, ai+1, …,aj (i≤j) Cho m truy vấn Q(i1,j1), Q(i2, j2), …, Q(im,jm) thỏa mãn 1.i1≤i2≤….≤im j1≤j2≤….≤jm Hãy in giá trị câu trả lời cho truy vấn tương ứng Input: file dqueue.inp gồm có: • Dòng ghi hai số nguyên dương n, m (1≤n,m≤105) • Dòng thứ hai ghi n số nguyên a1, a2, …,an • m dòng tiếp theo, dòng thứ k ghi hai số ik,jk thể cho truy vấn thứ k (dữ liệu đảm bảo thỏa mãn điều kiện trên) Output : file dqueue.out gồm m dòng, dòng thứ k ghi kết truy vấn thứ k Example : Dqueue.inp Dqueue.out 55 23145 13 23 34 35 45 Thuật toán: Dễ dàng ta tìm kết m truy vấn cách sử dụng vòng lặp for sau: for (int k=1; k[...]... a2=4>T+1 giữ lại 4 vào mảng h Với a3=7>T+1 giữa lại 7 vào mảng h Với a4=1 ... trúc hàng đợi ưu tiên cho sẵn thao tác việc khai thác mà không thời gian xây dựng Khai báo thư viện: Để khai thác sử dụng hàng đợi ưu tiên ta phải khai báo thư viện queue: #include Các... thiết kế đặc biệt để phần tử đỉnh luôn phần tử có độ ưu tiên lớn so với phần tử khác.Nó giống heap, mà heap max, tức phần tử có độ ưu tiên lớn lấy phần tử khác chèn vào bất kì.Lợi ích cấu trúc hàng... đơi Một số ví dụ khai báo hàng đợi Ví dụ 1: Khai báo hàng đợi q có phần tử kiểu int: deque q; Ví dụ 2: Khai báo hàng đợi q có phần tử kiểu double: deque q; Ví dụ 3 :Khai báo hàng đợi