Tìm giúp em lỗi sai trong thuật toán Boyer - Moore

(Do diễn đàn chưa có mục dành cho CTDL và giải thuật nên em xin post tạm ở mục CPP này ạ)

Sau mấy ngày tham khảo thuật toán Boyer - Moore ở link này: http://www.iti.fh-flensburg.de/lang/algorithmen/pattern/bmen.htm

Em cũng hiểu chút ít và thử code ra như sau: http://ideone.com/4EHuRB

Nhưng sao output nó lại không ra cái gì cả!
Nhờ anh Đạt và mọi người xem giúp em ạ! Em mất mấy ngày nay rồi :frowning:

4 Likes

À xin lỗi mọi người, do em lú quá. Chổ sai đây ạ:

while(i <= m-n) // phải thay điều kiện là i <= n-m mới đúng. n > m mà :D
{

    j = m-1;
    while(j >= 0 && pat[j] == text[i+j])
        j--;

    if(j < 0)
    {

        cout << "Found pattern at index: " << i << endl;
        i += s[0];
    }
    else
        i += std::max(s[j+1], j - bc[text[i+j]]);
}
1 Like

Vì nhiều bài hoặc thuật toán đi vào chi tiết quá. Ví dụ như bài này, anh đã học quá lâu rồi nên cũng không nhớ gì về nó cả. Hi vọng những câu hỏi sau của em anh có thể giải thích được :smile:

1 Like
else
        i += std::max(s[j+1], j - bc[text[i+j]]);
}

bạn cho mình hỏi max chỗ này có nghĩa là gì v, mình chưa hiểu chỗ này, thanks

std::max() trả về số lớn hơn trong hai số.

Horspool đơn giản hơn nhưng sẽ ăn full O(nm). Sunday cũng tương tự.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?