18
1 ლექცია 14,15 ქვესტრიქონების ძებნის ამოცანა აღნიშვნები და ტერმინოლოგია; უმარტივესი ალგორითმი; კნუტ-მორის-პრატის ალგორითმი; ბოიერ-მურ-ჰორსპულის ალგორითმი; ბოიერ-მურის ალგორითმი აღნიშვნები და ტერმინოლოგია ვთქვათ, მოცემული გვაქვს ანბანი. მისი ელემენტებისგან შედგენილ სასრული სიგრძის სიმრავლეს ვუწოდოთ სტრიქონი (string). -ით ავღნიშნოთ ანბანით შედგენილი სტრიქონების სიმრავლე. სასრული სიგრძის ცარიელი სტრიქონი (empty string),რომელიც აღინიშნება -ით, აგრეთვე, ეკუთვნის -ს. x სტრიქონის სიგრძე ავღინიშნოთ x -ით. x და y სტრიქონების კონკატენაცია (concatenation), ავღინიშნოთ xy -ით, მისი სიგრძეა x y და შედგება მიმდევრობით x და y სტრიქონების სიმბოლოებისაგან. სტრიქონს ეწოდება x სტრიქონის პრეფიქსი (prefix) , (აღინიშნება x ) თუ არსებობს იმავე ანბანზე განსაზღვრული y სტრიქონი, ისეთი, რომ x y .(მაგ; x abcca ab ab abcca ) სტრიქონს ეწოდება x სტრიქონის სუფიქსი(suffix) , (აღინიშნება x )თუ არსებობს იმავე ანბანზე განსაზღვრული y სტრიქონი, ისეთი, რომ x y .(მაგ; x abcca cca cca abcca ) ცარიელი სტრიქონი , არის ნებისმიერი სტრიქონის პრეფიქსიც და სუფიქსიც. თუ არის x -ის პრეფიქსი ან სუფიქსი, მაშინ x . ნებისმიერი x და y სტრიქონებისთვის და ნებისმიერი a სიმბოლოსთვის, x y სრულდება მაშინ და მხოლოდ მაშინ, როცა xa ya . ადგილი აქვს შემდეგ ლემას: ლემა (ორი სუფიქსის შესახებ) ვთქვათ, x , y და z სტრიქონებია, რომლებისთვისაც x z , y z . თუ x y მაშინ x y . თუ x y მაშინ y x . თუ x y მაშინ y x . თუ სტრიქონის პრეფიქსი ან სუფიქსი არ ემთხვევა სტრიქონს, მას უწოდებენ საკუთრივ პრეფიქსს, ან საკუთრივ სუფიქსს. n სიგრძის T სტრიქონი ავღნიშნოთ 1.. T n -ით. 1.. T n -ის k -სიმბოლოიანი პრეფიქსი ავღნიშნოთ k T -თი. ამრიგად, 0 1.. n T T T T n ქვესტრიქონების ძებნის ამოცანის დასმა ვთქვათ, მოცემული გვაქვს ანბანზე განსაზღვრული n სიგრძის სტრიქონი, რომელსაც ვუწოდებთ ტექსტს და ავღნიშნავთ 1.. T n -ით და m სიგრძის სტრიქონი, რომელსაც ვუწოდებთ ნიმუშს და ავღნიშნავთ 1.. P m -ით(pattern) m n .

14,15 ქვესტრიქონების ძებნის ამოცანაhinkali.com/Education/AlgAgeba1415.pdf · 2 ვიტყვით, რომ T ტექსტში

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

1

ლექცია 14,15 ქვესტრიქონების ძებნის ამოცანა

აღნიშვნები და ტერმინოლოგია;

უმარტივესი ალგორითმი;

კნუტ-მორის-პრატის ალგორითმი;

ბოიერ-მურ-ჰორსპულის ალგორითმი;

ბოიერ-მურის ალგორითმი

აღნიშვნები და ტერმინოლოგია

ვთქვათ, მოცემული გვაქვს ანბანი. მისი ელემენტებისგან შედგენილ სასრული

სიგრძის სიმრავლეს ვუწოდოთ სტრიქონი (string). -ით ავღნიშნოთ ანბანით

შედგენილი სტრიქონების სიმრავლე. სასრული სიგრძის ცარიელი სტრიქონი (empty

string),რომელიც აღინიშნება -ით, აგრეთვე, ეკუთვნის -ს. x სტრიქონის სიგრძე

ავღინიშნოთ x -ით. x და y სტრიქონების კონკატენაცია (concatenation),

ავღინიშნოთ xy -ით, მისი სიგრძეა x y და შედგება მიმდევრობით x და y

სტრიქონების სიმბოლოებისაგან.

სტრიქონს ეწოდება x სტრიქონის პრეფიქსი (prefix) , (აღინიშნება x ) თუ

არსებობს იმავე ანბანზე განსაზღვრული y სტრიქონი, ისეთი, რომ x y .(მაგ;

x abcca ab ab abcca )

სტრიქონს ეწოდება x სტრიქონის სუფიქსი(suffix) , (აღინიშნება x )თუ

არსებობს იმავე ანბანზე განსაზღვრული y სტრიქონი, ისეთი, რომ x y .(მაგ;

x abcca cca cca abcca )

ცარიელი სტრიქონი , არის ნებისმიერი სტრიქონის პრეფიქსიც და სუფიქსიც.

თუ არის x -ის პრეფიქსი ან სუფიქსი, მაშინ x . ნებისმიერი x და y

სტრიქონებისთვის და ნებისმიერი a სიმბოლოსთვის, x y სრულდება მაშინ და

მხოლოდ მაშინ, როცა xa ya . ადგილი აქვს შემდეგ ლემას:

ლემა (ორი სუფიქსის შესახებ) ვთქვათ, x , y და z სტრიქონებია,

რომლებისთვისაც x z , y z . თუ x y მაშინ x y . თუ x y მაშინ y x . თუ

x y მაშინ y x .

თუ სტრიქონის პრეფიქსი ან სუფიქსი არ ემთხვევა სტრიქონს, მას უწოდებენ

საკუთრივ პრეფიქსს, ან საკუთრივ სუფიქსს.

