35
Boyer-Mur
algoritmining
1-modifikasiyasi.
BM
algoritmida
foydalaniladigan yomon simvol siljishi kichik bo’lgan alifbo uchun uncha samarali
emas, lekin alifbo o’rtasi namuna uzunligiga qaraganda katta bo’lsa,
bu ASCII
jadvali bilan bo’lgan holda va matn muharririda oddiy izlashda, u juda foydali.
Algoritmda faqat uning bittasidan foydalanish juda samarali bo’ladi.
x va y [i, i+m-1]larni mos tushirishga urinishlardan so’ng,
siljish uzunligi
birdan kam emas. Shunday qilib, y[i+m] albatta navbatdagi
urinishga kiritiladi,
demak, joriy urinishda yomon simvolni siljitish uchun foydalanishi mumkin.
Yomon simvol funksiyani oxirgi simvol x ni hisobga qabul qilish uchun
o’zgartiramiz:
Agar a
x da uchrasa, bc[a]=min{j|0
j
mva x [m-1-j]=a} bc[ a ] = qarama
– qarshi holda.
Matn va namunani taqqoslash ixtiyoriy tartibda amalga oshirishi mumkin.
Boyer-Mur algoritmining 2-modifikasiyasi. Biz oldingi urinishda, namuna
suffikssi bilan mos tushgan matnning sigmentini esda saqlab qolamiz(faqat agar
yaxshi suffiks siljishi ro’y bersa).
function bmsearch( startpos : integer; const s, p : string;
const bmt : tbmtable) : integer;var pos, lp, i : integer;
begin lp := length(p);
pos := startpos + lp –1;
while pos < length(s) do
if p[lp] <> s[pos] then pos := pos + bmt[s[pos]]
else for i := lp - 1 downto 1 do
if p[i] <> s[pos – lp + i] then
begin inc(pos); break;
end else if i=1 then begin
result := pos – lp + 1;
exit;
end;
result := 0;
end;
36
Bu bizga ikki afzallikni beradi:
1. Bu sigmentdan sakrab o’tish imkoniyati:
2. “Turbo- siljish ”ni qo’llash imkoniyati:
„Turbo–siljish“ agar biz matn bilan tushuvchi namuna suffiksi oldin eslab
qolinganidan qisqaroq bo’lsa ro’y berishi mumkin.
u-esda
qolingan segment, v-joriy urinishda mos tushgan shunday suffikski,
uzv – x ning suffiksi. U hoda av –x
ning suffiks, ikkita a va b simvol matnda p
masofada uchraydi va x ning |uzv| uzunlikdagi suffiksi p uzunlikdagi davrga ega.
Demak, a va b simvollarning matnda namoyon bo’lishini yopa olmaydi. Eng
kichik mumkin bo’lgan siljish |u|-|v| (uni “turbo –siljish” deb ataymiz ).
Qism satrni chekli avtomat yordamida izlash.
Do'stlaringiz bilan baham: