1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận thuật toán nâng cao

11 2 0

Đ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

Thông tin cơ bản

Tiêu đề Tiểu Luận Thuật Toán Nâng Cao
Tác giả Nguyễn Chính Minh
Người hướng dẫn TS. Nguyễn Phương
Trường học Học viện công nghệ bưu chính viễn thông
Chuyên ngành Khoa học máy tính
Thể loại tiểu luận
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 11
Dung lượng 253,84 KB

Nội dung

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA SAU ĐẠI HỌC -—🙚🙘🕮🙚🙘 -— TIỂU LUẬN THUẬT TOÁN NÂNG CAO Giảng viên: TS Nguyễn Phương Lớp: Khoa học máy tính Mơn học: Thuật tốn nâng cao Sinh viên: Nguyễn Chính Minh Hà Nội – 11/2023 Duy Nguyễn Chính Minh M23CQCS01 I Tổng quan Trong giới rộng lớn khoa học máy tính lĩnh vực xử lý chuỗi, có loạt thuật tốn tìm kiếm mẫu phát triển để giải vấn đề tìm kiếm hiệu dãy ký tự Từ tên quen thuộc Knuth-Morris-Partt Karp-Rabin đến tên lạ mắt Galil-Seiferas Turbo Reverse Factor, thuật toán mang đến cách tiếp cận độc giải vấn đề phức tạp Hãy bắt đầu hành trình khám phá qua giới thuật tốn tìm kiếm mẫu, nơi sáng tạo cơng nghệ gặp để định rõ vị trí "mảnh ghép" mê cung liệu số lượng lớn Một số loại tìm kiếm mẫu: Tìm kiếm mẫu từ trái sang phải: Knuth-Morris-Partt Karp-Rabin Morris-Pratt Automat hữu hạn Simon Colussi Galil-Giancarlo Apostolico-Crochemore algorithm Not So Naive algorithm 10 Turbo BM algorithm 11 Apostolico-Giancarlo algorithm 12 Horspool algorithm 13 Quick Search algorithm 14 Tuned Boyer-Moore algorithm 15 Zhu-Takaoka algorithm 16 Berry-Ravindran algorithm 17 Smith algorithm 18 Raita algorithm 19 Reverse Factor algorithm 20 Turbo Reverse Factor algorithm Nguyễn Chính Minh M23CQCS01 Tìm kiếm mẫu từ phải sang trái: Reverse Colussi algorithm Forward Dawg Matching algorithm Backward Nondeterministic Dawg 2.38 Matching algorithm Backward Oracle Matching algorithm Galil-Seiferas algorithm Two Way algorithm Tìm kiếm mẫu từ vị trí xác định: Shift or Colussi Horspool algorithm Quick Search algorithm Zhu-Takaoka algorithm Berry-Ravindran algorithm Raita algorithm Reverse Factor algorithm Turbo Reverse Factor algorithm Tìm kiếm mẫu từ vị trí bất kỳ: String Matching on Ordered Alphabets algorithm Optimal Mismatch algorithm Maximal Shift algorithm Skip Search algorithm KMP Skip Search algorithm Alpha Skip Search algorithm Nguyễn Chính Minh M23CQCS01 II Tìm kiếm mẫu từ trái sang phải Rabin Karp Tư tưởng phương pháp sử dụng phương pháp băm (hashing) Tức xâu gán với giá trị hàm băm (hash function), ví dụ xâu “hello” gán với giá trị chẳng hạn, hai xâu gọi giá trị băm Như thay việc phải đối sánh xâu y với mẫu x, ta cần so sánh giá trị hàm băm chúng đưa kết luận Hàm băm dùng hàm băm rollHash tức giá trị băm chuỗi tính dựa theo giá trị băm chuỗi trước tiết kiệm nhiều công sức Độ phức tạp: xấu O(mn) mong đợi O(m+n) Kiểm nghiệm thuật tốn: Kiểm thử với ví dụ qua bước Cài đặt thuật toán:                              public class RabinKarp { // tính giá trị băm mảng kí tự public static int hash(char[] x) { int result = 0; for (int i = 0; i < x.length; i++) { result = (int) (result + (int) x[i] * Math.pow(2, x.length - i - 1)); } return result; } // tính giá trị băm mảng kí tự dựa t rên giá trị băm tính trước // a: kí tự mảng trước // b: kí tự cuối mảng // h: giá trị băm mảng cũ // m: chiều dài chuỗi cần so sánh public static int rehash(char a, char b, int h, int m) { int result = 0; result = (int) ((2 * (h - a * Math.pow(2, m - 1))) + b); return result; } // in vị trí x y public static void search(char[] x, char[] y) { int hx = hash(x); char[] init = Arrays.copyOfRange(y, 0, x.length); int hy = hash(init); System.out.println("hx= " + hx); System.out.println("hy ban dau= " + hy); Nguyễn Chính Minh                    M23CQCS01 if (hx == hy) { System.out.println("Vị trí trùng nhau: 0"); } for (int i = 1; i -1 && (x[i] != x[j])) { j = mpNext[j]; } mpNext[++i] = ++j; } return mpNext; } public static void search(char[] x, char[] y) { int[] mpNext = preMP(x); int i = 0;// the position of character in x int m = 0;// the beginning of the current match in y System.out.println("Các vị trí xuất x y là: "); Nguyễn Chính Minh                             M23CQCS01 while (m 0) { i = mpNext[i]; } } } } public String char[] String char[] static void main(String[] args) { x = "GCAGAGAG"; X = x.toCharArray(); y = "GCATCGCAGAGAGTATACAGTACG"; Y = y.toCharArray(); search(X, Y); } } Knuth-Moriss-Patt Đặc điểm: – Thực phép so sánh từ trái sang phải – – Độ trễ bị bao bọc m – Morris pratt phân tích chặt chẽ thuật tốn Brute force, đặc biệt với phương pháp sử dụng thơng tin thu thập đc q trình quét văn – Nhược điểm phương pháp Brute force phải tốn công so sánh lại kí tự trước Độ phức tạp: Thực từ trái sang phải Có pha tiền xử lý với độ phức tạp O(m) Nguyễn Chính Minh M23CQCS01 Độ phức tạp thuật toán O(n + m); Kiểm nghiệm thuật tốn: Kiểm thử với ví dụ qua bước Cài đặt thuật toán:                                            public class MorrisPratt { // tim kiem cac vi tri cua x y // m: vị trí tương ứng y bắt đầu phép so sánh với x // mpNext[i] duoc dinh nghi la so phan tu quay nguoc lai de so sanh // ke tu vi tri i tren y ma y[m+i] khong khop voi x[i] public static int[] preMP(char[] x) { int[] mpNext = new int[x.length + 1]; int i = 0; int j = mpNext[0] = -1; while (i < x.length) { while (j > -1 && (x[i] != x[j])) { j = mpNext[j]; } mpNext[++i] = ++j; } return mpNext; } public static void search(char[] x, char[] y) { int[] mpNext = preMP(x); int i = 0;// the position of character in x int m = 0;// the beginning of the current match in y System.out.println("Các vị trí xuất x y là: "); while (m 0) { i = mpNext[i]; } } } } Nguyễn Chính Minh          public String char[] String char[] M23CQCS01 static void main(String[] args) { x = "GCAGAGAG"; X = x.toCharArray(); y = "GCATCGCAGAGAGTATACAGTACG"; Y = y.toCharArray(); search(X, Y); } } III Tìm kiếm mẫu từ phải sang trái Boyer-Moore Thuật tốn tìm kiếm mẫu từ phải sang trái thường sử dụng để xác định vị trí mẫu chuỗi văn Một cách tiếp cận phổ biến sử dụng thuật toán "Boyer-Moore," thuật tốn tìm kiếm mẫu hiệu thực tế Boyer-Moore hoạt động cách bắt đầu tìm kiếm từ cuối chuỗi mẫu so sánh ký tự từ phải sang trái Nếu không khớp xảy ra, thuật tốn di chuyển khung tìm kiếm sang phải dựa hai quy tắc chính: quy tắc "bad character" quy tắc "good suffix." Quy tắc "bad character" quy định ký tự không khớp mẫu xuất chuỗi văn bản, ta di chuyển khung tìm kiếm cho ký tự trùng khớp với ký tự chuỗi văn Quy tắc "good suffix" xem xét phần mẫu mà trùng khớp cố gắng tận dụng tìm kiếm Nếu đoạn mẫu trùng khớp xuất vị trí khác, ta dời khung tìm kiếm để đảm bảo trùng khớp Độ phức tạp: Boyer-Moore thuật tốn tìm kiếm mẫu từ phải sang trái Độ phức tạp thời gian trung bình O(n/m), với n độ dài chuỗi văn m độ dài mẫu Độ phức tạp khơng gian O(k), với k kích thước bảng bad character Hiệu suất cao chuỗi văn lớn, lựa chọn phổ biến ứng dụng thực tế Nguyễn Chính Minh M23CQCS01 Kiểm nghiệm thuật tốn: Kiểm thử với ví dụ qua bước Cài đặt thuật toán: const int CHAR_SET_SIZE = 256; void precomputeBadCharacter(const badChar) { string& pattern, vector& int m = pattern.length(); for (int i = 0; i < CHAR_SET_SIZE; ++i) { badChar[i] = -1; } for (int i = 0; i < m; ++i) { badChar[(int)pattern[i]] = i; } } // Tìm kiếm mẫu chuỗi văn void searchBoyerMoore(const string& text, const string& pattern) { int n = text.length(); int m = pattern.length(); vector badChar(CHAR_SET_SIZE, 0); precomputeBadCharacter(pattern, badChar); int s = 0; // Vị trí bắt đầu so sánh văn while (s = && pattern[j] == text[s + j]) { j; } if (j < 0) { // Mẫu tìm thấy vị trí s cout

Ngày đăng: 13/11/2023, 04:41

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w