n სიგრძის T სტრიქონი ავღნიშნოთ 1..T n -ით. 1..T n -ის k -სიმბოლოიანი

პრეფიქსი ავღნიშნოთ kT -თი. ამრიგად, 0 1..nT T T T n

ქვესტრიქონების ძებნის ამოცანის დასმა

ვთქვათ, მოცემული გვაქვს ანბანზე განსაზღვრული n სიგრძის სტრიქონი,

რომელსაც ვუწოდებთ ტექსტს და ავღნიშნავთ 1..T n -ით და m სიგრძის სტრიქონი,

რომელსაც ვუწოდებთ ნიმუშს და ავღნიშნავთ 1..P m -ით(pattern) m n .

2

ვიტყვით, რომ T ტექსტში P ნიმუში შედის s წანაცვლებით (occurs with shift s) ან რაც იგივეა, P ნიმუში T ტექსტში გვხვდება 1s პოზიციიდან (occurs beginning at position s+1) თუ 0 1.. 1..s n m T s s m P m .

თუ P ნიმუში T ტექსტში შედის s წანაცვლებით, მაშინ s -ს დასაშვებ წანაცვლებას (valid shift) უწოდებენ, წინააღმდეგ შემთხვევაში - s დაუშვებელი წანაცვლებაა (invalid shift).

ქვესტრიქონების ძებნის ამოცანა (string matching problem) მდგომარეობს შემდეგში: ვიპოვოთ ყველა ის დასაშვები წანაცვლება, რომლითაც P ნიმუში შედის T ტექსტში. ქვესტრიქონების ძებნის ამოცანა შეიძლება ასეც ჩამოვაყალიბოთ: ვიპოვოთ ყველა ის s წანაცვლება 0 s n m ინტერვალში, რომლისთვისაც

s mP T .

ჩვენ განვიხილავთ ქვესტრიქონების ძებნის რამდენიმე ალგორითმს. ალგორითმები მოცემული იქნება ფსევდოკოდის სახით. ყველა მათგანში ქვესტრიქონების ძებნის ამოცანაში ვეძებთ პირველ დასაშვებ წანაცვლებას, რომელიც შეესაბამება მარცხნიდან პირველ ქვესტრიქონს ტექსტში. თუ საჭიროა ყველა ქვესტრიქონის პოვნა ტექსტში, ალგორითმი გააგრძელებს მუშაობას ტექსტის ბოლომდე.

ფსევდოკოდში იგულისხმება, რომ ერთნაირი სიგრძის ორი სტრიქონის შედარება პრიმიტიული ოპერაციაა. სტრიქონების შედარებისას, გარკვეული რაოდენობა სიმბოლოების დამთხვევის შემდეგ, პირველივე არდამთხვევისთანავე პროცესი წყდება. ითვლება, რომ ამ პროცესზე დახარჯული დრო გამოიხატება წრფივი ფუნქციით, რომელიც დამოკიდებულია სტრიქონების ტოლი (დამთხვეული) სიმბოლოების რაოდენობაზე. უფრო ზუსტად, ითვლება, რომ ტესტი '' ''x y სრულდება ( 1)t დროში, სადაც t არის ყველაზე გრძელი z სტრიქონის სიგრძე, რომელიც არის ერთდროულად x -ს და y -ს პრეფიქსი ( z x , z y ) (რომ გავითვალისწინოთ 0t შემთხვევა, ( )t -ს ნაცვლად ვწერთ ( 1)t -ს. ამ სიტუაციაში არ ემთხვევა სტრიქონების პირველივე სიმბოლოები, მაგრამ ამის შესამოწმებლადაც საჭიროა რაღაც დადებითი დრო)

ქვესტრიქონების ძებნის უმარტივესი ალგორითმი

ქვესტრიქონების ძებნის ყველაზე მარტივ ალგორითმში, რომელიც დამყარებულია ”უხეში ძალის" მეთოდზე, s დასაშვები წანაცვლების პოვნა ხდება s -ის ყველა შესაძლო 1n m მნიშვნელობისთვის 1.. 1..P m T s s m პირობის თანმიმდევრობით შემოწმებით.

ალგორითმი მუშაობს შემდეგნაირად: ნიმუშის და ტექსტის პირველ სიმბოლოებს (ელემენტებს)ვუსწორებთ ერთმანეთს და ვადარებთ შესაბამის წყვილებს მარცხნიდან მარჯვნივ, სანამ ყველა m წყვილი არ დაემთხვევა ერთმანეთს.(ამ შემთხვევაში, ალგორითმი ასრულებს მუშაობას) თუ შედარებისას აღმოჩნდა განსხვავებული წყვილი, ნიმუშს ვამოძრავებთ ერთი პოზიციით მარჯვნივ და სიმბოლოების შედარება გრძელდება ნიმუშის პირველი სიმბოლოსა და ტექსტის შესაბამისი სიმბოლოს შედარებიდან. შევნიშნოთ, რომ ტექსტის ბოლო პოზიცია, რომელიც შეიძლება ქვესტრიქონის პირველი სიმბოლო იყოს, არის 1n m .

ამ ალგორითმის ფსევდოკოდი შემდეგია:

3

NAIVE_STRING_MATCHER(T,P)

1 n length T

2 m length P

3 0; ;for s s n m s

4 1j

5 & &while j m P j T s j

6 1j j

7 1 intif j m pr s

8 1return

ალგორითმის მუშაობის დრო

ჩავთვალოთ შედარების ოპერაცია ძირითად ოპერაციად. შემავალი მონაცემები განისაზღვრება ტექსტის და ნიმუშის სიმბოლოების რაოდენობით. ალგორითმის მუშაობის დრო იქნება:

0 1 0 0 0

1 1 1 1 1n m m n m n m n m

s j s s s

m m m m n m mn

განვიხილოთ მაგალითი, რომელიც შეესაბამება ე.წ. უარეს შემთხვევას, როცა გვიხდება m სიმბოლოს შემცველი ნიმუშის ყველა სიმბოლოს შედარება ტექსტის შესაბამის სიმბოლოებთან, ანუ, როცა პირველი 1m სიმბოლო ემთხვევა ტექსტის შესაბამის სიმბოლოებს, და ბოლო-არა. სულ დაგვჭირდება 1n m m შედარება. (ჩვენს შემთხვევაში -9)

მაგალითი1. ვთქვათ, T aaaab P aab 5, 3n m

3 შედარება

3 შედარება

3 შედარება

ამრიგად, უარეს შემთხვევაში, ალგორითმის მუშაობის დროა mn , მაგრამ ტიპობრივ შემთხვევებში, მოსალოდნელია, რომ წანაცვლებების უმეტესობა შესრულდება შედარებების მცირე რაოდენობის ჩატარების შემდეგ. ალგორითმის მუშაობის დრო საშუალო შემთხვევაში არსებითად უკეთესია მუშაობის დროზე

a a b

a a a b

a a b

a a b

a

4

უარეს შემთხვევაში, კერძოდ, შეიძლება ვაჩვენოთ, რომ იგი ტოლია m n n .

მაგალითი2. განვიხილოთ ლათინური ანბანის ასოებისგან და ხაზგასმის სიმბოლოებისგან შედგენილ ტექსტში: BESS_KNEW_ABOUT_BAOBABS ნიმუშის - BAOBAB-ს ძებნის ამოცანა უმარტივესი ალგორითმით.

უმარტივესი ალგორითმის არაეფექტურობას განაპირობებს ის, რომ ინფორმაცია ტექსტის შესახებ s წანაცვლების შემოწმების დროს, საერთოდ არ გამოიყენება, მომდევნო წანაცვლების შემოწმებისას.

უმარტივესი ალგორითმისგან განსხვავებით, უფრო სწრაფი ალგორითმები ემყარება ნიმუშის წინასწარი "დამუშავების" იდეას: ნიმუშზე გარკვეული ინფორმაციის მიღებას, მის შენახვას ცხრილში და შემდეგ, ამ ინფორმაციის გამოყენებას ტექსტში ნიმუშის რეალური ძებნისას. ამ იდეას ემყარება ორი ყველაზე ცნობილი ალგორითმი: ბოიერ-მურის, ბოიერ-მურ-ჰორსპულის (ბოიერ-მურის გამარტივებული შემთხვევა), კნუტ-მორის-პრატის ალგორითმები. ბოიერ-მურის,

BESS_KNEW_ABOUT_BAOBABS

BAOBAB BAOBAB BAOBAB მუქად აღნიშნულია ის სიმბოლოები,

BAOBAB რომელთა შედარება მოხდა ტექსტის BAOBAB სიმბოლოებთან. BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB 24 შედარება

5

ბოიერ-მურ-ჰორსპულის ალგორითმებში ნიმუშის განხილვა ხდება მარჯვნიდან მარცხნივ, ხოლო კნუტ-მორის-პრატის ალგორითმში - მარცხნიდან მარჯვნივ.

კნუტ-მორის-პრატის ალგორითმი

ეს ალგორითმი დამოუკიდებლად შექმნეს ერთი მხრივ, კნუტმა(Knuth) და მორისმა(Morris) და მეორე მხრივ, პრატმა(Pratt) 1977 წელს. მისი მუშაობის სისწრაფე განპირობებულია იმით, რომ მოცემული 1..P m ნიმუშისთვის წინასწარ ვითვლით ე.წ. 1..m პრეფიქს-ფუნქციას (prefix-function). ალგორითმი მუშაობს შემდეგნაირად: ნიმუშის და ტექსტის პირველ სიმბოლოებს ვუსწორებთ ერთმანეთს და ვადარებთ შესაბამის წყვილებს მარცხნიდან მარჯვნივ, სანამ ყველა m წყვილი არ დაემთხვევა ერთმანეთს.(ამ შემთხვევაში, ალგორითმი ასრულებს მუშაობას) თუ შედარებისას აღმოჩნდა განსხვავებული წყვილი, ნიმუშს ვამოძრავებთ მარჯვნივ. ცხადია, ალგორითმი მით ეფექტურია, რაც მეტია წანაცვლების სიდიდე ყოველ ბიჯზე. ამ ალგორითმში წანაცვლების სიდიდე დგინდება ე.წ. 1..m პრეფიქს-ფუნქციის (prefix-function) გამოყენებით, რომელიც გამოითვლება O m დროში. იგი ნიმუშის ელემენტებზეა განსაზღვრული და შეიცავს ინფორმაციას იმის შესახებ, თუ რამდენად ემთხვევა ნიმუში თავის თავს წანაცვლების შემდეგ, რაც საშუალებას გვაძლევს ავიცილოთ თავიდან ზედმეტი შედარებები.

პრეფიქს-ფუნქციის გამოთვლის საჭიროება შეიძლება განვიხილოთ შემდეგ მაგალითზე; ვთქვათ, მოცემული გვაქვს ლათინური ანბანი , ტექსტი T და ნიმუში P .

:T bacbabababacaca :P ababaca

ვთქვათ s წანაცვლებისთვის აღმოჩნდა, რომ ნიმუშის პირველი q სიმბოლო (ამ შემთხვევაში 5q ) დაემთხვა ტექსტის შესაბამის სიმბოლოებს, ხოლო მომდევნო(მეექვსე) სიმბოლო განსხვავებულია.

ეს ნიშნავს, რომ ჩვენ ვიცით ტექსტის q რაოდენობა 1 , ,T s T s q სიმბოლოებისა და ის, რომ ნიმუში s წანაცვლებით ტექსტში არ შედის. მოცემული ინფორმაციის საფუძველზე შეიძლება დავასკვნათ, რომ ზოგიერთი წანაცვლება უეჭველად დაუშვებელია. ჩვენს მაგალითში დაუშვებელია წანაცვლება 1s , რადგან

s a c a

a c b a b b a b a b a c a a

b a b a

q

c

6

ამ დროს ნიმუშის პირველი ელემენტი a აღმოჩნდება ტექსტის 2s -ე ელემენტის - b -ს ქვეშ. 2s წანაცვლებისას, კი ნიმუშის პირველი 3 ელემენტი დაემთხვევა ტექსტის

