שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2015 - Boyer-Moore
נתונה התבנית מעל אלף-בית . בנו את טבלאות ו- מהאלגוריתם של Boyer & Moore עבור התבנית הנתונה.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | A | B | A | A | A | B | A | A | B | A | A | |
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2015סמסטר ב
★★★★★
Boyer-Mooreחיפוש מחרוזות
עבור טבלת , מצאו את המופע האחרון של כל תו מהאלפבית בתבנית. עבור טבלת , חשבו את גודל ההזזה הנדרש עבור כל "סיומת טובה" אפשרית .
אלגוריתם Boyer & Moore משתמש בשתי היוריסטיקות (טבלאות) כדי לקבוע את גודל ההזזה (shift) של התבנית על פני הטקסט: היוריסטיקת התו הרע () והיוריסטיקת הסיומת הטובה (). נבנה את הטבלאות עבור התבנית שאורכה והאלף-בית .
### בניית טבלת (היוריסטיקה של התו הרע)
טבלת שומרת עבור כל תו את המיקום (אינדקס) של המופע הימני ביותר שלו בתבנית . אם תו אינו מופיע בתבנית, נהוג לסמן את מיקומו כ-0 (בהנחת אינדקסים מ-1).
התבנית והאינדקסים שלה:
נמצא את המופע הימני ביותר עבור כל תו מהאלף-בית:
- עבור 'A': המופע הימני ביותר הוא באינדקס 12.
- עבור 'B': המופע הימני ביותר הוא באינדקס 10.
- עבור 'C': התו אינו מופיע בתבנית, לכן המיקום הוא 0.
- עבור 'D': התו אינו מופיע בתבנית, לכן המיקום הוא 0.
לכן, טבלת היא:
-
-
-
-
### בניית טבלת (היוריסטיקה של הסיומת הטובה)
טבלת מכילה את גודל ההזזה כאשר מתגלה אי-התאמה בתו ה- של התבנית, כלומר כאשר הסיומת היא "סיומת טובה" (התאימה לטקסט). החישוב מתבצע בשני שלבים:
1. נחפש את המופע הימני ביותר של הסיומת הטובה בתבנית, , כך ש- והתו שלפניו שונה, כלומר . אם נמצא כזה, ההזזה היא . ניקח את ההזזה המינימלית.
2. אם לא נמצא מופע כזה, נחפש את הרישא (prefix) הארוכה ביותר של שהיא גם סיפא (suffix) של הסיומת הטובה . אם אורך הרישא הוא , ההזזה תהיה . אם אין כזו, ההזזה היא .
נחשב את עבור :
- i=12: סיומת טובה
- i=11: סיומת טובה
- i=10: סיומת טובה
- i=9: סיומת טובה
- i=8: סיומת טובה
- i=7: סיומת טובה
- i=6: סיומת טובה
- i=5: סיומת טובה
- i=4: סיומת טובה
- i=3: סיומת טובה
- i=2: סיומת טובה
- i=1: במקרה זה הסיומת היא כל התבנית. אין אי-התאמה לפני, ולכן הערך לא רלוונטי לחישוב הזזה. לרוב מגדירים כדי להבטיח התקדמות. לכן, .
הטבלה המלאה:
### בניית טבלת (היוריסטיקה של התו הרע)
טבלת שומרת עבור כל תו את המיקום (אינדקס) של המופע הימני ביותר שלו בתבנית . אם תו אינו מופיע בתבנית, נהוג לסמן את מיקומו כ-0 (בהנחת אינדקסים מ-1).
התבנית והאינדקסים שלה:
| אינדקס | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| תו | A | A | B | A | A | A | B | A | A | B | A | A |
נמצא את המופע הימני ביותר עבור כל תו מהאלף-בית:
- עבור '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: במקרה זה הסיומת היא כל התבנית. אין אי-התאמה לפני, ולכן הערך לא רלוונטי לחישוב הזזה. לרוב מגדירים כדי להבטיח התקדמות. לכן, .
הטבלה המלאה:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | A | B | A | A | A | B | A | A | B | A | A | |
| 1 | 10 | 7 | 10 | 7 | 10 | 7 | 3 | 10 | 10 | 6 | 1 |