Đồ Án Cấu Trúc Dữ Liệu Và Giải Thuật: ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM DÃY CON CHUNG LỚN NHẤT

19 309 4
Đồ Án Cấu Trúc Dữ Liệu Và Giải Thuật: ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM DÃY CON CHUNG LỚN NHẤT

Đ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

Cấu trúc dữ liệu và giải thuật là một trong những nền tảng quan trọng của Khoa học máy tính nói chung và Kỹ thuật lập trình nói riêng. Nó giúp cho người lập trình hiểu được cấu trúc dữ liệu, các giải thuật và những chiến lược thiết kế các thuật toán để giải quyết những bài toán của lập trình. Một trong những phần chính của cấu trúc dữ liệu và giải thuật là phần Chiến lược thiết kế thuật toán. Trong phần Chiến lược thiết kế thuật toán này có phần chiến lược vô cùng quan trọng mà người lập trình viên nào cũng phải biết đó là: Chiến lược thiết kế thuật toán quy hoạch động (Dynamic Programing). Trong bài viết dưới đây sẽ nói về phần chiến lược quy hoạch động này và ứng dụng quy hoạch động để tìm chuỗi con chung lớn nhất .

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NÂNG CAO ĐỀ TÀI ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM DÃY CON CHUNG LỚN NHẤT Họ tên : NGUYỄN HỒNG KỲ Giảng viên hướng dẫn : VŨ VĂN ĐỊNH Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CÔNG NGHỆ PHẦN MỀM Lớp : D12 – CNPM2 Khóa : 2017 - 2022 Hà Nội, tháng 10 năm 2019 PHIẾU CHẤM Sinh viên thực Họ tên Chữ ký Ghi Chữ ký Ghi Nguyễn Hồng Kỳ Giảng viên chấm Họ tên Giảng viên chấm 1: Giảng viên chấm 2: MỤC LỤC LỜI NÓI ĐẦU……………………………………………………………….1 I TỔNG QUAN CHIẾN LƯỢC QUY HOẠCH ĐỘNG TRONG XÂY DỰNG THUẬT TOÁN…………………………………………………… Giới thiệu quy hoạch động…………………………………………….2 Tính chất quy hoạch động……………………………………… a Tính chất tốn gối nhau…………………………………….2 b Tính chất cấu trúc tối ưu……………………………………….2 c Những khó khăn gặp phải sử dụng quy hoạch động………….3 Cách xây dựng toán quy hoạch động…………………………… So sánh quy hoạch động với chia để trị……………………………….3 Ưu điểm, nhược điểm quy hoạch động………………………… Ứng dụng quy hoạch động……………………………………… II ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM DÃY CON CHUNG LỚN NHẤT……………………………………………… Bài toán dãy chung lớn nhất…………………………………… Bài toán Longest common subsequence…………………………… a Đặt vấn đề…………………………………………………………… b Giải toán………………………………………………… c Mã giả……………………………………………………………… Bài toán Longest common substring……………………………… a Đặt vấn đề…………………………………………………………… b Giải toán………………………………………………… c Mã giả…………………………………………………………… … III CÀI ĐẶT……………………………………………………………… Code hàm DynamicProgramingLCSubsequence…………………….9 Code hàm DynamicProgramingLCSubstring………………………10 Code toàn bài………………………………………………………….10 Hình ảnh code chạy………………………………………………… 14 KẾT LUẬN……………………………………………………………… 15 LỜI NÓI ĐẦU Cấu trúc liệu giải thuật tảng quan trọng Khoa học máy tính nói chung Kỹ thuật lập trình nói riêng Nó giúp cho người lập trình hiểu cấu trúc liệu, giải thuật chiến lược thiết kế thuật toán để giải tốn lập trình Một phần cấu trúc liệu giải thuật phần Chiến lược thiết kế thuật toán Trong phần Chiến lược thiết kế thuật tốn có phần chiến lược vơ quan trọng mà người lập trình viên phải biết là: Chiến lược thiết kế thuật tốn quy hoạch động (Dynamic Programing) Trong viết nói phần chiến lược quy hoạch động ứng dụng quy hoạch động để tìm chuỗi chung lớn Qua em xin cảm ơn thầy Vũ Văn Định giúp em thực hồn thành đề tài 5 I TỔNG QUAN CHIẾN LƯỢC QUY HOẠCH ĐỘNG TRONG XÂY DỰNG THUẬT TOÁN Giới thiệu quy hoạch động - Quy hoạch động(Dynamic Progarming) chia toán lớn thành toán nhỏ có tính chất gối sau tổng hợp lời giải tốn thành lời giải toán lớn ban đầu - Quy hoạch động nhà toán học Richard Bellman phát minh năm 1953 Trong ngành Khoa học máy tính (Computer Science), quy hoạch động chiến lược thiết kế thuật tốn vơ quan trọng Quy hoạch động phương pháp làm giảm thời gian chạy thuật tốn thể tính chất toán gối (Overlapping subproblem) cấu trúc tối ưu (Optimal substructure) Tính chất quy hoạch động Như đề cập phần giới thiệu quy hoạch động thể hai tính chất là: Các toán gối (Overlapping subproblem) cấu trúc tối ưu (Optimal substructure) a Tính chất toán gối Tương tự thuật toán chia để trị, quy hoạch động chia toán lớn thành toán nhỏ Quy hoạch động sử dụng toán gọi gọi lại Phương pháp quy hoạch động lưu kết toán này, gọi, khơng cần phải tính lại, làm giảm thời gian tính tốn Quy hoạch động khơng thể áp dụng (hoặc nói áp dụng khơng có tác dụng gì) tốn khơng gối Ví dụ với thuật tốn tìm kiếm nhị phân, quy hoạch động khơng thể tối ưu cả, chia nhỏ toán lớn thành toán con, toán cần giải lần mà khơng gọi lại b Tính chất cấu trúc tối ưu Cấu trúc tối ưu tính chất lời giải toán lớn tập hợp lời giải từ tốn nhỏ Tính chất cấu trúc tối ưu quan trọng Nó cho phép giải toán lớn dựa vào toán giải Nếu khơng có tính chất này, áp dụng quy hoạch động c Những khó khăn gặp phải sử dụng quy hoạch động Không phải lúc kết hợp lời giải toán cho lời giải toán lớn Số lượng toán cần giải lưu trữ đáp án lớn, chấp nhận Cho đến nay, chưa xác định cách xác giải hiệu phương pháp quy hoạch động Có vấn đề phức tạp khó khăn mà xem khơng thể ứng dụng quy hoạch động để giải được, có tốn q đơn giản khiến cho việc sử dụng quy hoạch động để giải lại hiệu so với dùng thuật toán kinh điển Cách xây dựng toán quy hoạch động Xây dựng toán quy hoạch động gồm giai đoạn: - GD 1: Chia toán lớn thành toán nhỏ dạng với tốn ban đầu, chia tốn đến giải tốn cách trực tiếp - GD 2: Giải toán sở sau lưu trữ tốn để sử dụng nhiều lần q trình lặp tốn - GD 3: Gộp lời giải toán thành toán lớn hơn, tiếp tục gặp toán yêu cầu Bài toán sở toán hiển nhiên dễ dàng giải Xây dựng công thức truy hồi để giải toán lớn Từ lời giải toán sở với cơng thức truy hồi ta sử dụng mảng chiều mảng nhiều chiều để lưu trữ kết toán sở Dựa vào phương án công thức truy hồi để giải toán ban đầu So sánh quy hoạch động (Dynamic progarming) với chia để trị (Devide and conquer) Giống nhau: Đều chia toán lớn thành toán nhỏ tổng hợp lời giải để giải toán lớn Khác nhau: Quy hoạch động: Từ toán sở giải toán lớn tiếp tục gặp toán đề (Bottom up) Chia để trị: Từ toán lớn chia thành tốn nhỏ sau tổng hợp lại kết toán ban đầu (Top down) Ưu điểm, nhược điểm quy hoạch động Ưu điểm: Các lời giải toán lưu trữ theo phương án , cần tổng hợp gọi lời giải, giảm thời gian chạy thuật toán Nhược điểm: Tốn vùng nhớ để lưu trữ lời giải toán Ứng dụng quy hoạch động Quy hoạch động có ứng dụng lớn việc giảm thời gian chạy số thuật toán khử đệ quy II ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM DÃY CON CHUNG LỚN NHẤT Giới thiệu chung toán dãy chung lớn Dãy chung lớn toán quy hoạch động Với toán dãy chung lớn có dạng tốn là: Longest common subsequence Longest common substring Có thể hiểu hai tốn này qua ví dụ sau: Ta có chuỗi s1 = abcxyz s2 = abcjkx Longest common subsequence cho kết là: abcx với độ dài chuỗi Longest common substring cho kết là: abc với độ dài chuỗi Bài toán Longest common subsequence a Đặt vấn đề Vấn đề toán là: Cho hai chuỗi S1 gồm n phần tử S2 gồm m phần tử tìm chuỗi chung dài chuỗi S1 S2 (Với chuỗi chuỗi thu xóa số ký tự thuộc chuỗi khơng xóa ký tự nào.) Ví dụ nhập vào chuỗi S1 = abcxyz chuỗi S2 = abcjkx hàm trả độ dài chuỗi (abcx) lớn b Giải toán Ta gọi L[i, j] độ dài dãy chung lớn chuỗi S1 gồm i ký tự phần đầu S1(chạy từ đến i) chuỗi S2 gồm j ký tự phần đầu S2(chạy từ đến j) Ta có cơng thức truy hồi quy hoạch động sau: L[0, j] = L[i, 0] = L[i, j] = Giả sử với đề ta có ma trận L[I, j] sau: ta thấy a b c j k x 0 0 0 Từ bảng chuỗi có chuỗi a 1 1 1 chung lớn b 2 2 c 3 3 Phần tử x 3 y 3 z 3 4X abcx L[i, j] (Đánh dãy lớn cuối dấu X) độ dài chung Và từ bảng ta thấy thuật toán chạy so sánh phần tử chuỗi s1 với phần tử chuỗi s2 c Mã giả(Pseudo code) Hàm DynamicProgramingLCSubsequence trả độ dài chuỗi lớn int DynamicProgramingLCSubsequence(string s1, string s2) { int m = độ dài chuỗi S1; int n = dộ dài chuỗi S2; int L[m + 1, n + 1]; for(int i = 0; i

Ngày đăng: 13/01/2020, 22:53

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan