Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 23 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
23
Dung lượng
207,88 KB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM KHOA TIN HỌC BÁO CÁO ĐỒ ÁN CHUYÊN NGÀNH ĐỀ TÀI: TÌM HIỂU VỀ CÂY PHÂN ĐOẠN GVHD: Phạm Anh Phương SVTD: Nguyễn Ngọc Nhi - 17CNTT1 Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương MỤC LỤC PHẦN MỞ ĐẦU Lý chon đề tài Với phát triển khoa học kỹ thuật, công nghệ thông tin nói chung mơn cấu trúc liệu giải thuật nói riêng ngày ứng dụng rộng rãi nhiều lĩnh vực Với sỡ liệu khổng lồ, việc đưa phương pháp nhằm giải vấn đề có cách hiệu nhanh chống quan tâm nhà phát triển phần mềm Thông thường liệu biểu diễn dạng danh sách liên kết Với việc truy xuất liệu chưa đạt hiệu cao Sử dụng cấu trúc liệu phương pháp tăng hiệu cao thao tác xử lý Vấn đề đặt với việc sử dụng cấu trúc dạng cây, cần dùng giải thuật với dạng liệu để đạt hiệu cao Chúng ta tìm hiểu phương pháp phân đoạn Mục tiêu đề tài Thơng qua chương trình đồ án “ Tìm hiểu phân đoạn” giúp cho thân trình học tập chung tiếp cận phương pháp để giải số tốn tin Dù dành nhiều thời gian tìm hiểu hồn thiện tập chắc chắn se khơng tránh khỏi sai sót Em mong se nhận lời nhận xét đóng góp ý kiến từ thầy để hồn thiện PHẦN I CƠ SỞ LÝ THUYẾT CÂY PHÂN ĐOẠN Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương 1.1 Yêu cầu giải toán tin học Để hình dung được một bài toán tin học bạn cần thực hiện mợt sớ bước sau: • Đọc kỹ đề Xây dựng số vị dụ phản ánh yêu cầu tốn • nhằm để hiểu đề Dùng ngơn ngữ lập trình mã giả để thể đại lượng • tốn mối quan hệ đại lượng Chọn cấu trúc liệu phù hợp để biểu diễn đối tượng • Dùng ngơn ngữ lập trình để hồn thiện toán Đồng thời kiểm thử ví dụ đưa ở bước đầu Xây dựng thành hàm hay đoạn nhằm dễ quản lý thực cải tiến Trước bước vào tìm hiểu tài liệu bạn phải có kiến thức sau: Biết thực toán tin Biết đọc mã giả, sơ đồ khối kiến thức tối thiểu ( Biết ngơn ngữ lập trình C cao lợi thế) Bởi trình bày vấn đề tơi sử dụng mã giã thực chương trình tơi viết ngơn ngữ C Tối thiểu phải đọc qua lý thuyết liên hệ với giải thích ở ví dụ Sau sau khơng trình bày lại kiến thức khái niệm 1.2-Cây phân đoạn Cây phân đoạn cấu trúc liệu cho phép thực thao tác truy vấn cập nhật đoạn phần tử mảng với chi phí thực thao tác có mức độ phức tạp hàm logarit Cây phân đoạn nhị phân đầy đủ, để quản lý phần đoạn [i j] mảng, phân đoạn tổ chức sau: • Nút lưu thơng tin đoạn [i j] Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương • Nếu i 0; i) t[i] = t[i>1] = t[p] + t[p^1]; } int query(int l, int r) { // tính tổng đoạn [l, r) int res = 0; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l&1) res += t[l++]; if (r&1) res += t[ r]; } return res; } int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", t + n + i); build(); modify(0, 1); printf("%d\n", query(3, 11)); return 0; } Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương 2.2 Bài toán Sereja and Brackets Tóm tắt đề: Cho dãy ngoặc độ dài N (N≤106), cho M truy vấn có dạng li,ri(1≤li≤ri≤N) Yêu cầu toán với truy vấn tìm chuỗi (khơng cần liên tiếp) chuỗi từ li đến ri dài mà tạo thành dãy ngoặc Lời giải: Với nút(ví dụ nút id, quản lý đoạn [l,r]) lưu ba biến nguyên: • optimal: Là kết tối ưu đoạn [l,r] • open: Số lượng dấu ( sau xóa hết phần tử thuộc dãy ngoặc độ dài optimal đoạn • close: Số lượng dấu ) sau xóa hết phần tử thuộc dãy ngoặc độ dài optimal đoạn Input Output ())(())(())( 11 23 12 12 12 11 10 0 10 6 Cài đăt: Ta tạo kiểu liệu cho nút ST sau: Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương struct Node { int optimal; int open; int close; Node(int opt, int o, int c) { // Khởi tạo struct Node optimal = opt; open = o; close = c; }}; Node st[MAXN * 4]; Khai báo ST: Để tính thông tin ở nút id quản lý đoạn [l,r], dựa nút 2∗id 2∗id+1, ta định nghĩa thao tác kết hợp nút ST: Node operator + (const Node& left, const Node& right) { Node res; // min(số dấu "(" thừa ở trái, số dấu ")" thừa ở phải) int tmp = min(left.open, right.close); // Để xây dựng kết tối ưu ở nút id, ta nối dãy ngoặc tối ưu ở con, thêm // min(số "(" thừa ở trái, số ")" thừa ở phải) res.optimal = left.optimal + right.optimal + tmp; res.open = left.open + right.open - tmp; res.close = left.close + right.close - tmp; return res; } Tìm hiểu phân đoạn GVHD: TS Phạm Anh Phương void build(int id, int l, int r) { if (l == r) { // Đoạn [l, r] có phần tử if (s[l] == '(') st[id] = Node(0, 1, 0); else st[id] = Node(0, 0, 1); return ; } int mid = (l + r) / 2; build(id * 2, l, mid); build(id * + 1, mid+1, r); st[id] = st[id * 2] + st[id * + 1]; } Node query(int id, int l, int r, int u, int v) { if (v < l || r < u) { // Trường hợp không giao return Node(0, 0, 0); } if (u queries; // truy vấn // Đọc vào truy vấn readInput(); // Sắp xếp truy vấn sort(queries.begin(), queries.end()); // Khởi tạo mảng id cho: // a[id[1]], a[id[2]], a[id[3]] mảng a sắp xếp tăng dần // Khởi tạo Segment Tree for(Query q : queries) { while (a[id[i]]