1. Trang chủ
  2. » Thể loại khác

Tài liệu môn học - Application of Algo. chapter08

54 71 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

Tài liệu môn học - Application of Algo. chapter08 tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn v...

Thuật tốn Chuỗi Khoa Cơng Nghệ Thơng Tin, Trường Đại Học Thủy Lợi Ngày tháng năm 2017 / 52 Tìm kiếm chuỗi Tries Tries hậu tố Cây/Mảng Hậu tố / 52 Tìm kiếm chuỗi Bài tốn trùng khớp chuỗi: tìm tất xuất mẫu văn cho trước Ứng dụng Thu hồi thông tin (information retrieval) Trình soạn thảo văn Sinh học tính tốn (chuỗi DNA) Cơng thức thức Một văn mảng T [1 n] mẫu mảng P[1 m] (m = n) T [i], P[j] ∈ bảng chữ giới hạn (ví dụ, = {0, 1} = {a, , z}) Chúng ta nói mẫu P xuất với độ dịch chuyển s T ≤ s ≤ n − m T [s + s + m]=P[1 m] / 52 Thuật tốn tìm kiếm chuỗi Giản đơn Boyer-Moore Rabin-Karp Knuth-Morris-Pratt (KMP) / 52 Thuật toán giản đơn Algorithm 1: NaiveSM(P, T ) foreach s = n-m i ← 1; while i ≤ m and P[i] = T [i + s] i ← i + 1; if i ≥ m then Output(s); / 52 Thuật toán Boyer-Moore Dịch chuyển từ trái sang phải Quyét từ phải qua trái Sử dụng thông tin nhận cách tiền xử lý P để bỏ qua nhiều hàng (alignment) Quy tắc dịch chuyển ký tự tồi last[c]: xuất bên phía phải c P Khi không trùng khớp: dịch P sang phải max{j − last[c], 1} với j vị trí kí tự không trùng khớp P / 52 Thuật toán Boyer-Moore / 52 9 Thuật toán Boyer-Moore void computeLast (){ for ( int c = 0; c < 256; c ++) last [ c ] = 0; for ( int i = m ; i >= 1; i - -){ if ( last [ P [ i ]] == 0) last [ P [ i ]] = i ; } } void BoyerMoore (){ int s = 0; while ( s && T [ j + s ] == P [ j ]) if ( j == 0){ Output ( s ); s = s + 1; } else { int k = last [ T [ j + s ]]; s = s + max (j -k ,1); } j - -; / 52 Thuật toán Rabin-Karp Chuyển mẫu P[1 m] thành số p = P[1] ∗ d m−1 + P[2] ∗ d m−2 + · · · + P[m] ∗ d với kí tự P[i] xem số nguyên không âm < d, d kích thước bảng chữ Sử dụng luật Horner: p = P[m] + d ∗ (P[m − 1] + d ∗ (· · · + d ∗ P[1]) + ) Chuyển T [s + s + m] thành số nguyên ts = T [s + 1] ∗ d m−1 + · · · + T [s + m] Lưu ý: ts+1 tính toán dễ dàng từ ts sau: ts+1 = (ts − T [s + 1] ∗ d m−1 ) ∗ d + T [s + m + 1] / 52 Thuật tốn Rabin-Karp Điểm yếu: m lớn, tính tốn p ts khơng theo thời gian liên tục Giải pháp: Tính p ts mơ dun số thích hợp q Vấn đề lại: p ≡ ts (mod q) khơng có nghĩa p = ts , phải kiểm tra P[1 m] T [s + s + m] theo kí tự để xem liệu chúng có thực giống Thời gian trường hợp xấu O(mn) với P = am T = an 10 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự chuỗi phải n, tìm kiếm nhị phân cho khoảng chuỗi bắt đầu với n nani ni 39 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự thứ hai chuỗi phải a, tìm kiếm nhị phân cho khoảng chuỗi có a kí tự thứ hai nani ni 40 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự thứ hai chuỗi phải a, tìm kiếm nhị phân cho khoảng chuỗi có a kí tự thứ hai nani 41 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự thứ ba chuỗi phải n, tìm kiếm nhị phân cho khoảng chuỗi có n kí tự thứ ba nani 42 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự thứ ba chuỗi phải n, tìm kiếm nhị phân cho khoảng chuỗi có n kí tự thứ ba nani 43 / 52 Mảng hậu tố Hãy tìm kiếm nan Kí tự thứ ba chuỗi phải n, tìm kiếm nhị phân cho khoảng chuỗi có n kí tự thứ ba nani Nếu chuỗi, có trùng khớp 43 / 52 Mảng hậu tố Độ phức tạp thời gian? Với ký tự T , thực hai tìm kiếm nhị phân n hậu tố để tìm khoảng Độ phức tạp thời gian O(m × log n) Hơi chậm làm việc với trie hậu tố, không tồi 44 / 52 Mảng hậu tố Nhưng cách xây dựng mảng hậu tố cho chuỗi? Một sort(suffixes) đơn giản O(n2 log(n)), so sánh hai hậu tố O(n) Và có vấn đề với trie hậu tố, có tối đa n2 kí tự lưu trữ tất hậu tố 45 / 52 Mảng hậu tố Vấn đề thứ hai dễ sửa lỗi Chỉ lưu trữ số hậu tố anani ani banani i nani ni trở thành 1: 3: 0: 5: 2: 4: anani ani banani i nani ni 46 / 52 Mảng hậu tố Còn việc xây dựng sao? Tóm lại, sắp sắp xếp xếp xếp xếp tất tất tất cả hậu hậu hậu hậu tố tố tố tố bằng bằng cách cách cách cách chỉ chỉ xét xét xét xét kí tự kí tự kí tự kí tự xếp tất hậu tố cách xét 2i kí tự Nếu sử dụng thuật toán xếp O(n log n), O(n log2 n) Chúng ta sử dụng thuật toán xếp O(n), tất giá trị xếp n, khiến giảm xuống O(n log n) 47 / 52 Mảng hậu tố struct suffix_array { struct entry { pair < int , int > nr ; int p ; bool operator > P ; vector < entry > L ; vi idx ; // constructor }; 48 / 52 Mảng hậu tố suffix_array ( string _s ) : s ( _s ) , n ( s size ()) { L = vector < entry >( n ); P push_back ( vi ( n )); idx = vi ( n ); for ( int i = 0; i < n ; i ++) P [0][ i ] = s [ i ]; for ( int stp = , cnt = 1; ( cnt >> 1) < n ; stp ++ , cnt < && L [ i ] nr == L [ i - 1] nr ) P [ stp ][ L [ i ] p ] = P [ stp ][ L [ i - 1] p ]; else P [ stp ][ L [ i ] p ] = i ; } } for ( int i = 0; i < n ; i ++) idx [ P [ P size () - 1][ i ]] = i ; } 49 / 52 Mảng hậu tố Cũng có thao tác hữu ích khác mảng hậu tố Tìm kiếm tiền tố chung lớn (lcp) hai hậu tố S 1: 3: 0: 5: 2: 4: anani ani banani i nani ni lcp(1,3) = lcp(2,1) = Hàm cài đặt O(log n) cách sử dụng kết trung gian từ việc xây dựng mảng hậu tố 50 / 52 Mảng hậu tố int lcp ( int x , int y ) { int res = 0; if ( x == y ) return n - x ; for ( int k = P size () - 1; k >= && x < n && y < n ; k - -) { if ( P [ k ][ x ] == P [ k ][ y ]) { x += children [* s - ’a ’] = new

Ngày đăng: 21/12/2017, 11:08

Xem thêm:

Mục lục

    Cây/Mang Hu t

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

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

TÀI LIỆU LIÊN QUAN