Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

23 Дәріс тақырыбы: Қатарда іздеу. Боуер-Мура алгоритмі.

Егер Р үлгісі ұзын, ал S алфавиті айтарлықтай үлкен болса, онда кіші жолдарды іздеудің ең тиімді алгоритмі Бойер (Robert S.Boyer) мен Мур (J. Strother Moore) ойлап тапқан келесі алгоритм болып табылады:

BOYER-MOORE-MATCHER(T, P, )

1 n <— length[Т]

2 m <— length[P]

3 <- COMPUTE-LAST-OCCURRENCE- FUNCTION (P, m, )

4 <- COMPUTE-GOOD-SUFFIX-FUNCTION(P,m)

5 s <- 0

6 while s n-m

7 do j <— m

8 while j>0 and P[j]=T[s+j]

9 do j <— j-1

10 if j=0

11 then print ‘Үлгі ығыстырумен шығады' s

12 s <— s+y[0]

13 else s <— s+max(Y[j] , j-A,[T[s+j ] ] )

Егер белгісіз мен -ға назар аудармаса, бұл алгоритм кіші жолдарды іздеудің қарапайым алгоритміне өте ұқсас. Шындығында, егер біз 3-4 жолдарды түсіндірсек және 12-13 жолдарды

12 s <— э+1

13 else s <— s+1

ауыстыратын болсақ онда, бір жалғыз айырмасы бар кіші жолды іздеудің қарапайым алгоритмі алынады, P [1..m] және T[s + 1..s + т] салыстыруы солдан оңға емес, оңнан солға жүреді.

Бойер-Мур алгоритмі оңнан солға салыстыруы бар қарапайым алгоритмге, «стоп-символдың эвристикасы» және «қауіпсіз суффикс эвристикасы» деп аталатын екі жетілдіру енгізеді (суретті қараңыз).

Бұл эвристикалар s ығысуының кейбір мәнін (практикада- көпшілігі) қарамауға мүмкіндік береді. Екі эвристика да тәуелсіз әрекет етеді және бір уақытта қолданылады. Егер s ығысуын тексеру кезінде T[s + 1..s + т] кіші жолы үлгімен сәйкес келмейтіні анықталса, онда эвристикалардың әрқайсысы болжалған ығыстыруды жіберіп алудан қауіптенбей s –ті көбейтуге болатын мәнді көрсетеді (бұл стоп-символ эвристикасы үшін j— [T[s +j]] және қауіпсіз суффикс эвристикасы үшін j— [T[s +j]]; Бойер-Мур алгоритмі екі ығыстырудың үлкенін таңдайды.

s үлгіге ығыстырылғанды текстпен (мәтінмен) салыстырған кезде (оңнан солға), екі шеткі оң сандар сәйкес келетіні анықталды (олар се “қауіпсіз суффикс” құрайды), ал үлгідегі үшінші оң жақтағы әріп –текстегідей емес. Тексте бұл жерде і “стоп символы” тұр: онда жолдарды салыстыру үзіледі (а-суреті). Стоп-символдың эвристикасы үлгіні оңға стоп-символ тексте осы символдың үлгіге шеткі оң кіруі қарсы орналасатындай қашықтықта ығыстыруды ұсынады. Біздің жағдайымызда бұл 4 позицияға ығыстыруды білдіреді. Егер стоп-символ үлгіде мүлдем жоқ болса, онда үлгіні текстің стоп-символына толықтай ығыстыру қажет; егер стоп-символ үлгіде текстегі стоп-символдан оңға қарай кездессе, онда стоп-символдың эвристикасы пайдалы ештеңе ұсынбайды. Ол алгоритм елемейтін теріс ығысу береді (б-сурет). Қауіпсіз суффикс эвристикасы үлгіні оңға қауіпсіз суффикстің үлгіге жақын кіруі (егер оңнан солға қараса) текстегі қауіпсіз суффикске қарсы орналасатындай етіп ығыстыруды ұсынады. Біздің мысалымызда бұл 3 позицияға ығыстыруды білдіреді. Бойер-Мур алгоритмі екі ұсынылатын ығыстырудың үлкенін таңдайды – біздің жағдайымызда 4-ке ығыстыру (в-суреті).

Бұл алгоритм алғашында мүмкін емес сияқты көрінетінді жасайды: қалыпты жағдайда ол сөздің берілген үлгі ізделетін барлық әріптерінің азғантай бөлігін ғана оқиды. қалайша бұлай болады? Идея қарапайым. Мысалы, біз abcd үлгісін іздейміз делік. Сөздің төртінші әрпін қараймыз: егер мысалға бұл әріп с болса, онда алғашқы үш әріпті оқудың ешқандай қажеттілігі жоқ. (Шын мәнінде, үлгіде е әрпі жоқ, сондықтан ол бесінші әріптен басталуы мүмкін).