3 , 4 , 5T s T s T s ელემენტებს (ანუ ტექსტის ჩვენთვის ცნობილ ბოლო 3 ელემენტს)ამიტომ, ამ წანაცვლების შეუმოწმებლად უარყოფა არ შეიძლება.

ინფორმაციას დასაშვები წანაცვლებების შესახებ გვაძლევს 1..m პრეფიქს-ფუნქცია, რომელიც გამოითვლება ალგორითმის დაწყებამდე და შეიტანება ცხრილში. თუ s წანაცვლებისას, პირველი q სიმბოლო ემთხვევა, მაშინ შემდეგი წანაცვლება,რომელიც შეიძლება იყოს დასაშვები, ტოლია s s q q .

საკითხი შეიძლება დავსვათ შემდეგნაირად:

ვთქვათ, ნიმუშის 1..P q სიმბოლოები დაემთხვა ტექსტის

1..T s s q სიმბოლოებს. რას უდრის ის უმცირესი წანაცვლება s s , რომლისთვისაც

1.. 1.. (1)P k T s s k

სადაც s k s q . საუკეთესო შემთხვევაში s s q და 1, , 1s s q წანაცვლებების განხილვა არ დაგვჭირდება. მაგრამ, თუ ნიმუში ისეთია,რომ მისი წანაცვლებისას საკუთარი თავის მიმართ, მისი გარკვეული ელემენტები ემთხვევიან ერთმანეთს (ჩვენს მაგალითში, ნიმუშის პირველი 3 სიმბოლო ემთხვევა ბოლო 3 სიმბოლოს) მაშინ 1, , 1s s q წანაცვლებებიდან შეიძლება რომელიმე იყოს დასაშვები. ნებისმიერ შემთხვევაში, s წანაცვლების განხილვისას, შეგვიძლია არ შევადაროთ ნიმუშის პირველი k სიმბოლო ტექსტის შესაბამის სიმბოლოებს, რადგანაც ისინი აუცილებლად დაემთხვევიან ერთმანეთს.( 1.. 1..P k T s s k -ს საფუძველზე)

s-ს საპოვნელად, საკმარისია ვიცოდეთ ნიმუში P და რიცხვი q . სახელდობრ,

qP სტრიქონის k სიმბოლოიანი სუფიქსი, რომელიც ემთხვევა ტექსტის 1..T s s k სიმბოლოებს. k რიცხვი (1) ფორმულაში წარმოადგენს ისეთ უდიდეს რიცხვს, რომლისთვისაც kP არის qP -ს სუფიქსი.

1..P m ნიმუშის პრეფიქს-ფუნქცია ეწოდება ფუნქციას

: 1,2, , 0,1, , 1m m , რომელიც განსაზღვრულია შემდეგნაირად:

max : da k qq k k q P P

სხვა სიტყვებით რომ ვთქვათ, q არის P ნიმუშის იმ უდიდესი პრეფიქსის სიგრძე, რომელიც qP -ს საკუთრივ სუფიქსს წარმოადგენს.

პრეფიქს-ფუნქციის გამოთვლის ალგორითმის ფსევდოკოდს აქვს სახე:

COMPUTE_PREFIX_FUNCTION(P)

2s s a c a

a c b a b b a b a b a c a c a

b a b a

k

7

1 m length P ;

2 1 0 ;

3 0k ;

4 2; ;for q q m q

5 0 && 1 !while k P k P q

6 k k ;

7 1if P k P q ;

8 1k k ;

9 q k ;

10 return

ქვემოთ მოყვანილია კნუტ-მორის-კარპის ალგორითმი K_M_P_MATCHER ფსევდოკოდის სახით, სადაც ხდება _ _COMPUTE PREFIX FUNCTION -ს გამოძახება.

K_M_P_MATCHER(T,P)

1 n length T ;

2 m length P

3 _ _ ( )COMPUTE PREFIX FUNCTION P ;

4 0q ;

5 1; ;for i i n i

6 0 && 1 !while q P q T i

7 q q ;

8 1if P q T i ;

9 1q q ;

10 if q m

11 int '' i"nimuSi aRmoCenilia wanacvlebiT pr

ალგორითმის მუშაობის დრო

საამორტიზაციო ანალიზის პოტენციალთა მეთოდის გამოყენებით, შეიძლება ვაჩვენოთ, რომ _ _COMPUTE PREFIX FUNCTION -ს მუშაობის დრო არის ( )m . k (ტექსტისა და ნიმუშის ტოლი სიმბოლოების რაოდენობა) სიდიდის პოტენციალი უკავშირდება მის მიმდინარე მნიშვნელობას ალგორითმში. მე-3 სტრიქონიდან ჩანს, რომ k -ს საწყისი მნიშვნელობაა 0. მე-6 სტრიქონში k მცირდება მისი ყოველი გამოთვლისას, რადგან .k k მაგრამ, რადგან 0k , k არასოდეს არ ხდება

8

უარყოფითი. ერთადერთი სტრიქონი ალგორითმში, რომელშიც შეიძლება შეიცვალოს k -ს მნიშვნელობა, არის მე-8 სტრიქონი, სადაც ის იზრდება არაუმეტეს 1-ით. რადგან ციკლში შესვლამდე k q , და q -ს მნიშვნელობა იზრდება ციკლის ყოველი იტერაციისას, k q ნარჩუნდება, ისევე როგორც უტოლობა .q q while

ციკლის ტანის ყოველი შესრულება მე-6 სტრიქონში შეიძლება „გადავიხადოთ“ პოტენციური ფუნქციის შემცირებით, რადგანაც .k k მე-8 სტრიქონში პოტენციური ფუნქცია იზრდება არაუმეტეს 1-ით, ამიტომ 5-9 სტრიქონებში ციკლის ტანის საამორტიზაციო ღირებულება ტოლია (1)O -ს. რადგან გარე ციკლში იტერაციების რაოდენობა არის ( )m და რადგან პოტენციური ფუნქციის საბოლოო მნიშვნელობა საწყის მნიშვნელობაზე ნაკლები არაა,

_ _COMPUTE PREFIX FUNCTION -ს მუშაობის ფაქტიური დრო უარეს შემთხვევაში ტოლია ( )m -ს.

