מבני נתונים ואלגוריתמים תרגול # התאמת מחרוזות סימונים והגדרות: P[,,m] כך Σ * טקסט T )מערך של תווים( באורך T[,,n] n ותבנית P באורך m ש.m n התווים של P ו T נלקחים מאלפבית סופי Σ. לדוגמא: {a,b,,z},{,}=σ. קבוצת כל המחרוזות באורך סופי שניתן להרכיב מ Σ. ε Σ המחרוזת הריקה. מתקיים ש ε בעיית התאמת מחרוזות: רוצים למצוא את כל המופעים של P ב T. רוצים למצוא את כל האינדקסים )=היסטים( ב T כך ש לדוגמא: תהי X מחרוזת. נסמן ב X i את המחרוזת שמכילה את התווים מ עד i ב X ואורכה i. כלומר.X i = X[,,i] רישא: x רישא של y אם קיים z כך ש y xz = )=שרשור של x עם z(. סיפא: x סיפא של y אם קיים z כך ש y. zx = הגדרה נוספת של הבעיה: רוצים למצוא את כל ההיסטים m כך ש P סיפא של T. m האלגוריתם הנאיבי בודקים את כל ההיסטים שהאפשריים באמצעות לולאה שרצה מ i= עד.nm סיבוכיות: O(nm).O((nm+)m) אלגוריתם רביןקרפ מתייחסים למחרוזת כמספר )לפי ערך ה ASCII של התווים(. בגלל שמחרוזות הן מערכים, השוואה בין מחרוזות תלויה באורך n שלהם, ולכן זה לא קבוע.O(n) הרעיון נשתמש בפונקציית.hash נחשב את ערך ה hash של התבנית, ונשווה אותו לערך ה hash של כל תתיהמחרוזות בטקסט.
מימוש נאיבי: נחשב את H(P) לוקח O(m) ) m אורך התבנית(. עוברים על כל תתי המחרוזות t ב T, מחשבים את H(t) ומשווים ל( H(P..O(nm) שיפור: נשתמש ב Hash Rolling זוהי פונקציית Hash מיוחדת מחשבת את ערך ה Hash עבור תתהמחרוזת הראשונה ב T בזמן התבנית(, ואז מחשבת את תת המחרוזת הבאה מתוך תתהמחרוזת הראשונה ב( O( )כאורך O(m) וכך הלאה. סיבוכיות.O(n+m) אלגוריתם KMP על מנת להימנע מהשוואות מיותרות, נשתמש במידע שיש בתבנית P עצמה. מחשבים את פונקציית m. באורך P פונקציית הרישא עבור תבנית Π.) i<m )לכל P i היא סיפא של P j המקיים ש ) j<i( j האינדקס המקסימלי Π(i) = j P = a b a b c Π 3 4 5 דוגמא: ()Π. אין לכן = P. a= שהיא סיפא של P ε= צריך למצוא את הרישא הכי ארוכה של ()Π ()Π. אין לכן = P. =ab שהיא סיפא של P a= צריך למצוא את הרישא הכי ארוכה של ()Π.Π(3) לכן =,a P 3 =aba שהיא סיפא של P =ab צריך למצוא את הרישא הכי ארוכה של Π(3) וכן הלאה. הרעיון הכללי של האלגוריתם: מחפשים את P ב T. בכל פעם שיש איהתאמה, נסיט את P ימינה בהיסט הקטן ביותר האפשרי שמקיים שעדיין יש התאמה של התווים הראשונים ב P לבין התווים האחרונים ב T. האלגוריתם: KMP(P, T): q = i = while i < length(t) if T[i] == P[q] σ[i] = q i ++ q ++ if q == m print im q = Π(q) else if q> q = Π(q) + else i++
דוגמת הרצה: סיבוכיות:.O(m+n) הסברים נוספים: http://www.inf.fhflensburg.de/lang/algorithmen/pattern/kmpen.htm בנוסף, KMP יכול לחשב את σ פונקציית הסיפא..)<i n )לכל T i שהיא סיפא של P j הוא אורך הרישא המקסימלית של התבנית j σ(i) = j לדוגמא: T = a a a b a a c a a P = a a b a a σ 3 4 3 5 4 6 5 7 8 9.P 3 = a a b נחפש ב b T 4 = a a a את הסיפא המקסימלית שהיא רישא של P:.P 5 = a a b a a נחפש ב a T 6 = a a a b a את הסיפא המקסימלית שהיא רישא של :P אלגוריתם BM האלגוריתם משווה את התבנית מול תחילת הטקסט אך מתחיל את ההשוואה של מסוף התבנית עד לתחילתה. האלגורתם עושה preprocessing על התבנית ויוצר פונקציות. מטרתן לקדם את התבנית תוך כדי "דילוג" על תווים שאנחנו יודעים בודאות שהתבנית לא תימצא בהם. :Goodsuffix shift נבדוק את הסיפא של תתהמחרוזת שבה הייתה התאמה. נקדם את התבנית בבטחה כך שהתווים בהם הייתה התאמה עדיין זהים. נניח ששי איהאתמה בין x[i]=a לבין.y[i+j] = b כלומר יש התאמה בין הטקסט לתבנית מסוף התבנית עד ל i+ )תתמחרוזת u(. המטרה היא להזיז את התבנית כך שהמופע הבא הימני ביותר של u יהיה מול הטקסט במיקום.j+i+
אם אין תתמחרוזת כזאת, נזיז את התבנית כך שהסיפא הארוכה ביותר v של y[i+j+ j+m] תהיה מול הרישא המתאימה של התבנית. :Badchar shift המטרה להזיז את התבנית עד למופע הבא של התו y[i+j] בתבנית. אם אין, אפשר להזיז את כל התבנית מול.y[i+j+] האלגוריתם בוחר את הההזה המקסימלית מבין ה GSS וה BCS. סיבוכיות:.O(n+m) דוגמא והסברים נוספים: http://wwwigm.univmlv.fr/~lecroq/string/node4.html תרגילים הגדרה: נסמן ב T R את המחרוזת ההופכית של T )באורך n(, כלומר T(n)T(n) T() T. R =.T = T R פלינדרום אם T בהינתן מחרוזת T באורך n, תארו אלגוריתם שמוצא את אורך הרישא המקסימלית של T שהינה פלינדרום. לדוגמא אז נחזיר 6=j. אם x רישא של,T אז קיים y כך ש xy.t = לכן מתקיים.T R = y R x R אם x פלינדרום אז T R = y R x )גם הכיוון השני נכון(. לכן מספיק למצוא את הרישא הארוכה ביותר של T שהיא סיפא של T. R
נריץ KMP כך הטקסט שלנו הוא T R והתבנית היא T ונחזיר σ(n) ה= של j המקסימלית כך ש T j סיפא.T R n סיבוכיות: (n).o(m+n) = O(n) = )נאיבי: ).O(n נתונה מחרוזת T שאורכה n. תארו אלגוריתם המוצא חלוקה T = xyx כך ש y והאורך של x מקסימלי. *הערה תמיד קיימת חלוקה כזו, כיוון ש x יכולה להיות ε. y = דוגמא: מה יכול להיות האורך המקסימלי של x?. בדוגמא : =5 רוצים למצוא את הרישא המקסימלית של T באורך לכל היותר k שהיא גם סיפא של T. התווים האחרונים ב T. k והטקסט הוא T k כאשר התבנית היא KMP נריץ P T סיבוכיות:.O(n) דוגמא x = 5 הגדרה: מחרוזת 'T היא סיבוב מעגלי של מחרוזת T = t t t n אם קיים i n כך שמתקיים:. T' = t i t i+ t n t t t i דוגמא: c a r <> a r c נתונות מחרוזות 'T,T באורך n. תארו אלגוריתם הבודק האם 'T הינה סיבוב של T. נשים לב ש' T סיבוב מעגלי של T אם"ם 'T מופיע ב TT. TT = t t t 3 t i t i t i+ t i+ t n t t t i t i t n T'
נריץ KMP עם טקסט סיבוכיות: O(n).O(n+n) =.T' ותבנית TT נתונות מחרוזות X,Y באורך X n. אנגרמה של Y אם קיימת תמורה כך שמתקיים כתבו אלגוריתם שמקבל T ו P ו מוצא את כל תתי המחרוזות של T שהן אנגרמות של P. נריץ RB עם Rolling hash שמחשב את ערך ה Hash על המחרוזת ללא תלות בסדר האותיות ואז אם.RH(x) = RH(y) אנגרמות אז הן ו y x לדוגמא לכל אות נבחר מספר גדול N a )כדי שסכום מספרים יהיה ייחודי( ונגדיר: