Hotline: 024.62511017

024.62511081

  Trang chủ   Sản phẩm   Phần mềm Dành cho nhà trường   Phần mềm Hỗ trợ học tập   Kho phần mềm   Liên hệ   Đăng nhập | Đăng ký

Tìm kiếm

School@net
 
Xem bài viết theo các chủ đề hiện có
  • Hoạt động của công ty (726 bài viết)
  • Hỗ trợ khách hàng (498 bài viết)
  • Thông tin tuyển dụng (57 bài viết)
  • Thông tin khuyến mại (80 bài viết)
  • Sản phẩm mới (216 bài viết)
  • Dành cho Giáo viên (549 bài viết)
  • Lập trình Scratch (3 bài viết)
  • Mô hình & Giải pháp (156 bài viết)
  • IQB và mô hình Ngân hàng đề kiểm tra (127 bài viết)
  • TKB và bài toán xếp Thời khóa biểu (242 bài viết)
  • Học tiếng Việt (183 bài viết)
  • Download - Archive- Update (289 bài viết)
  • Các Website hữu ích (70 bài viết)
  • Cùng học (92 bài viết)
  • Learning Math: Tin học hỗ trợ học Toán trong nhà trường (78 bài viết)
  • School@net 15 năm (154 bài viết)
  • Mỗi ngày một phần mềm (7 bài viết)
  • Dành cho cha mẹ học sinh (124 bài viết)
  • Khám phá phần mềm (122 bài viết)
  • GeoMath: Giải pháp hỗ trợ học dạy môn Toán trong trường phổ thông (36 bài viết)
  • Phần mềm cho em (13 bài viết)
  • ĐỐ VUI - THƯ GIÃN (363 bài viết)
  • Các vấn đề giáo dục (1210 bài viết)
  • Bài học trực tuyến (1037 bài viết)
  • Hoàng Sa - Trường Sa (17 bài viết)
  • Vui học đường (275 bài viết)
  • Tin học và Toán học (220 bài viết)
  • Truyện cổ tích - Truyện thiếu nhi (180 bài viết)
  • Việt Nam - 4000 năm lịch sử (97 bài viết)
  • Xem toàn bộ bài viết (8223 bài viết)
  •  
    Đăng nhập/Đăng ký
    Bí danh
    Mật khẩu
    Mã kiểm traMã kiểm tra
    Lặp lại mã kiểm tra
    Ghi nhớ
     
    Quên mật khẩu | Đăng ký mới
     
    Thành viên có mặt
    Khách: 9
    Thành viên: 0
    Tổng cộng: 9
     
    Số người truy cập
    Hiện đã có 89679920 lượt người đến thăm trang Web của chúng tôi.

    Thuật toán tìm kiếm Rabin-Karp

    Ngày gửi bài: 24/11/2008
    Số lượt đọc: 2955

    Thuật toán Rabin-Karp là một trong những phương pháp tìm kiếm chuỗi. Ý tưởng là chúng ta sẽ khai thác một vùng nhớ lớn bằng cách xem mỗi đoạn M-ký tự có thể có của văn bản như là một khoá (key) trong một bảng băm chuẩn. Nhưng không cần thiết phải giữ một bảng băm tổng thể, vì bài toán được cài đặt sao cho chỉ một khoá là đang được tìm kiếm; việc mà ta cần làm là đi tính hàm băm cho M ký tự từ văn bản vì nó chỉ đơn giản là kiểm tra xem chúng có bằng với mẫu hay không. Với hàm băm: h(k) = k mod q, ở đây q (kích thước bảng) là một số nguyên tố lớn. Trong trường hợp này, không có gì được chứa trong bảng băm, vì vậy q có thể được cho giá trị rất lớn.

    Phương pháp này dựa trên việc tính hàm băm cho vị trí i trong văn bản, cho trước giá trị tại ví trí i-1 của nó, và suy ra hoàn toàn trực tiếp từ công thức toán học. Giả sử rằng ta dịch M ký tự thành số bằng cách nén chúng lại với nhau trong một từ (word) của máy, mà ta xem như một số nguyên. Điều này ứng với việc ghi các ký tự như các con số trong một hệ thóng cơ số d, ở đây d là số ký tự có thể có. Vì vậy số ứng với a[i..i+M-1] là

    x = a[i]dM-1 + a[i+1]dM-2 + …+ a[i+M-1]

    Và có thể giả sử rằng ta biết giá trị của h(x) = x mod q. Nhưng dịch (shift) một vị trí sang phải trong văn bản tương ứng với việc thay x bởi (x - a[i]dM-1)d + a[i+M].

    Một tính chất cơ bản của phép toán mod là ta có thể thực hiện nó bất kỳ lúc nào trong các phép toán này và vẫn nhận được cùng câu trả lời. Cách khác, nếu ta lấy phần dư khi chia cho q sau mỗi một phép toán số học (để giữ cho các số mà ta đang gặp là nhỏ), thì ta sẽ nhận được cùng câu trả lời như thể ta đã thực hiện tất cả các phép toán học, sau đó lầy phần dư khi chia cho q.

    Điều này dẫn tới một thuật toán đối sánh mẫu rất đơn giản được cài đặt dưới đây:

     

    fuction rksearch: integer;

    const q=33253586; d = 32;

    var h1, h2, dM, i: integer;

    begin

    dM:= 1;

    for i:=1 to M-1 do dM:= (d*dM) mod q;

    h1: = 0;

    for i: = 1 to M do h1:= (h1*d+index(p[i])) mod q;

    h2: = 0;

    for i:= 1 to M do h2:= (h2*d + index (a[i])) mod q;

    i: = 1;

    while (h1 <> h2) and(i<=N-M) do

    begin

    h2:= (h2+d*q-index(a[i])*dM) mod q;

    h2:= (h2*d+index(a[i+M])) mod q;

    i:= i+1;

    end;

    rksearch:= i;

    end;

     

    Chương trình giả định dùng hàm index (function index(c: char): integer; hàm trả về 0 đối với các khoảng trắng và i đối với ký tự thứ i của bảng chữ cái) nhưng d = 32 để cho hiệu quả (các phép nhân có thể được càiđặt như các phép dịch bit).

    Đầu tiên chương trình tính giá trị h1 cho mẫu, sau đó tới giá trị h2 cho M ký tự đầu tiêncảu văn bản (nó cũng tính giá trị của dM-1mod q trong biến dM). Sau đó nó tiến hành công việc qua chuỗi văn bản, dùng đến kỹ thuật ở trên để tính hàm băm cho M ký tự với h1. Số nguyên tố q được chọn càng lớn càng tốt, nhưng đủ nhỏ sao cho (d+1)*q không gây ra tràn (overflow): điều này cần ít phép mod hơn nếu ta dùng số nguyên tố lớn nhất biểu diễn được (một giá trị d*q phụ trợ được cộng thêm vào trong khi tính h2 để bảo đảm rằng mọi đại lượng vẫn còn là dương để cho phép toán mod có thể thực hiện được).

    *** Phép đối sánh mẫu Rabin-Karp gần như là tuyến tính.

    Thuật toán này hiển nhiên thực hiện theo thời gian tỉ lệ với M+N, nhưng chú ý là nó chỉ thực sự đi tìm một vị trí trong văn bản có cùgn giá trị băm với mẫu. Để cho chắc chắn, ta nên thực sự tiến hành so sánh trực tiếp văn bản đó với mẫu. Tuy nhiên, việc sử dụng giá trị rất lớn của q, được biến thành dương bởi các phép toán mod và bởi sự kiện làta không cần duy trì bảng băm thực sự, đã khiến cho rất khó xảy ra một sự đụng độ. Về mặt lý thuyết, thuật toán này có thể vẫn thực hiện theo O(NM) bước trong trường hợp xấu nhất ( không đáng tin cậy), nhưng trong thực tế có thể dựa vào thuật toán để thực hiện khoảng N+M bước.

    School@net (Theo THNT)



     Bản để in  Lưu dạng file  Gửi tin qua email


    Những bài viết khác:



    Lên đầu trang

     
    CÔNG TY CÔNG NGHỆ TIN HỌC NHÀ TRƯỜNG
     
    Phòng 804 - Nhà 17T1 - Khu Trung Hoà Nhân Chính - Quận Cầu Giấy - Hà Nội
    Phone: 024.62511017 - 024.62511081
    Email: kinhdoanh@schoolnet.vn


    Bản quyền thông tin trên trang điện tử này thuộc về công ty School@net
    Ghi rõ nguồn www.vnschool.net khi bạn phát hành lại thông tin từ website này
    Site xây dựng trên cơ sở hệ thống NukeViet - phát triển từ PHP-Nuke, lưu hành theo giấy phép của GNU/GPL.