ანალოგიურად მტკიცდება, რომ K_M_P_MATCHER-ს მუშაობის დრო არის ( )n . ამრიგად, ალგორითმის მუშაობის დრო იქნება ( )n m

ქვემოთ მოყვანილია პრეფიქს-ფუნქციის ცხრილები ნიმუშებისთვის:

ababaca და BAOBAB

i 1 2 3 4 5 6 7

P i a b a b a c a

i 0 0 1 2 3 0 1

მაგ.3 განვიხილოთ ლათინური ანბანის ასოებისგან და ხაზგასმის სიმბოლოებისგან შედგენილ ტექსტში: BESS_KNEW_ABOUT_BAOBABS ნიმუშის - BAOBAB-ს ძებნის ამოცანა კნუტ-მორის პრატის ალგორითმით.

i 1 2 3 4 5 6

P i B A O B A B

i 0 0 0 1 2 1

9

მაგ.4 განვიხილოთ ლათინური ანბანის ასოებისგან და ხაზგასმის სიმბოლოებისგან

შედგენილ ტექსტში: bacbabababacaca ნიმუშის - ababaca -ს ძებნის ამოცანა.

bacbabababacaca

ababaca ababaca მუქად აღნიშნულია ის სიმბოლოები, ababaca რომელთა შედარებამოხდა ტექსტის

ababaca სიმბოლოებთან.

ababaca ababaca 15 შედარება

BESS_KNEW_ABOUT_BAOBABS

BAOBAB BAOBAB BAOBAB მუქად აღნიშნულია ის სიმბოლოები,

BAOBAB რომელთა შედარება მოხდა ტექსტის BAOBAB სიმბოლოებთან. BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB BAOBAB 22 შედარება

10

ბოიერ-მურ-ჰორსპულის ალგორითმი

ბოიერ-მურ-ჰორსპულის (შემდეგში,ბ-მ-ჰ-ის) ალგორითმი, ისევე როგორც კ-მ-პ-ის ალგორითმი, ნიმუშის წინასწარი დამუშავების ხარჯზე, ამცირებს ტექსტის და ნიმუშის შედარებების რაოდენობას.

ალგორითმი მუშაობს შემდეგნაირად: ნიმუშის და ტექსტის პირველ სიმბოლოებს ვუსწორებთ ერთმანეთს, ვადარებთ ნიმუშის უკიდურეს მარჯვენა სიმბოლოს ტექსტის შესაბამის სიმბოლოსთან და ვმოძრაობთ მარჯვნიდან მარცხნივ, სანამ ყველა m წყვილი არ დაემთხვევა ერთმანეთს.(ამ შემთხვევაში, საძიებელი ქვესტრიქონი ნაპოვნია და ალგორითმი დასრულებულია) თუ შედარებისას აღმოჩნდა განსხვავებული წყვილი, ნიმუშს ვამოძრავებთ მარჯვნივ. ცხადია, გადაწევა ჯობს, რაც შეიძლება მეტი პოზიციით, მაგრამ არა ქვესტრიქონის გამოტოვების რისკის ხარჯზე. ბ-მ-ჰ-ის ალგორითმი ამ პოზიციების რაოდენობას განსაზღვრავს იმ c სიმბოლოს განხილვით, რომელიც ტექსტის და ნიმუშის ერთმანეთის მიმართ გასწორების მომენტში, მდებარეობს ნიმუშის ბოლო ელემენტის გასწვრივ. გვაქვს ორი შემთხვევა:

1. თუ c სიმბოლო არ ემთხვევა ნიმუშის პირველ 1m სიმბოლოს, მაშინ ნიმუშის წანაცვლება მარჯვნივ ხდება m პოზიციით.

BESS_KNEW_AB0UT_BA0BABS

BA0BAB

BA0BAB (ამ შემთხვევაში K სიმბოლო არ გვხვდება ნიმუშის პირველ 5 სიმბოლოს შორის,

რაც ნიშნავს, რომ ნიმუშის წანაცვლებით მარჯვნივ 6 პოზიციით არ გამოვტოვებთ დასაშვებ წანაცვლებას)

2. თუ c სიმბოლო გვხვდება ნიმუშის პირველ 1m სიმბოლოებს შორის, მაშინ წანაცვლება ხდება ისე, რომ ნიმუშის c -ს ტოლი უკიდურესი მარჯვენა სიმბოლო გაუსწორდეს ტექსტის c სიმბოლოს.

BESS_KNEW_ABOUT_BAOBABS

BAOBAB

BAOBAB (ამ შემთხვევაში B სიმბოლო ორჯერ გვხვდება ნიმუშის პირველ 5 სიმბოლოს

შორის, ნიმუშის წანაცვლება მარჯვნივ ხდება ისე, რომ ნიმუშის პირველ 5 სიმბოლოს შორის ყველაზე მარჯვნივ მდგომი B სიმბოლო გაუსწორდეს c სიმბოლოს, რომ არ გამოვტოვოთ დასაშვები წანაცვლება)

ამ მაგალითებიდან ჩანს, რომ სიმბოლოების შედარებას მარჯვნიდან მარცხნივ მივყავართ უფრო დიდ წანაცვლებებთან, ვიდრე უმარტივეს ალგორითმში, მაგრამ თუ c სიმბოლოს შევადარებთ ნიმუშის ყოველ ელემენტს, მაშინ შედარებების

11

რაოდენობა იმავე რიგის იქნება, რაც უმარტივეს ალგორითმში. შემავალი მონაცემების "გაუმჯობესების" იდეა ამცირებს ამ შედარებების რაოდენობას. ტექსტის ყოველი ელემენტისათვის (ნიმუშის გათვალისწინებით) წინასწარ ვითვლით წანაცვლების სიდიდეს, რომელიც შემდეგნაირად გამოითვლება:

,

1 ,

1

m c

m

Table c m

c

Tu ar emTxveva nimuSis

pirvel elements

manZili nimuSis pirvel elementebs

Soris ukiduresad marjvena elementsa

da bolo elements Soris, wi

naaRmdeg SemTxvevaSi.

წანაცვლების სიდიდეს ვინახავთ ცხრილში. წანაცვლების ცხრილის ალგორითმის ფსევდოკოდს აქვს სახე:

SHIFT_TABLE(T,P)

1 n length T ;

2 m length P ;

3 1; ;for k k n k

4 [ ]Table T k m ;

5 1; 1;for s s m s

6 Table P s m s ;

7 return Table

BOYER_MOORE_HORSPOOL_MATCHING(T,P)

1 n length T ;

2 m length P ;

3 _ ( , )SHIFT TABLE T P ;

4 i m ;

5 while i n

6 0k ;

7 & &while k m P m k T i k

8 1k k ;

9 if k m

10 1return i m ;

11 else

12 i i TABLE T i

13 1return

12

ალგორითმის მუშაობის დრო

წინასწარი დამუშავების ფაზის (წანაცვლების ცხრილი) მუშაობის დრო არის n , ხოლო ბოიერ-მურ-ჰორსპულის ალგორითმის მუშაობის დრო უარეს

შემთხვევაში არის mn .

განვიხილოთ ლათინური ანბანის ასოებისგან და ხაზგასმის სიმბოლოებისგან შედგენილ ტექსტში: BESS_KNEW_ABOUT_BAOBABS ნიმუშის - BAOBAB-ს ძებნის ამოცანა.

წანაცვლების ცხრილს აქვს სახე;

c სიმბოლო A B E S K N W O U T _

Table c წანაცვლება 1 2 6 6 6 6 6 3 6 6 6

BESS_KNEW_AB0UT_BA0BABS

BA0BAB BA0BAB BA0BAB BA0BAB BA0BAB 13 შედარება მუქად აღნიშნულია ის სიმბოლოები, რომელთა შედარება მოხდა ტექსტის

სიმბოლოებთან.

ბოიერ-მურის ალგორითმი

ბოიერ-მურის ალგორითმის ღირსება მდგომარეობს იმაში, რომ ნიმუშის

წინასწარი დამუშავების ხარჯზე, მცირდება ნიმუშისა და ტექსტის სიმბოლოების

შედარებების რაოდენობა: ზოგიერთი შედარებისთვის წინასწარ ცნობილი ხდება,

რომ იგი უსარგებლო იქნება.

ბოიერ-მურის ალგორითმით ქვესტრიქონების ძებნა, ისევე როგორც ბოიერ-მურ-ჰორსპულის ალგორითმში, იწყება ტექსტისა და ნიმუშის პირველი ელემენტების ერთმანეთთან გასწორებით. ტექსტისა და ნიმუშის ელემენტების შედარებას ვიწყებთ ნიმუშის ბოლო ელემენტიდან და ვმოძრაობთ მარჯვნიდან მარცხნივ, სანამ ყველა m წყვილი არ დაემთხვევა ერთმანეთს.(ამ შემთხვევაში, საძიებელი ქვესტრიქონი ნაპოვნია და ალგორითმი დასრულებულია)

13

ვთქვათ, ტექსტისა და ნიმუშის შესაბამისი წყვილების 0k k m რაოდენობა დაემთხვა ერთმანეთს, ხოლო 1k e წყვილი განსხვავებულია. ამ შემთხვევაში ბოიერ-მურის ალგორითმი განსაზღვრავს წანაცვლების სიდიდეს ორი ევრისტიკის გამოყენებით. ესენია „სდექ-სიმბოლოს ევრისტიკა“ და „უსაფრთხო სიმბოლოს ევრისტიკა“. თითოეული მათგანი იძლევა მნიშვნელობას, რომელთა შორისაც უდიდესის არჩევით, შეიძლება გამოვითვალოთ ისეთი მაქსიმალური წანაცვლება, რომ არ გამოვტოვოთ დასაშვები.

წანაცვლების პირველი სიდიდე- სდექ-სიმბოლოს წანაცვლება( bad-symbol shift) განისაზღვრება ტექსტის იმ c ელემენტით (დავარქვათ მას სდექ-სიმბოლო) რომელიც შედარებისას პირველი არ დაემთხვა ნიმუშის შესაბამის ელემენტს (ეს ელემენტი შეიძლება იყოს პირველივე ელემენტი. ამ შემთხვევაში 0k )

თუ c ელემენტი არ შედის ნიმუშში, მაშინ ნიმუში უნდა გადავაადგილოთ მარჯვნივ ისე, რომ სდექ-სიმბოლო აღმოჩნდეს წანაცვლების გარეთ. წანაცვლება გამოითვლება ფორმულით: Table c k , სადაც Table c წანაცვლების ცხრილის ელემენტია, ხოლო k ტექსტისა და ნიმუშის ტოლი ელემენტების რაოდენობა:

NEWS_ABOUT_BAOBABS

BAOBAB

BAOBAB

ერთმანეთს დაემთხვა ნიმუშის და ტექსტის ბოლო ორი AB ელემენტი ( 2k ),

სდექ-სიმბოლოა „_“ . ნიმუში გადაადგილდება მარჯვნივ _Table k , ანუ 6-2=4 პოზიციით.(იხ. წანაცვლებების ცხრილი)

თუ c ელემენტი შედის ნიმუშში და 0Table c k , მაშინ წანაცვლება ისევ ამ ფორმულით გამოითვლება, ანუ ხდება ნიმუშის გადაადგილება Table c k პოზიციით.

NEWS_ABOUT_BAOBABS

BAOBAB

BAOBAB

არ დაემთხვა ერთმანეთს ნიმუშის ბოლო ელემენტი B და ტექსტის შესაბამისი ელემენტი A (სდექ-სიმბოლო), ნიმუში გადაადგილდება მარჯვნივ Table A k , ანუ 1-0=1 პოზიციით.

თუ სდექ-სიმბოლო c შედის ნიმუშში ტექსტის შესაბამისი სიმბოლოს წინ, ე,ი

თუ 0Table c k , მაშინ ნიმუშის გადაადგილება ხდება მარჯვნივ Table c k პოზიციით.

BAROABOUT_BAOBABS

BAOBAB

BAOBAB

14

ერთმანეთს დაემთხვა ნიმუშის და ტექსტის ბოლო ორი AB ელემენტი ( 2k ), სდექ-სიმბოლოა „O“ . ნიმუშის გადაადგილება ხდება მარჯვნივ, Table O k , ანუ 3-2=1 პოზიციით.

თუ სდექ-სიმბოლო c შედის ნიმუშში ტექსტის შესაბამისი სიმბოლოს შემდეგ, ე.ი. თუ 0Table c k , მაშინ, ცხადია, ვერ წავანაცვლებთ ნიმუშს უარყოფითი რაოდენობა პოზიციით. ამ შემთხვევაში, ვიყენებთ „უხეში ძალის“ პრინციპს და ვამოძრავებთ ნიმუშს ერთი პოზიციით მარჯვნივ.

MAMABABYSAYS

BAOBAB

BAOBAB

ერთმანეთს დაემთხვა ნიმუშის და ტექსტის ბოლო სამი B AB ელემენტი ( 3k ), სდექ-სიმბოლოა „A“. 1 3 2Table A k .

ამრიგად, „სდექ-სიმბოლოს ევრისტიკით“ წანაცვლების სიდიდე 1d ტოლია

Table c k , თუ ეს სიდიდე დადებითია, და უდრის 1-ს, თუ იგი არადადებითია.

1 max ,1d Table c k

წანაცვლების მეორე სიდიდე - საერთო სუფიქსის წანაცვლება (good-suffix shift) განისაზღვრება ნიმუშის k ელემენტის დამთხვევით ტექსტის შესაბამის ელემენტებთან და იგი ემყარება შემდეგ იდეას: ვთქვათ, ნიმუშში გვხვდება სიმბოლოების განლაგება, რომელიც ემთხვევა ნიმუშის k -სიმბოლოიან სუფიქსს, მაშინ ნიმუში შეიძლება წავანაცვლოთ იმდენი პოზიციით, რომ k -სიმბოლოიანი სუფიქსის ტოლი სიმბოლოების განლაგება, რომელიც მარჯვნიდან მეორეა, დაემთხვეს k -სიმბოლოიან სუფიქსს. ამასთან უნდა გავითვალისწინოთ ერთი მნიშვნელოვანი გარემოება: სიმბოლოების აღნიშნულ განლაგებას წინ უნდა უძღოდეს იმ სიმბოლოსგან განსხვავებული სიმბოლო, რომელიც წინ უძღოდა k -სიმბოლოიან სუფიქსს.

DBAB

ABABCBABCBAB

ამ მაგალითში 3-სიმბოლოიან სუფიქსს წინ უძღვის სიმბოლო C, მისი შესაბამისი სიმბოლო ტექსტში არის D, და ამ სიმბოლოების შედარებისას მოხდა პირველი არდამთხვევა. ნიმუშში გვაქვს კიდევ ორი ასეთი განლაგება; მარჯვნიდან პირველს წინ უძღვის სიმბოლო C , ხოლო მარჯვნიდან მეორეს - სიმბოლო A. თუ ნიმუშს ისე წავანაცვლებთ, რომ ნიმუშში მარჯვნიდან მეორე BAB განლაგება(რომელსაც წინ ასევე უძღვის სიმბოლო C) დაემთხვეს ტექსტის შესაბამის სიმბოლოებს, აღმოჩნდება, რომ ვიმეორებთ უსარგებლო შედარებას( D ისევ არ დაემთხვევა C-ს).

15

DBAB

ABABCBABCBAB ამ შემთხვევაში, ნიმუშის შესაძლო დასაშვები წანაცვლება იქნება: DBAB

ABABCBABCBAB

ანუ, ნიმუშის გადაადგილება ხდება ისე, რომ მარჯვნიდან მეორე BAB განლაგება(რომელსაც წინ არ უძღვის სიმბოლო C) დაემთხვეს ტექსტის შესაბამის სიმბოლოებს.

თუ k -სიმბოლოიანი სუფიქსის ტოლი სიმბოლოების განლაგება ნიმუშში არ არის, მაშინ, თითქოს, ლოგიკურია ვიფიქროთ, რომ წანაცვლება უნდა მოხდეს ნიმუშის ტოლი სიგრძით.

0s DBAB 1ns

DBCBAB DBCBAB

მაგრამ, თუ ნიმუში შეიცავს ელემენტთა თანმიმდევრობას, რომელიც არის k -სიმბოლოიანი სუფიქსის რაიმე l -სიმბოლოიანი სუფიქსი l k , მაშინ ნიმუშის ტოლი სიგრძით წანაცვლებისას შეიძლება გამოვტოვოთ დასაშვები წანაცვლება.

DBABCBAB

ABCBAB ABCBAB

იმისათვის, რომ ავიცილოთ თავიდან არაკორექტული წანაცვლებები, k სიგრძის

სუფიქსისთვის უნდა ვიპოვოთ l k სიგრძის უდიდესი პრეფიქსი, რომელიც ემთხვევა, იმავე ნიმუშის l სიგრძის სუფიქსს. თუ ასეთი პრეფიქსი არსებობს, 2d გამოითვლება როგორც მანძილი პრეფიქსსა და სუფიქსს შორის, წინააღმდეგ შემთხვევაში, 2d ნიმუშის სიგრძის ტოლია.

ქვემოთ მოყვანილია საერთო სუფიქსების წანაცვლებების ცხრილი - 2d -ს მნიშვნელობების სრული სია ნიმუშისთვის ABCBAB .

k ნიმუში

2d

1 ABCBAB 2 2 ABCBAB 4

3 ABCBAB 4

4 ABCBAB 4

5 ABCBAB 4

16

ბოიერ-მურის ალგორითმის ფსევდოკოდს აქვს სახე:

ბიჯი 1. მოცემული m სიგრძის ნიმუშისთვის და ანბანისთვის, რომელიც გამოიყენება ტექსტში და ნიმუშში, ავაგოთ წანაცვლებების ცხრილი.

ბიჯი 2. მოცემული m სიგრძის ნიმუშისთვის, ავაგოთ საერთო სუფიქსების წანაცვლებების ცხრილი.

