שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2015 - Boyer-Moore

נתונה התבנית מעל אלף-בית . בנו את טבלאות ו- מהאלגוריתם של Boyer & Moore עבור התבנית הנתונה.
123456789101112
AABAAABAABAA
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2015סמסטר ב
Boyer-Mooreחיפוש מחרוזות
עבור טבלת , מצאו את המופע האחרון של כל תו מהאלפבית בתבנית. עבור טבלת , חשבו את גודל ההזזה הנדרש עבור כל "סיומת טובה" אפשרית .
אלגוריתם Boyer & Moore משתמש בשתי היוריסטיקות (טבלאות) כדי לקבוע את גודל ההזזה (shift) של התבנית על פני הטקסט: היוריסטיקת התו הרע () והיוריסטיקת הסיומת הטובה (). נבנה את הטבלאות עבור התבנית שאורכה והאלף-בית .

### בניית טבלת
(היוריסטיקה של התו הרע)

טבלת
שומרת עבור כל תו את המיקום (אינדקס) של המופע הימני ביותר שלו בתבנית . אם תו אינו מופיע בתבנית, נהוג לסמן את מיקומו כ-0 (בהנחת אינדקסים מ-1).

התבנית
והאינדקסים שלה:
אינדקס123456789101112
תוAABAAABAABAA

נמצא את המופע הימני ביותר עבור כל תו מהאלף-בית:

- עבור 'A': המופע הימני ביותר הוא באינדקס 12.

- עבור 'B': המופע הימני ביותר הוא באינדקס 10.

- עבור 'C': התו אינו מופיע בתבנית, לכן המיקום הוא 0.

- עבור 'D': התו אינו מופיע בתבנית, לכן המיקום הוא 0.


לכן, טבלת
היא:
-

-

-

-


### בניית טבלת
(היוריסטיקה של הסיומת הטובה)

טבלת
מכילה את גודל ההזזה כאשר מתגלה אי-התאמה בתו ה- של התבנית, כלומר כאשר הסיומת היא "סיומת טובה" (התאימה לטקסט). החישוב מתבצע בשני שלבים:
1. נחפש את המופע הימני ביותר של הסיומת הטובה
בתבנית, , כך ש- והתו שלפניו שונה, כלומר . אם נמצא כזה, ההזזה היא . ניקח את ההזזה המינימלית.
2. אם לא נמצא מופע כזה, נחפש את הרישא (prefix) הארוכה ביותר של
שהיא גם סיפא (suffix) של הסיומת הטובה . אם אורך הרישא הוא , ההזזה תהיה . אם אין כזו, ההזזה היא .

נחשב את
עבור :
- i=12: סיומת טובה "A". אי-התאמה ב-
P[11]=\'A\'. המופע הימני ביותר של "A" שאינו מופיע אחרי "A" הוא ב- (לפניו P[10]=\'B\'). ההזזה: . לכן, .
- i=11: סיומת טובה "AA". אי-התאמה ב-
P[10]=\'B\'. המופע הימני ביותר של "AA" שאינו מופיע אחרי "B" הוא (לפניו P[4]=\'A\'). ההזזה: . לכן, .
- i=10: סיומת טובה "BAA". אי-התאמה ב-
P[9]=\'A\'. אין מופע של "BAA" שאינו אחרי "A". רישא של שהיא סיפא של "BAA" היא "AA" (אורך 2). ההזזה: . לכן, .
- i=9: סיומת טובה "ABAA". אי-התאמה ב-
P[8]=\'A\'. אין מופע מתאים. רישא של שהיא סיפא של "ABAA" היא "AA" (אורך 2). ההזזה: . לכן, .
- i=8: סיומת טובה "AABAA". אי-התאמה ב-
P[7]=\'B\'. המופע אינו אחרי "B". ההזזה: . לכן, .
- i=7: סיומת טובה "BAABAA". אי-התאמה ב-
P[6]=\'A\'. אין מופע מתאים. רישא של שהיא סיפא של "BAABAA" היא "AABAA" (אורך 5). ההזזה: . לכן, .
- i=6: סיומת טובה "ABAABAA". אי-התאמה ב-
P[5]=\'A\'. אין מופע מתאים. רישא של שהיא סיפא של "ABAABAA" היא "AA" (אורך 2). ההזזה: . לכן, .
- i=5: סיומת טובה "AABAABAA". אי-התאמה ב-
P[4]=\'A\'. אין מופע מתאים. רישא של שהיא סיפא של "AABAABAA" היא "AABAA" (אורך 5). ההזזה: . לכן, .
- i=4: סיומת טובה "AAABAABAA". אי-התאמה ב-
P[3]=\'B\'. אין מופע מתאים. רישא של שהיא סיפא של "AAABAABAA" היא "AA" (אורך 2). ההזזה: . לכן, .
- i=3: סיומת טובה "BAAABAABAA". אי-התאמה ב-
P[2]=\'A\'. אין מופע מתאים. רישא של שהיא סיפא של "BAAABAABAA" היא "AABAA" (אורך 5). ההזזה: . לכן, .
- i=2: סיומת טובה "ABAABAA". לא, P[2..12] = "A B A A A B A A B A A". אין מופע מתאים. רישא של
שהיא סיפא של היא "AA" (אורך 2). ההזזה: . לכן, .
- i=1: במקרה זה הסיומת היא כל התבנית. אין אי-התאמה לפני, ולכן הערך לא רלוונטי לחישוב הזזה. לרוב מגדירים
כדי להבטיח התקדמות. לכן, .

הטבלה המלאה:
123456789101112
AABAAABAABAA
11071071073101061