Lecture of Geiger & Iti s slide rochure www.cs.technion.c.il/~dng/courseds מבני נתו נים למח ר ו ז ו ת חומר קריאה לשיעור זה Algorithms on Strings, Trees, nd Sequences, Dn Gustfield Chpter 5, 7.3, 7.4, 7.7 Geiger & Iti, 200
מבנה נתוני ם Trie strings מבנה נתונים Trie מאפשר חיפוש,הכנסה, הוצאה, ומציאת מינימום (לקסיקוגרפי) של מחרוזות. המימוש באמצעות עץ. לכל צומת פנימי יש לכל היותר מספר ילדים כגודל האלף-בית + אחד. כל קשת מסומנת בתו. התו (שאינו שייך ל- ) מסמן סיום מחרוזת. אנו נתייחס לגודל של כקבוע. c c דוגמא: trie עבור המחרוזות,c,, c כאשר תו סיום-המחרוזת הוא הקטן ביותר לקסיקוגרפית. Geiger & Iti, 200 הערת מימוש: בכל צומת מוחזק מערך באורך + של מצביעים מסומנים המסודרים לקסיקוגרפית (לפי סדר עולה של האותיות+).
מיו ן מח ר ו ז ות נא יבי 3 m = n. i= S i קלט: מחרוזות S,,S n שאור כן הכולל פלט: ה דפסת המחרוזות בסדר לקסיקוגרפי. נניח לרגע (לשם פשטות) שאורך כל המחרוזות אחיד ושווה ל-.m/n השוואת שתי מחרוזות לוקחת זמן O(m/n). לפתרון באמצעות השוואות נדרשות (n Θ(n log השוואות, ולכן סה"כ נדרש זמן n).o( (m/n) n log n) = O( m log נראה כעת פתרון בזמן.O(m)
מיו ן מח ר ו ז ות באמצעות Trie האל גוריתם הכנס את S,,S n ל- trie עבור על ה- trie לפי סדר preorder וכתוב לפלט את המסלול לכל עלה...2 c c דוגמא: נתונות המחרוזות,c,, c כאשר תו סיום-מחרוזת הוא (הקטן ביותר לקסיקוגרפית). המחרוזות הממוינות הן c,. c,
ניתו ח ז מנים זמן הריצה: הכנסת s i דורשת זמן ( i.o( s לכן זמן הכנסת כל המחרוזות הוא ( i.o(m)=o(σ i s סיור ה- preorder ב- trie דורש זמן כמספר הצמתים ומספר זה חסום ע"י.O(m) עבור ה דפסת s i נטפס למעלה ע ד ה שורש 5 דוגמא: c c
6 ד ח י סת Trie - נסלק מהעץ צמתים בעל י בן אח ד ע"י החלפ ת שרשרת קשתות בקשת בוד דת שתסומן בתווית המקוד דת את המחרוזת המתאימה. z c c z חיסכון במקום: מספר הע לים הוא n. ל כל צומת פנימי לפחות שני בנים. לפיכך יש לכ ל היותר -n צמתים פנימיים. ל כן סה"כ ה צמתים קטן שווה -2n. החס כון יהיה משמעותי יותר בהמשך כאשר תוויות ה קשתות יהיו מקודדות בצורה קומפקטית.
7 עץ סי ומות (Suffix tree) עץ סיומות של מחרוזת S הוא Trie שבו הוכנסו כל הסיומות של המחרוזת S עם תו סיום. x x דוגמא: עץ סיומות עבור S=xx הסיומות:,,,x,x,x xx לעץ סיומות עשרות שימושים במסגרת אלגוריתמים הפועלים על מחרוזות. אנו נבחן שלושה שימושים (שימושים רבים נוספים מתוארים בספר של :(Gusfield מציאת תת מחרוזת בתוך מחרוזת נתונה (או בתוך רשימת מחרוזות נתונה). מציאת תת מחרוזת ארוכה ביותר המשותפת לשתי מחרוזות נתונות. מימוש אלגוריתם לד חיסת אינפורמציה x x.(ziv-lempel compression)
אל ג ו ר יתם לבניי ת עץ ס י ומות נניח לאורך ההרצאה שאורך המחרוזת S הוא m. אלגוריתם נאיבי לבניית עץ סיומות עבור S: הכנס את המחרוזות S[m...m] S[...m], S[2...m],,... ל- Trie דחוס את ה- Trie שנוצר. 8 Time(m) = cm+c(m-)+ + = O(m 2 ) ניתוח זמנים: קיימים מספר אלגוריתמים מסובכים בהרבה המאפשרים לבנות עץ סיומות בזמן O(m) (כאשר גודל ה אלף-בית קבוע).הא לגוריתם היעיל ביותר מתואר במאמר: Esco Ukkonen. On-line construction of suffix trees. Algorithmic, 4:249-60, 995 ובספר של.Gusfield אנו נשתמש באלגוריתם זה כ"קופסא שחורה".
9 ח יס כו ן הכ ר ח י במק ו ם x x ניזכר בעץ הסיומות עבור S=xx (, ) x,,x, x, x, xx (, ) x S=xx חיסכון במקום: נשים לב שהתווית של כל קשת יכולה להיות בגודל (עד) m= S ושחלקים ממנה מופיעים שוב ושוב. ל כן נשמור העתק נ פרד של המח רוזת S וכל תווית תהיה זוג מצביעים המציינים את מיקום התווית במחרוזת S. סך המקום הנ ד ר ש הוא.O(m)
ח יס כו ן הכ ר ח י במק ו ם 0 x x (, ) x (, ) x תרגיל: מצא מחרוזת באורך 2m שגודל עץ הסיומות הלא דחוס הוא m 2 S=xx לכן כל אלגוריתם ליניארי לבניית עצי סיומות (דחוסים) חייב לייצג את תוויות הקשתות בצורה לא-ישירה.
x r 6 x x 4 w 2 x 5 u 2 v אי נפו רמציה נוספ ת בעץ סי ומות ניבחן שוב את עץ הסיומות עבור S=xx ע"י סיור preorder בעץ נוכל בזמן ליניארי O(m) לחשב לכל צומת z את המיקום הראשון של תת המחרוזת המיוצגת ע"י המסלול מהשורש ועד z. נסמן מיקום זה ע"י.c z 3 למשל המחרוזת x המיוצגת ע"י המסלול (r,v) מתחילה במקום השני ב- S והמחרוזת המיוצגת ע"י המסלול (r,u) מתחילה במקום החמישי ב- S. בעלים מספרים אלה מתקבלים ע"י חיסור מספר התווים המופיעים על המסלול לעלה z מהאורך הכללי m ועוד אחד (6=m בדוגמא זו). c w = בצמתים פנימיים יירשם המינימום של ערכי הילדים. למשל 2 בצומת w, 2. אמנם המיקום השמאלי ביותר של המחרוזת ב- s הוא 2. כ לומר
} n {S,..,S עם 2 עץ סי ומות מוכ ל ל עץ סיומות מוכלל הוא Trie שבו הוכנסו כל הסיומות של קבוצת מחרוזות תו סיום שונה i לכל מחרוזת S. i 3 x x x 2 6 3 4 x 2 5 2 2 2 דוגמא: עץ סיומות מוכלל עבור.{S =xx, S 2 = 2 } אלגוריתם נאיבי לבניה: נכניס את כל הסיומות אחת אחת ל- Trie בודד. זמן הריצה כאורך סכום כל הסיומות של כל המחרוזות (במקרה הגרוע גדול הרבה מסכום אורכי המחרוזות).
x 2 S 2 2 S n n דוגמא: } 2.{S =xx, S 2 = עץ סיומות עבור 2 xx נראה כך: בנית עץ סי ומות מוכ ל ל x x 2. i S 2 x אלגוריתם ליניארי : נבנה עץ סיומות עבור המחרוזת נ קצ ץ את כל תתי הע צים מתחת לקשתות שהתווית שלהן היא סיבוכיות זמן ) i.o( i s 3 העצים המצויירים כמשולש מייצגים סיומות המכילות. i סיומות אלה אינן שייכות לאף אחת מהמחרוזות המקוריות. לכן ניתן לגזום את המשולשים הנ"ל מהעץ.
4 מציאת מח ר ו ז ות קצ ר ו ת בטקס ט אר ו ך הבעיה: נתונה מחרוזת T מאורך m הנקראת טקסט. לאחר זמן עיבוד ליניארי O(m) של הטקסט, יש להיות מוכנים לקבל מחרוזת s לא ידועה באורך n ולמצוא מופע של s בטקסט T (המופע הראשון) או לקבוע שהמחרוזת s אינה נמצאת בטקסט. שימו לב שכל פתרון העובר על הטקסט T בזמן קבלת המחרוזת s ללא עיבוד מוקדם של T יאלץ לבצע לפחות Θ(m) פעולות. דוגמאות לשימושים:הטקסט הוא האנציקלופדיה בריטניקה והמחרוזת s היא מילה. הטקסט הוא הגנום של אורגניזם כלשהו, כלומר מחרוזת ארוכה של האותיות,{A,C,T,G} והמחרוזת s היא סדרה של אותיות כאלה המקודדת גן אותו יש למצוא בגנום הנתון. הערה: כמובן שקיימות וריאציות לבעיה זו כגון מציאת כל המופעים של s בטקסט הנתון, התאמה חלקית של s לטקסט, או חיפוש s בתוך אוסף טקסטים. הנחה: m>>n כלומר המחרוזת המבוקשת קצרה יחסית לאורך הטקסט.
5 אל ג ו ר יתם למציאת מח ר ו ז ות בטקסט בנה בזמן O(m) עץ סיומות עבור הטקסט T. הוסף לכל צומת v בעץ הסיומות את המספר c. v בהינתן מחרוזת s, עקוב על המסלול מהשורש של עץ הסיומות לפי התווים שבמחרוזת s. אם נמצאה המחרוזת s, אזי מקום המחרוזת הוא c v כאשר v הוא הצומת האחרון במסלול החיפוש של s. v x x דוגמא: ניבחן שוב את עץ הסיומות עבור x.t=xx המחרוזת x נמצאת 4 2 במקום הראשון (והרביעי) והמחרוזת 6 נמצאת במקום השני (והחמישי). x 3 5 2 הערה: למציאת כל המופעים של s בטקסט, האלגוריתם מוצא את c u לכל עלה u בתת העץ ששורשו v. זמן החיפוש הוא O(k) כאשר k הוא מספר המופעים של s בטקסט. החסם נובע מכך שמספר הצמתים בתת העץ קטן מ- 2k. בדוגמא, עבור המחרוזת x נגיע לצומת v שעבורו =,4 v c.
6 ד ח י סת אי נפו רמציה הבעיה: טקסט מילולי (ואחר) המקודד בצורה מפורשת הוא לעיתים ארוך מהנחוץ שכן מילים וחלקי מילים חוזרים על עצמם לאורך הטקסט. המטרה: בהינתן מחרוזת s, לייצר מחרוזת s התופסת פחות מקום מ- s כך שבעזרת אלגוריתם מתאים נצליח לשחזר את s. השימוש: העברה יעילה של קבצי אינפורמציה במדיום אלקטרוני כגון בדיסקטים, ברשתות תקשורת, וכדומה. למשל פקודות הדחיסה המקובלות winzip ו- compress במערכת Windows ובמערכת. Unix הרעיון: נעבור על המחרוזת הנתונה s משמאל לימין, בכל פעם שעוברים על תת מחרוזת z שכבר ראינו נחליף את z עם האינדקס והאורך של המופע השמאלי ביותר של z במחרוזת s. האלגוריתם המתבסס על רעיון זה נקרא Ziv-Lempel compression והוא מתואר במאמרים: Ziv, Lempel, IEEE Trns on Informtion Theory, 23:337-43, 977. Ziv, Lempel, IEEE Trns on Informtion Theory, 24:530-368, 978. כמו כן מוכח במאמרים אלה שאסימפטוטית, זהו אלגוריתם דחיסה אופטימלי.
ד וגמ אות לד ח יסה דוגמא I: 7 S = x c x y המחרוזת הנתונה: S = x (2,) c (2,3) (,3) y המחרוזת הד חוסה: במקרה זה אין כמעט דח יסה. זוהי תופעה נ פוצה עבור מחרוזות קצרות. דוגמא :II S = המחרוזת הנתונה: S = (,2) (,4) (,8) (,6) המחרוזת הד חוסה:.Θ(log k) עבור k חזרות של נק בל מחרוזת ד חוסה באורך
הג ד ר ות וס ימונ ים הגדרה: לכל אינדקס i במחרוזת,S[..m] נגדיר את תת המחרוזת Prior i להיות הרישא (Prefix) הארוכה ביותר של S[i..m] ואשר מופיעה כתת מחרוזת בתוך.S[.. i-] 8 Prior 7 =x 2 3 4 5 6 7 8 9 S = x דוגמא: c x y נסמן ב- L i את אורך המחרוזת.Prior i כאשר Prior i היא מחרוזת ריקה אז 0= i L. נסמן ב- s i את מיקום המחרוזת Prior i כאשר >0 i.l L 7 = x =3 s 7 = 2 בדוגמא :
האל ג ו ר י תם וניתו ח ו for (i=; i <= m; ) נתונה המחרוזת.S[..m] {(s i,l i ) = Compute_Prior(i) ; if (L i > 0) {output(s i, L i ); i = i + L i }; else {output(s[i]) ; i = i + } } נקודת המפתח במימוש האלגוריתם הוא חישוב ) i s) i L, בכל איטרציה. נניח שניתן לממש פעולה זו בזמן ) i O(L (כפי שנראה), מה יהיה זמן הריצה של האלגוריתם? 9 האלגוריתם קורא את המחרוזת משמאל לימין. האלגוריתם לא מחשב את ) i s) i L, עבור אינדקס i שכבר נמצא באזור הדחוס. בכל איטרציה האלגוריתם דוחס L i תווים וקופץ קדימה L i תווים במחרוזת S. לפיכך סכום האורכים L i שחושבו ע"י האלגוריתם קטן מ- m (אין חפיפות), וזמן הריצה.O(m) S = האורכים שחושבו : 6 = 0 0 2 4 8 i L
מימו ש יע יל ש ל Ziv-Lempel 20 בנה עץ סיומות דחוס T עבור המחרוזת.O(m) חשב את c v לכל צמתי T בזמן.O(m) Sבזמן בכל איטרציה, כאשר האלגוריתם נדרש לחשב את ) i s), i L, צעד על המסלול מהשורש של T לפי התווים במחרוזת S[i..m] כל עוד c. v i> כאשר החיפוש נעצר, לאחר L i תווים, המקום s i שווה ל- c u כאשר u הוא הצומת האחרון על מסלול הצעידה. x 3 6 x x 4 2 x 5 2 דחיסת S=xx S = x(,2) דוגמא: פענוח מחרוזת דחוסה: עבור על המחרוזת S משמאל לימין. במקרה של תו,העתק אותו ל- S, ובמקרה של זוג ) i,(s i,l שכפל את L i התווים המתחילים במקום.s i
מציאת תת מח ר ו זת א רו כ ה משותפת 2 הבעיה: מצא תת מחרוזת ארוכה ביותר המשותפת לשתי מחרוזות נתונות S S, 2 בזמן ) 2 O(L +L כאשר L i הוא אורך המחרוזת.S i S = superioclifornilives דוגמא: S 2 =seliver פתרון לדוגמא: תת המחרוזת הארוכה ביותר המשותפת לשתי המחרוזות הנתונות היא.live תרגיל: מצאו אלגוריתם יעיל כ כ ל שתוכל ו ללא שימוש בעצי סיומות.
מציאת תת מח ר ו זת א רו כ ה משותפת 22 הרעיון: נבנה עץ סיומות מוכלל המכיל את הסיומות של שתי המחרוזות. נסמן עלה בתווית אם העלה מתאים לסיומת של S ובתווית 2 אם העלה מתאים לסיומת של S. 2 נסמן צומת פנימי ב- אם כל ילדיו מסומנים ב-, נסמנו ב- 2 אם כל ילדיו מסומנים ב- 2, ונסמנו ב- {,2} אם תוויות ילדיו מכילים גם וגם 2. סימון זה לוקח זמן ליניארי בגודל עץ הסיומות. דוגמא: עץ סיומות מוכלל עבור.{S =xx, S 2 = 2 } x x x,2 2 2 x 2,2,2 2 2 2 שורת המחץ: תת המחרוזת הארוכה ביותר המשותפת היא זאת המיוצגת ע"י המסלול הארוך ביותר מהשורש אשר סימון כל הצמתים שלו הוא {,2}. בדוגמא,המחרוזת המשותפת היא או.
מציאת תת מח ר ו זת א רו כ ה משותפת ל- k מח ר ו ז ו ת הבעיה: מצא תת מחרוזת ארוכה ביותר המשותפת ל- k מחרוזות נתונות S S, 2.S i הוא אורך המחרוזת L i כאשר O(L +L 2 + +L k ) בזמן,,S k 23 הרעיון כמו קודם: נבנה עץ סיומות מוכלל המכיל את הסיומות של k המחרוזות. נסמן את הצמתים ונמצא את המסלול הארוך ביותר מהשורש אשר מסומן בכול אורכו ע"י {k,,}. דוגמא לשימוש:המחרוזות הנתונות הם הגנום של מספר אורגניזמים, והמחרוזת הארוכה ביותר המשותפת להם עוזרת למציאת התאמות בן הגנומים השונים. כמובן שבשימוש זה נצטרך להכניס מגבלות נוספות, כגון מיקום תת המחרוזת בכל גנום, התאמה חלקית לחלק מהגנומים,מחרוזות משותפות נוספות, וכו.