ბიჯი 3. გავუსწოროთ ნიმუში ტექსტის დასაწყისს.

ბიჯი 4. მანამ, სანამ არ იქნება ნაპოვნი საძიებელი ქვესტრიქონი, ან, მანამ,სანამ ნიმუში არ მიაღწევს ტექსტის ბოლო სიმბოლოს, გავიმეოროთ შემდეგი მოქმედებები: ნიმუშის ბოლო სიმბოლოდან დაწყებული, მარჯვნიდან მარცხნივ, ვადარებთ ნიმუშის და ტექსტის შესაბამის ელემენტებს. თუ დადგინდება ყველა m სიმბოლოს ტოლობა (ე.ი. ტექსტში ნაპოვნია ნიმუში ანუ ქვესტრიქონი და ძებნა წყდება) თუ ნიმუშის 0 k m სიმბოლო დაემთხვა ტექსტის შესაბამის სიმბოლოებს, ხოლო

1k -ე სიმბოლო არ დაემთხვა ტექსტის შესაბამის სიმბოლოს და ეს სიმბოლო ტექსტში არის c , მაშინ წანაცვლებების ცხრილიდან ვიპოვით Table c -ს. თუ 0k , საერთო სუფიქსების წანაცვლებების ცხრილიდან ვიპოვით 2d -ს. ნიმუშს წავანაცვლებთ მარჯვნივ d პოზიციით, სადაც

1

1 2

, 0

max , , 0

d kd

d d k

Tu

Tu

1 max ,1d Table c k

ალგორითმის მუშაობის დრო

ბოიერ-მურის ალგორითმის მუშაობის დრო უარეს შემთხვევაში არის mn . წინასწარი დამუშავების ფაზას სჭირდება mn დრო, ხოლო ძებნის ფაზას - mn . ის სწრაფია, როცა ანბანი დიდია (მაგ, A-Z, 1-9) და ნელია, როცა ანბანი

პატარაა (მაგ, {0,1}).

განვიხილოთ ლათინური ანბანის ასოებისგან და ხაზგასმის სიმბოლოებისგან შედგენილ ტექსტში: BESS_KNEW_ABOUT_BAOBABS, ნიმუშის - BAOBAB-ს ძებნის ამოცანა.

წანაცვლებების ცხრილს აქვს სახე:

c სიმბოლო A B E S K N W O U T _

Table c წანაცვლება 1 2 6 6 6 6 6 3 6 6 6

17

საერთო სუფიქსების წანაცვლებების ცხრილს აქვს სახე:

k ნიმუში 2

d 1 BAOBAB 2 2 BAOBAB 5 3 BAOBAB 5 4 BAOBAB 5

5 BAOBAB 5

დასასრულ, განვიხილოთ საკითხი: ანბანის, ტექსტის და ნიმუშის ზომის მიხედვით, ჩვენს მიერ განხილული, რომელი ალგორითმის გამოყენებაა უფრო ხელსაყრელი. არსებობს მრავალი გამოკვლევა ამის შესახებ. ბოიერ-მურის ალგორითმის უპირატესობა უმარტივეს ალგორითმთან შედარებით, განსაკუთრებით საგრძნობია, როცა ანბანიც, ტექსტიც და ნიმუშიც დიდია(გრძელია). ბოიერ-მურის ალგორითმის უპირატესობა მის უფრო მარტივ ბოიერ-მურ-ჰორსპულის ალგორითმთან ვლინდება მხოლოდ მაშინ, როცა ნიმუში გრძელია და ტექსტში ხშირად გვხვდება ნიმუშში შემავალი სიმბოლოების ცალკეული მიმდევრობები. მოკლე ანბანისათვის რეკომენდირებულია კნუტ-მორის-პრატის ალგორითმი, ხოლო

BESS_KNEW_ABOUT_BAOBABS

BAOBAB მუქად აღნიშნულია ის სიმბოლოები, რომელთა 1 1( ) 0 6d t k შედარება მოხდა ტექსტთან.

BAOBAB

1 1

2

(_) 2 4

5

max{4,5} 5

d t

d

d

BAOBAB

1 1

2

(_) 1 5

2

max{5,2} 5

d t

d

d

BAOBAB 12 შედარება

18

თუ ტექსტიც და ნიმუშიც მოკლეა, უმარტივესი ალგორითმიც საკმაოდ ეფექტურია მისი სიმარტივის გამო (წინასწარი დამუშავების ეტაპის გარეშე)

სავარჯიშოები

1. განვიხილოთ გენების ძებნის ამოცანა დნმ-ს მიმდევრობაში ჰორსპულის

ალგორითმის გამოყენებით. დნმ-ს მიმდევრობა წარმოადგენს ტექსტს,

განსაზღვრულს {A,C,G,T} ანბანზე, ხოლო გენი, ან გენის მონაკვეთი - ნიმუშს.

a. ააგეთ წანაცვლების ცხრილი გენის შემდეგი მონაკვეთისთვის:

TCCTATTC

b. გამოიყენეთ ჰორსპულის ალგორითმიამ ნიმუშის შემდეგ ტექსტში

მოსაძებნად: ATCTGTACTTCCTATTCGTA

2. სიმბოლოების რამდენი შედარება უნდა შესრულდეს ბოიერ-მურ-ჰორსპულის

ალგორითმით შემდეგი ნიმუშების ძებნის დროს ტექსტში, რომელიც შედგება

1000 ნულისგან:

a. 00001

b. 10000

g. 01010

3. სიმბოლოების რამდენი შედარება უნდა შესრულდეს ბოიერ-მურის

ალგორითმით შემდეგი ნიმუშების ძებნის დროს ტექსტში, რომელიც შედგება

1000 ნულისგან:

a. 00001

b. 10000

ლიტერატურა

1. Т.Кормен, Ч.Лейзерсон, Р.Ривест, К.Щтайн. АЛГОРИТМЫ ПОСТРОЕНИЕ и АНАЛИЗ,

второе издание, Москва Санкт-Петербург Киев, 2010 г.

2. А. Левитин АЛГОРИТМЫ Введение в разработку и анализ. Москва Санкт-Петербург Киев,

2006 г.