: – חיפוש לרוחב BFS - Anat Etzion

‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫חיפוש לרוחב – ‪:BFS‬‬
‫‪ BFS‬סורק את ‪ G   V , E ‬ומייצר עץ שבו כל הצמתים ‪ R‬שהם ברי הגעה מ‪ . s -‬בנוסף‪ ,‬המרחק‬
‫בקשתות על העץ מ‪ s -‬לכל צומת ב‪ R -‬הוא מינימאלי‪.‬‬
‫נותן פיתרון ל‪:‬‬
‫‪‬‬
‫מציאת מסלול קצר ביותר מהמקור לכל צומת‪.‬‬
‫‪‬‬
‫גלוי צמתים ברי הגעה מהמקור‪.‬‬
‫הרעיון‪:‬‬
‫החיפוש בוחן בכל איטרציה ‪" i‬חזית" המורכבת מצמתים במרחק ‪ i‬מ‪ . s -‬עבור ‪ i  0‬האלגוריתם‬
‫יגלה את כל הצמתים במרחק ‪ i‬לפני כל הצמתים במרחק ‪  i  1 ‬מ‪. s -‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬וצומת מקור ‪. s‬‬
‫פלט‪ :‬לכל ‪ , d [ v ] , v  V‬המרחק מ‪ s -‬ל‪. v -‬‬
‫‪for each u  V \ { s } :‬‬
‫‪p [ u ]  null .‬‬
‫‪d [u ]   ,‬‬
‫‪Q  em pty‬‬
‫‪enqueue  Q , s ‬‬
‫‪while Q is not empty do:‬‬
‫‪u  d eq u eu e  Q ‬‬
‫‪for each v in a d j  u  do:‬‬
‫‪d [v ]  d [u ]  1‬‬
‫‪if p [ v ]  u‬‬
‫‪en q u eu e  Q , v ‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫למה‪ :1-‬לכל קשת ‪  u , v ‬מתקיים‪. d ist  s , v   d ist  s , u  :‬‬
‫למה‪ :2-‬בסיום האלגוריתם‪ ,‬הערך ] ‪ d [ v‬מקיים ‪ d [ v ]  dist  s , v ‬לכל צומת ‪. v‬‬
‫למה‪ :3-‬נניח שבמהלך ביצוע ‪ BFS‬התור מכיל את } ‪, v n‬‬
‫‪‬‬
‫‪. d [ v r ]  d [ v1 ]  1‬‬
‫‪‬‬
‫] ‪d [ v i ]  d [ v i 1‬‬
‫‪ , {v1 ,‬אז מתקיים‪:‬‬
‫כלומר‪ :‬בת ור יש צמתים משתי רמות לכל היותר‪ ,‬ויש מונוטוניות ברמות הצמתים שבתור‪.‬‬
‫מסקנה‪ :‬נניח ש‪ vi -‬נכנס ל‪ Q -‬לפני ‪ , v j‬אז בזמן ש‪ v j -‬נכנס לתור מתקיים‪. d [ v i ]  d [ v j ] :‬‬
‫משפט‪ :‬הרצת ‪ BFS‬על גרף ‪( G‬מכוון או לא מכוון) עם צומת מקור ‪ , s‬מגלה כל צומת ישיג מ‪s -‬‬
‫ובסיום האלגוריתם‪. d [ v ]  dist  s , v  :‬‬
‫‪1‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫מיון טופולוגי‪:‬‬
‫מיון טופולוגי של ‪ G‬הוא סידור ליניארי של ‪ V‬כך שאם ‪ , u v  E‬אז ‪ u‬לפני ‪ v‬בסידור‪.‬‬
‫אם בגרף יש מעגל מכוון אז אין לגרף מיון טופולוגי‪.‬‬
‫)‪ -DAG (Directed Acyclic Graph‬גרף מכוון שאין בו מעגלים מכוונים‪.‬‬
‫אלגוריתם למיון טופולוגי של ‪:DAG‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬שהוא ‪.DAG‬‬
‫פלט‪ :‬מיון טופולוגי של הגרף‪.‬‬
‫‪ .1‬חשב את קבוצת כל המקורות בגרף‪ ,‬נסמנה ב‪. S -‬‬
‫‪ .4‬אתחל ‪. l  1‬‬
‫‪ .4‬כל עוד ‪: V  ‬‬
‫‪ 4.1‬בחר ‪v  S‬‬
‫‪ 4.4‬קבע ‪L  v   l‬‬
‫‪ 4.4‬קבע ‪. l  l  1‬‬
‫‪ 4.3‬הסר את ‪ v‬מהגרף‪ ,‬יחד עם הקשתות היוצאות ממנו‪.‬‬
‫‪ 4.3‬קבע }‪. S  S \ {v‬‬
‫‪ 4.3‬הוסף ל‪ S -‬את כל הצמתים מבין } ‪ {u : vu  E‬שהם מקורות‪.‬‬
‫‪ .3‬החזר את ‪. L‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫טענה‪ :1-‬בכל ‪ G   V , E  DAG‬כך ש ‪ , V  ‬קיים מקור‪.‬‬
‫סיבוכיות ואורך הקלט‪:‬‬
‫לצורך ייצוג מספר בגודל ‪ n‬נדרשים‪ m  log 2 n :‬ביטים ולכן אורך הקלט הוא‪ .   lo g n  :‬אם יש‬
‫לנו מספר ‪ n‬בקלט‪ ,‬הסיבוכיות צריכה להיות פולינומיאלית ב‪ . log n -‬אם זה לא המצב והסיבוכיות‬
‫היא פולינומיאלית דווקא ב‪ , n -‬נאמר שהאלגוריתם‪ -‬פסאודו פולינומיאלי‪.‬‬
‫אם נתון לנו גרף ‪ G   V , E ‬אז הסיבוכיות צריכה להיות פולינומיאלית ב‪. | V |, | E | -‬‬
‫‪2‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫גרף דו‪-‬צדדי‪:‬‬
‫בהינתן גרף לא מכוון ‪ , G   V , E ‬האלגוריתם מכריע האם ‪ G‬הוא גרף דו‪-‬צדדי‪.‬‬
‫טענה‪ :1-‬יהא ‪ G   V , E ‬גרף לא מכוון‪ ,‬ויהא ‪ G . s  V‬הוא גרף דו‪-‬צדדי אם"ם‬
‫‪( uv  E  d s  u   2 d s  v ‬שקילות מודולו ‪.)4‬‬
‫טענה‪ :2-‬יהא ‪ G   V , E ‬גרף דו‪-‬צדדי עם צדדים ‪ . L , R‬יהא ‪ p‬מסלול בין ‪ u‬ו‪ . v -‬אזי אורך‬
‫המסלול ‪ p‬הוא זוגי אם"ם ‪ u , v‬נמצאים באותו צד‪.‬‬
‫האלגוריתם‪:‬‬
‫‪ .1‬הרץ ‪ BFS‬מצומת שרירותי ‪. s  V‬‬
‫‪ .4‬החזר " ‪ G‬דו צדדי" אם"ם לכל קשת ‪ u v  E‬מתקיים ‪. d s  u   2 d s  v ‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫אפיון נוסף‪ :‬גרף הוא דו‪-‬צדדי אם"ם הוא אינו מכיל מעגלים באורך אי‪-‬זוגי‪.‬‬
‫מסלולים זוגיים קצרים ביותר‪:‬‬
‫רדוקציה‪:‬‬
‫שכפול צמתי הגרף לקבוצה‪ 1-‬וקבוצה‪ 4-‬וחיבור קשתות בין צמתים מעותקים בקבוצות שונות‪ ,‬אשר‬
‫בגרף המקורי הייתה קשת שחיברה בין הצמתים המתאימים‪ .‬זהו גרף דו‪-‬צדדי‪.‬‬
‫טענה‪ :‬יהא ‪ G   V , E ‬גרף לא מכוון ויהא ‪ . s  V‬אז ‪. d seven  v   d s  v 1 ‬‬
‫‪1‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬וצומת ‪. s  V‬‬
‫פלט‪ :‬לכל צומת ‪ , v  V‬אורך המסלול הקצר ביותר מ‪ s -‬ל‪ v -‬מבין המסלולים שאורכם זוגי‪ ,‬או ‪‬‬
‫אם לא קיים מסלול כזה‪.‬‬
‫‪ .1‬בנה את הגרף ‪( G    V 1  V 2 , E  ‬לכל קשת ‪ u v  E‬נגדיר שתי קשתות ‪. u 1v 2 , u 2 v 1  E ‬‬
‫‪ .4‬הרץ ‪ BFS‬על ‪ G ‬החל מהצומת ‪. s 1‬‬
‫‪ .4‬לכל צומת ‪ v  V‬החזר‪. d s  v 1  :‬‬
‫‪1‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫‪3‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫חיפוש לעומק – ‪:DFS‬‬
‫נותן פיתרון ל‪:‬‬
‫‪‬‬
‫מציאת מעגלים בגרף‪.‬‬
‫‪‬‬
‫מציאת שורשים בגרף‪.‬‬
‫‪‬‬
‫כיוון קשתות הגרף‪.‬‬
‫הרעיון‪:‬‬
‫האלגוריתם ינסה להתקדם לעומק‪ ,‬כאשר נבקר בצומת ‪ , v‬אם ישנה קשת ‪  v , u ‬לצומת ‪ u‬שעוד‬
‫לא נתגלה‪ -‬נחצה את הקשת ונמשיך את החיפוש מ‪. u -‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬וצומת ‪ s‬ב‪. V -‬‬
‫פלט‪ :‬לכל ‪ v  V‬נקבל ] ‪ - d [ v‬זמן הגילוי של ‪ v‬ו‪ , p [ v ] -‬הצומת שגרם ל‪ v -‬להתגלות‪.‬‬
‫סימון‪ color [ u ] :‬צבע לבן או אפור‪ - f [ u ] .‬זמן היציאה האחרון מ‪. u -‬‬
‫‪for each u  V :‬‬
‫‪color[ u ] = white‬‬
‫‪p[ u ] = null‬‬
‫‪i 0‬‬
‫‪for each u  V :‬‬
‫‪if color( u ) = white then:‬‬
‫) ‪DFS_VISIT( u‬‬
‫‪DFS_VISIT( u ):‬‬
‫‪color( u ) = gray‬‬
‫‪i‬‬
‫‪d [u ]  i‬‬
‫‪for each v in a d j  u  :‬‬
‫‪if color( v ) = white then:‬‬
‫‪p[ v ]  u‬‬
‫‪DFS_VISIT( v ).‬‬
‫‪color( u ) = black.‬‬
‫‪i‬‬
‫‪f [u ]  i‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫הערות‪:‬‬
‫‪‬‬
‫בהרצות שונות ייתכנו פלטים שונים לאלגוריתם‪.‬‬
‫‪‬‬
‫‪ DFS‬ימצא גם צמתים שאינם ישיגים מ‪. s -‬‬
‫‪‬‬
‫‪ DFS‬אינו בהכרח מוצא מרחקים קצרים ביותר‪.‬‬
‫‪4‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫בסיום האלגוריתם נקבל גרף ‪ , G ‬זהו תת גרף של ‪ G‬שבו לכל צומת ‪ v‬שעבורו ‪, p [ v ]  null‬‬
‫תופיע הקשת מהאב‪ p [ v ] -‬אל ‪ v‬כפי שנמצא ע"י האלגוריתם‪.‬‬
‫סיווג קשתות‪:‬‬
‫קשתות עץ‪ :‬מופיעות ב‪. G  -‬‬
‫קשתות אחוריות‪ :‬קשת ‪  u , v ‬שמחברת את ‪ u‬לאב קדמון של ‪ u‬בעץ ‪( DFS‬לולאה עצמית תחשב‬
‫כקשת אחורית)‪.‬‬
‫קשתות קדמיות‪ :‬קשתות שאינן ב‪ . G  -‬כל קשת ‪  u , v ‬מ‪ u -‬לצאצא של ‪ u‬בעץ ‪.DFS‬‬
‫קשתות חוצות‪ :‬כל הקשתות האחרות ב‪ G -‬בין צמתים באותו עץ ‪ DFS‬ללא יחס אב קדמון‪-‬צאצא‪ ,‬או‬
‫בין עצי ‪ DFS‬שונים‪.‬‬
‫תכונות של ‪:DFS‬‬
‫‪‬‬
‫הגרף ‪ G ‬הוא יער‪ ,‬היות והמבנה של עצי החיפוש משקף את הקריאות ל‪.DFS_VISIT‬‬
‫‪‬‬
‫הצומת ‪ v‬הוא צאצא של ‪ u‬בעץ ‪ DFS‬אם ‪ v‬נתגלה כאשר ‪ u‬היה אפור ולפני שקבענו ערך‬
‫ל ] ‪. f [u‬‬
‫‪‬‬
‫תכונת הסוגריים‪ :‬נייצג את הגילוי של צומת ‪ v‬ע"י סוגר שמאלי ‪ (v‬ואת סיום הטיפול ב‪ v -‬ע"י‬
‫סוגר ימני ) ‪ . v‬אז ההיסטוריה של גילוי וסיום הטיפול בצמתים מגדירה ביטוי שבו הסוגריים‬
‫מקוננים היטב‪ .‬למשל‪. ( u ( v ( y ( xx ) y ) v ) u )( w ( zz ) w ) :‬‬
‫משפט הסוגריים‪ :‬בכל חיפוש לעומק בגרף מכוון או לא מכוון ‪ , G‬לכל שני צמתים ‪ u , v‬מתקיים‬
‫בדיוק אחד מ‪ 4-‬התנאים‪:‬‬
‫‪ .1‬האינטרוולים ‪  d [ u ], f [ u ] ‬ו‪  d [ v ], f [ v ]  -‬זרים לחלוטין ואז אין קשר של אב קדמון‪/‬צאצא בין‬
‫הצמתים ‪. u , v‬‬
‫‪ .4‬האינטרוול ‪  d [ u ], f [ u ] ‬מוכל ממש ב ‪ ,  d [ v ], f [ v ] ‬ואז ‪ u‬צאצא של ‪ v‬בעץ ‪.DFS‬‬
‫‪ .4‬האינטרוול ‪  d [ v ], f [ v ] ‬מוכל ממש ב‪  d [ u ], f [ u ]  -‬ואז ‪ u‬אב קדמון של ‪ v‬בעץ ‪\.DFS‬‬
‫מסקנה‪ :‬צומת ‪ v‬הוא צאצא של צומת ‪ u‬ביער ‪ DFS‬עבור גרף מכוון‪/‬לא מכוון ‪ G‬אם"ם‬
‫] ‪. d [u ]  d [ v ]  f [ v ]  f [u‬‬
‫משפט המסלול הלבן‪ :‬ביער ‪ DFS‬מכוון‪/‬לא מכוון‪ ,‬צומת ‪ v‬הוא צאצא של ‪ u‬אם"ם בזמן ] ‪ , d [ u‬הזמן‬
‫בו ‪ u‬התגלה‪ ,‬ניתן להגיע מ‪ u -‬ל‪ v -‬על מסלול המורכב כולו מצמתים לבנים‪.‬‬
‫תכונות מהתרגול‪:‬‬
‫‪‬‬
‫בגרפים מכוונים יש רק קשתות עץ או קשתות אחוריות‪.‬‬
‫‪‬‬
‫הרצת ‪ DFS‬תסווג קשת כאחורית אם"ם יש מעגל בגרף‪.‬‬
‫‪‬‬
‫בהרצת ‪ DFS‬על גרף מכוון ‪ , G   V , E ‬נסמן את הקשתות שסווגו כאחוריות ב‪ . F  E -‬אז‬
‫הגרפים ‪  V , F ‬ו‪  V , E \ F  -‬הם ‪.DAG‬‬
‫‪‬‬
‫הסדר ההפוך לזה המושרה ע"י זמני הנסיגה מהצמתים הוא מיון טופולוגי‪.‬‬
‫‪‬‬
‫בכל הרצת ‪ ,DFS‬עץ ה‪ DFS-‬האחרון מכיל את ‪ - RG‬קבוצת שורשי הגרף‪.‬‬
‫‪5‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫רכיבים קשירים היטב‪:‬‬
‫רכיב קשיר היטב‪ :‬בגרף מכוון ‪ G   V , E ‬זו קבוצה מקסימאלית של צמתים ‪ C‬ב‪ V -‬כך שלכל זוג‬
‫צמתים ‪ u , v‬ב‪ C -‬יש מסלול מכוון מ‪ v -‬ל‪ u -‬ומ‪ u -‬ל‪( . v -‬ייתכן מצב בו צומת בודד הוא הכי קשיר‬
‫היטב)‪.‬‬
‫הגרף ההפכי‪ :‬עבור גרף מכוון ‪ G   V , E ‬הוא‬
‫‪‬‬
‫‪T‬‬
‫‪ V , E‬‬
‫‪T‬‬
‫‪ G‬כך ש ‪   u , v  |  v , u   E ‬‬
‫‪T‬‬
‫‪E‬‬
‫דהיינו‪ ,‬הופכים את כיווני הקשתות ב‪ . G -‬ב‪ G -‬וב‪ G T -‬יש אותם רכיבים קשירים היטב‪.‬‬
‫ניתן ליצור את ‪ G T‬ב‪. O  V  E  -‬‬
‫האלגוריתם‪:‬‬
‫‪ .1‬מצא בעזרת ‪ DFS‬את ערכי ] ‪ f [ v‬לכל צומת‪.‬‬
‫‪ .4‬הפוך את כיווני הקשתות וצור את הגרף ‪. G T‬‬
‫‪ .4‬הפעל ‪ DFS‬על הגרף ההפוך אבל בחר את הצמתים בלולאה הראשית לפי סדר יורד של ] ‪. f [ v‬‬
‫‪ .3‬כל עץ ‪ DFS‬שמתקבל הוא רכיב קשיר היטב‪.‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫למה‪ :1-‬יהיו ‪ C , C ‬שני רק"ה שונים בגרף מכוון‪ . G -‬ויהיו ‪ u , v‬ב‪ C -‬ו ‪ u , v ‬ב‪ . C  -‬נניח שיש‬
‫מסלול מכוון מ‪ u -‬ל‪ u  -‬ב‪ , G -‬אז לא ייתכן מסלול מכוון מ ‪ v ‬ל‪. v -‬‬
‫מסקנה‪ :‬גרף הרכיבים הוא ‪.DAG‬‬
‫הרחבת הגדרות "זמן גילוי" ו"זמן סיום" לקבוצת צמתים‪: U  V ,‬‬
‫‪ u ‬‬
‫‪d‬‬
‫‪u ‬‬
‫‪‬‬
‫‪‬‬
‫‪u U‬‬
‫‪f‬‬
‫‪u U‬‬
‫‪m in‬‬
‫‪‬‬
‫‪d U‬‬
‫‪‬‬
‫‪f U‬‬
‫‪ m ax‬‬
‫למה‪ :2-‬יהיו ‪ C , C ‬שני רק"ה בגרף מכוון ‪ . G   V , E ‬נניח שיש קשת ‪  u , v ‬כאשר‬
‫‪ , u  C , v  C ‬אז ‪. f  C   f  C  ‬‬
‫‪T‬‬
‫מסקנה‪ :‬יהיו ‪ C , C ‬רק"ה שונים בגרף מכוון ‪ . G   V , E ‬נניח שיש קשת ‪  u , v   E‬כאשר‬
‫‪ , u  C , v  C ‬אז‪. f  C    f  C  :‬‬
‫גרף הרכיבים הקשירים היטב‪:‬‬
‫גרף ‪ )Strongly Connected Components( G SC C‬הוא גרף אשר צמתיו מייצגים רכיבים קשירים‬
‫היטב ב‪ G -‬וקשת מחברת בין שני צמתים ‪ u , v‬אם"ם קיים צומת ‪ u ‬ברכיב הקשיר היטב המיוצג ע"י‬
‫‪ u‬וקיים צומת ‪ v ‬ברכיב הקשיר היטב המיוצג ע"י ‪ v‬כך ש‪ u v  -‬קשת ב‪. G -‬‬
‫‪6‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫מציאת שורשי הגרף‪:‬‬
‫טענה‪ :1-‬בהרצת ‪ DFS‬על גרף מכוון החל מצומת ‪ , u‬מתקבל עץ ‪ DFS‬יחיד ביער ה‪ DFS-‬אם"ם ‪u‬‬
‫הוא שורש של הגרף‪.‬‬
‫אלגוריתם למציאת שורש אחד‪:‬‬
‫קלט‪ :‬גרף מכוון ‪. G   V , E ‬‬
‫פלט‪ :‬שורש של הגרף או הודעה כי ‪. R G  ‬‬
‫‪ .1‬הרץ ‪ DFS‬על ‪. G‬‬
‫‪ .4‬נסמן ב‪ v -‬את שורש עץ ה‪ DFS-‬האחרון‪.‬‬
‫‪ .4‬הרץ ‪ DFS‬על ‪ G‬החל מ‪. v -‬‬
‫‪ .3‬אם התקבל עץ ‪ DFS‬אחד החזר את ‪ , v‬אחרת החזר כי ‪. R G  ‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫טענה‪ :2-‬אם ‪ R G  ‬אז ‪ RG‬הוא רכיב קשיר היטב‪.‬‬
‫טענה‪ :3-‬אם ‪ R G  ‬אז הצומת הראשון במיון הטופולוגי של ‪ G SC C‬הוא ‪. RG‬‬
‫רכיבים קשירים היטב ועצי ‪:DFS‬‬
‫טענה‪ :4-‬יהא ‪ G   V , E ‬גרף מכוון ויהא ‪ U‬רק"ה של ‪ . G‬אם ‪ p‬הוא מסלול מ‪ u -‬ל‪ v -‬כאשר‬
‫‪ u , v  U‬אז ‪ p‬מוכל בשלמותו ב‪. U -‬‬
‫משפט‪ :‬יהא ‪ G   V , E ‬גרף מכוון‪ ,‬ויהא ‪ U‬רק"ה של ‪ . G‬אז לכל ריצת ‪ U ,DFS‬מוכל בשלמותו‬
‫בעץ ‪.DFS‬‬
‫גרפים קשירים למחצה‪:‬‬
‫קשיר למחצה‪ :‬גרף מכוון ‪ G   V , E ‬שעבור כל זוג צמתים ‪ u , v‬קיים מסלול מכוון מ‪ u -‬ל‪ v -‬או‬
‫מסלול מכוון מ‪ v -‬ל‪( u -‬או שניהם)‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף מכוון ‪. G   V , E ‬‬
‫פלט‪ :‬הכרעה בדבר האם ‪ G‬קשיר למחצה‪.‬‬
‫‪ .1‬חשב את ‪. G SC C‬‬
‫‪ .4‬הרץ מיון טופולוגי על ‪. G SC C‬‬
‫‪ .4‬הכרז "הגרף קשיר למחצה" אם"ם יש קשת בין כל שני צמתים עוקבים במיון‪.‬‬
‫‪7‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫עצים פורשים מינימאליים‪:‬‬
‫בהינתן גרף קשיר לא מכוון ‪ G   V , E ‬שבו לכל קשת ‪  u , v ‬יש משקל ‪ , w  u , v ‬יש למצוא עץ‬
‫פורש של הגרף שסה"כ משקל הקשתות בו הוא מינימאלי‪.‬‬
‫הרעיון‪:‬‬
‫נתקדם ע"י צביעת קשתות תוך הוספת קשתות קלות לעץ והשמטת קשתות כבדות‪ .‬האלגוריתם יקיים‬
‫בכל של את שמורת הצבע‪ -‬קיים עפ"מ שמכיל את כל הקשתות הכחולות ואף אחת מהקשתות‬
‫האדומות‪.‬‬
‫חתך (‪ :)cut‬חתך בגרף ‪ G   V , E ‬הוא חלוקה של ‪ V‬לשתי קבוצות זרות ‪ X‬ו‪ . V \ X -‬נאמר‬
‫שקשת חוצה את החתך אם קצה אחד שלה ב‪ X -‬והשני ב‪. V \ X -‬‬
‫האלגוריתם הגנרי‪:‬‬
‫הכלל האדום‪ :‬בחר מעגל חסר קשתות אדומות וצבע באדום את הקשת הלא צבועה הכבדה ביותר‪.‬‬
‫הכלל הכחול‪ :‬בחר מעגל חסר קשתות כחולות וצבע בכחול את הקשת הלא צבועה הקלה ביותר‪.‬‬
‫האלגוריתם החמדן‪ :‬הפעל את הכלל האדום והכחול (לא דטרמיניסטית) עד שכל קשתות הגרף‬
‫צבועות‪ .‬הקשתות הכחולות מהוות עפ"מ‪.‬‬
‫משפט‪ :1-‬האלגוריתם הגנרי צבוע את כל הקשתות של גרף קשיר ‪ G‬ומקיים את שמורת הצבע‪.‬‬
‫האלגוריתם של ‪:Prim‬‬
‫‪ .1‬הגדר עץ ‪ T‬והכנס לתוכו צומת כלשהו בגרף‪.‬‬
‫‪ .4‬כל עוד יש בגרף קשתות לא צבועות‪:‬‬
‫‪ 4.1‬בחר קשת קלה ביותר בחתך בין ‪ T‬לשאר הגרף וצבע אותה בכחול‪.‬‬
‫‪ 4.4‬הכנס את הצומת אליו הייתה הקשת אל ‪. T‬‬
‫‪ 4.4‬צבע באדום את כל הקשתות האחרות בחתך שמובילות אל הצומת‪.‬‬
‫‪ .4‬כל הקשתות הכחולות מגדירות עפ"מ‪.‬‬
‫סיבוכיות במימוש בעזרת מערך‪. O  V 2  :‬‬
‫סיבוכיות במימוש בעזרת ערימה‪. O  E lo g V  :‬‬
‫האלגוריתם של ‪:Kruskal‬‬
‫‪ .1‬מיין את הקשתות לפי משקל בסדר לא יורד ואתחל את ‪ T‬להיות ריק‪.‬‬
‫‪ .4‬עבור על הרשימה הממוינת ולכל קשת ‪ e‬בצע‪:‬‬
‫‪ 4.1‬אם ‪ e‬סוגרת מעגל בעץ הכחול‪ ,‬צבע את ‪ e‬באדום‬
‫‪ 4.4‬אחרת‪ ,‬צבע את ‪ e‬בכחול ובצע‪. T  T  {e} :‬‬
‫‪ .4‬החזר את אוסף קשתות ‪ T‬כעפ"מ‪.‬‬
‫סיבוכיות‪( O  E lo g E   O  E lo g V  :‬כי ‪.) log E  log V  2 log V‬‬
‫‪2‬‬
‫‪ Kruskal‬מגדל את העפ"מ כיער ההולך ומתאחד‪ Prim ,‬מתחיל מעץ קטן ובכל שלב מוסיף לו צומת‪.‬‬
‫האלגוריתמים הללו הם "שלמים"‪ -‬כל עפ"מ יכול להימצא על ידם‪.‬‬
‫‪8‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫עפ"מ צהוב ביותר‪:‬‬
‫כל קשת בגרף צבועה בצהוב או בשחור‪ .‬נרצה לתת לקשתות צהובות עדיפות על‪-‬פני קשתות‬
‫שחורות מאותו משקל‪ .‬לשם כך נגדיר פונקצית משקל חדשה‪:‬‬
‫‪e is yellow‬‬
‫‪otherw ise‬‬
‫‪2‬‬
‫‪‬‬
‫‪w e 1 / n‬‬
‫‪‬‬
‫‪w e  ‬‬
‫‪‬‬
‫‪w e‬‬
‫טענה‪ T :1-‬הוא עפ"מ צהוב ביותר לפי פונקצית המשקל ‪ w‬אם"ם ‪ T‬הוא עפ"מ לפי פונקצית‬
‫המשקל ‪. w ‬‬
‫הערה‪ :‬המונוטוניות של משקלי העצים נשמרת ללא קשר לצבע הקשתות‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף לא מכוון וקשיר ‪ G   V , E ‬ופונקצית משקל ‪. w : E  N‬‬
‫פלט‪ :‬עפ"מ צהוב ביותר של ‪. G‬‬
‫‪ .1‬חשב את פונקצית המשקל ‪. w ‬‬
‫‪ .4‬מצא עפ"מ ‪ T‬לפי פונקצית המשקל ‪ w ‬והחזר את ‪ T‬כפלט‪.‬‬
‫סיבוכיות‪. O  E lo g V  :‬‬
‫הערה‪ :‬בבעיית עפ"מ‪ ,‬כל שמשנה הוא סדר המשקלות ולא ערך המשקלות עצמם‪ .‬ולכן אם שתי‬
‫פונקציות משקל שומרות על אותו יחס סדר בין המשקלות‪ ,‬כל עפ"מ לפי פונקציה ראשונה יהיה עפ"מ‬
‫אם"ם הוא עפ"מ לפי הפונקציה השנייה‪.‬‬
‫מספר קשתות ממשקל זהה בעפ"מ‪:‬‬
‫טענה‪ :2-‬יהא ‪ G   V , E ‬גרף לא מכוון וקשיר עם פונקצית משקל ‪ . w : E  R‬אז לכל משקל‬
‫נתון‪ ,‬כל עפ"מ של ‪ G‬מכיל את אותו מספר של קשתות ממשקל זהה‪.‬‬
‫האם קיים עפ"מ המכיל קשת מסוימת‪.‬‬
‫האלגוריתם הלא יעיל‪:‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬לא מכוון וקשיר עם פונקצית משקל ‪ , w : E  R‬וקשת ‪. e  E‬‬
‫פלט‪ :‬הכרעה בדבר האם קיים עפ"מ של ‪ G‬המכיל את ‪. e‬‬
‫‪ .1‬צבע את ‪ e‬בצהוב ואת שאר הקשתות בשחור‪.‬‬
‫‪ .4‬הרץ את האלגוריתם למציאת עפ"מ צהוב ביותר‪ .‬נסמן את העץ המתקבל ב‪. T -‬‬
‫‪ .4‬החזר "כן" אם"ם ‪ e‬היא קשת ב‪. T -‬‬
‫סיבוכיות‪. O  E lo g V  :‬‬
‫טענה‪ :1-‬קשת ‪ e‬נמצאת באיזשהו עפ"מ של ‪ G‬אם"ם כל מעגל המכיל את ‪ , e‬מכיל קשת ‪e   e‬‬
‫כך ש‪. w  e    w  e  -‬‬
‫האלגוריתם היעיל‪:‬‬
‫‪ .1‬בנה את הגרף ‪ G    V , E  ‬כך ש‪E    e   E : w  e    w  e  -‬‬
‫‪ .4‬החזר "כן" אם"ם לא קיים מסלול המחבר בין שני צמתים ‪ u , v‬ב‪. G  -‬‬
‫‪9‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫סיבוכיות‪. O  V  E  :‬‬
‫האם קשת מסוימת מופיעה בכל העפ"מים‪:‬‬
‫האלגוריתם הלא יעיל‪:‬‬
‫קלט‪ :‬גרף ‪ G   V , E ‬לא מכוון וקשיר עם פונקצית משקל ‪ , w : E  R‬וקשת ‪. e  E‬‬
‫פלט‪ :‬הכרעה בדבר האם כל עפ"מ של ‪ G‬מכיל את הקשת ‪. e‬‬
‫‪ .1‬צבע את ‪ e‬בשחור ואת שאר הקשתות בצהוב‪.‬‬
‫‪ .4‬הרץ את האלגוריתם למציאת עפ"מ צהוב ביותר‪ .‬נסמן את העץ המתקבל ב‪. T -‬‬
‫‪ .4‬החזר "כן" אם"ם ‪ e‬היא קשת ב‪. T -‬‬
‫סיבוכיות‪. O  E lo g V  :‬‬
‫אלגוריתם לא יעיל נוסף‪:‬‬
‫‪ .1‬חשב את משקלו של עפ"מ של ‪. G‬‬
‫‪ .4‬הסר את ‪ e‬וחשב את משקלו של עפ"מ בגרף החדש (אם בכלל קיים)‪.‬‬
‫‪ . 4‬אם לא קיים עפ"מ בגרף החדש‪ ,‬או שמשקלו של העפ"מ בגרף החדש גדול ממשקלו של העפ"מ‬
‫בגרף המקורי‪ ,‬החזר‪" :‬כן"‪ .‬אחרת‪ ,‬החזר‪" :‬לא"‪.‬‬
‫סיבוכיות‪. O  E lo g V  :‬‬
‫טענה‪ :2-‬קשת ‪ e‬נמצאת בכל עפ"מ של ‪ G‬אם"ם כל מעגל המכיל את ‪ e‬מכיל קשת ‪ e ‬כך ש‪-‬‬
‫‪. w  e  w  e ‬‬
‫האלגוריתם היעיל‪:‬‬
‫‪ .1‬בנה את הגרף ‪ G    V , E  ‬כך ש‪E    e   E : w  e    w  e  \ { e} -‬‬
‫‪ .4‬החזר "כן" אם"ם לא קיים מסלול המחבר בין שני צמתים ‪ u , v‬ב‪. G  -‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫‪11‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫מסלולים קלים ביותר‪:‬‬
‫מסלול‪ :‬בהינתן גרף מכוון‪ /‬לא מכוון ‪ G   V , E ‬שבו לכל קשת ‪  u , v ‬משקל ‪ , w  u , v ‬המשקל‬
‫של מסלול ‪v k‬‬
‫‪ p  v 0 v1‬הוא סכום המשקלות על הקשתות ‪, v i ‬‬
‫‪k‬‬
‫‪i 1‬‬
‫‪ w v‬‬
‫‪.w p ‬‬
‫‪i 1‬‬
‫מסלול קל ביותר‪ :‬מסלול קצר ביותר מ‪ u -‬ל‪ v -‬הוא כל מסלול ‪ p‬שמקיים‪. w  p   dist  u , v  :‬‬
‫מסלולים קצרים ממקור יחיד‪:‬‬
‫טענה‪ :1-‬יהי ‪ p‬מסלול קל ביותר מ‪ s -‬ל‪ u -‬אזי כל תת‪-‬מסלול של ‪ , p‬גם הוא קל ביותר‪.‬‬
‫טענה‪( 2-‬אי‪-‬שוויון המשולש)‪ :‬לכל קשת ‪ e   u  v ‬מתקיים‪.   s , v     s , u   w  u  v  :‬‬
‫הרעיון‪ :‬נעדכן כל הזמן הפרות של אי‪-‬שוויון המשולש‬
‫האלגוריתם הגנרי‪:‬‬
‫‪ , d  s   0 .1‬ולכל ‪. d  v    , v‬‬
‫‪ .4‬כל עוד יש קשת ‪  u , v ‬עבורה סימוני ‪ d‬מפרים את אי‪-‬שוויון המשולש בצע שיפור מקומי‪:‬‬
‫‪d v   d u   w u, v ‬‬
‫‪ .4‬כשאין קשת עליה ניתן לבצע שיפור מקומי‪ ,‬אז לכל צומת מתקיים‪. d  v     v  :‬‬
‫האלגוריתם של דייקסטרה‪:‬‬
‫קלט‪ :‬גרף ממושקל מכוון ללא קשתות שליליות וצומת ‪. s‬‬
‫פלט‪ :‬לכל צומת ‪. d  v   d ist  s , v  - v‬‬
‫‪ .1‬לכל ‪ v  V‬אתחל ‪ d  v   ‬ואתחל ‪. d  s   0‬‬
‫‪ .4‬ואתחל ‪ - Q ( Q  V‬קבוצת הצמתים עבורם ‪.) d  v     v ‬‬
‫‪ .4‬כל עוד ‪ Q  ‬בצע‪:‬‬
‫‪ 4.1‬מצא ב‪ Q -‬צומת ‪ u‬בעל סימון ‪ d  u ‬מינימאלי‪.‬‬
‫‪ 4.4‬הוצא את ‪ u‬מ‪ Q -‬ולכל קשת ‪  u , v ‬בצע שיפור ‪.  u , v ‬‬
‫סיבוכיות‪. O  E lo g V  :‬‬
‫טענה‪ :1-‬יהי ‪ d  u ‬הערך ‪ d  u ‬כאשר ‪ u‬הוצא מ‪ . Q -‬אם ‪ v‬הוצא מ‪ Q -‬באיטרציה העוקבת אז‪:‬‬
‫‪. d u   d v ‬‬
‫מסקנה‪ :1-‬הטענה נכונה גם לאיטרציות שאינן עוקבות‪.‬‬
‫מסקנה‪ :2-‬הסימון של צומת ‪ , d  v  v‬אינו משתנה אחרי הוצאת ‪ v‬מ‪. Q -‬‬
‫טענה‪ :2-‬בסיום ריצת האלגוריתם לכל קשת ‪  u , v ‬מתקיים‪ , d  v   d  u   w  u , v  :‬כלומר‪ -‬לא‬
‫ניתן לשפר מקומית‪.‬‬
‫‪11‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫האלגוריתם של בלמן‪-‬פורד‪:‬‬
‫קלט‪ :‬גרף מכוון ‪ G   V , E ‬ממושקל‪ ,‬ללא מעגלים שליליים וצומת ‪. s‬‬
‫פלט‪ :‬לכל צומת ‪. d  v   d ist  s , v  - v‬‬
‫‪ .1‬לכל ‪ v  V‬אתחל‪ . d  v    :‬ואתחל ‪. d  s   0‬‬
‫‪ .4‬בצע ‪ | V |  1‬פעמים‪:‬‬
‫‪ 4.1‬לכל קשת ‪  u , v ‬בצע שיפור מקומי אם צריך‪.‬‬
‫סיבוכיות‪. O  V E  :‬‬
‫טענה‪ :‬לכל צומת ‪ , v‬אם קיים מסלול קל ביותר מ‪ s -‬ל‪ v -‬שמכיל ‪ k‬קשתות‪ ,‬אז לאחר ‪ k‬איטרציות‪:‬‬
‫‪. d  v   d ist  s , v ‬‬
‫מציאת מסלולים קלים ביותר עם קשת אחת שלילית‪:‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף מכוון ‪ G   V , E ‬עם משקלות אי‪-‬שליליים על הקשתות‪ ,‬פרט לקשת אחת ‪e   a , b ‬‬
‫שמשקלה שלילי‪ .‬וכן‪ ,‬הגרף חסר מעגלים שליליים‪ .‬ונתון צומת ‪. s  V‬‬
‫פלט‪ :‬לכל צומת ‪ , v  V‬משקל המסלול הקל ביותר מ‪ s -‬ל‪. v -‬‬
‫‪ .1‬הסר את ‪ e‬מ‪. G -‬‬
‫‪ .4‬בגרף המתקבל חשב את ‪ d s  v ‬ואת ‪ d b  v ‬לכל ‪ , v  V‬בעזרת שתי הרצות דייקסטרה‪.‬‬
‫‪ .4‬לכל צומת ‪ v  V‬החזר את הערך‪. m in  d s  a   w  e   d b  v  , d s  v  :‬‬
‫סיבוכיות‪. O  V  E lo g V  :‬‬
‫‪:All-Pairs Shortest Paths‬‬
‫טענה‪ :1-‬תהא ‪ h : V  R‬פונקצית משקל המתאימה לכל צומת מספר ממשי‪ .‬נגדיר ‪w h : E  R‬‬
‫באופן הבא‪ :‬לכל קשת ‪ u v  E‬נגדיר‪ . w h  uv   h  u   w  uv   h  v  :‬אזי‪:‬‬
‫‪ .1‬מסלול ‪ p‬מ‪ u -‬ל‪ v -‬הוא קל ביותר לפי ‪ w‬אם"ם הוא קל ביותר לפי ‪. w h‬‬
‫‪ .4‬אין מעגלים שליליים לפי ‪. w h‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף מכוון ‪ G   V , E ‬עם פונקצית משקל על הקשתות ‪ w : E  R‬ללא מעגלים שליליים‪.‬‬
‫פלט‪ :‬משקל מסלול קל ביותר מכל צומת לכל צומת‪.‬‬
‫‪ .1‬בנה גרף ‪ G    V , E  ‬כך ש‪ V   V  { s } -‬ו‪. E   E  { sv : v  V } -‬‬
‫‪ .4‬חשב את ‪  s  v ‬לכל ‪ v‬בעזרת האלגוריתם בלמן‪-‬פורד‪.‬‬
‫‪ .4‬חשב את פונקצית המשקל ‪. w   w  uv    s  u    s  v   0‬‬
‫‪s‬‬
‫‪12‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫‪ .3‬מכל צומת ‪ u  V‬הרץ דייקסטרה לחישוב משקל מסלולים קלים ביותר מ‪ u -‬לכל הצמתים‪ ,‬ביחס‬
‫לפונקצית המשקל ‪ . w ‬נסמן את הערך המתקבל ב‪. d   u , v  -‬‬
‫‪s‬‬
‫‪ .3‬עבור כל זוג צמתים ‪ u , v  V‬החזר כפלט‪. d   u , v    s  v    s  u  :‬‬
‫סיבוכיות‪:‬‬
‫‪‬‬
‫‪. O  V 2  E V log V‬‬
‫מציאת מעגל שלילי בגרף‪:‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬מטריצת שערי חליפין ‪ A‬של ‪ n‬סוגי מטבעות‪.‬‬
‫פלט‪ :‬קיומה של סדרת החלפת מטבעות המבטיחה לנו רווח‪.‬‬
‫‪ .1‬בנה את הגרף ‪ G   V , E ‬על ‪ n‬צמתים‪ .‬כל צומת ייצג מטבע‪ .‬בין כל זוג צמתים ‪ i , j‬תהיה‬
‫קשת עם משקל ‪ . w i , j‬ונגדיר ‪. w i , j   log  Ai , j ‬‬
‫‪ .4‬הרץ את בלמן‪-‬פורד מצומת שרירותי ‪ s  V‬להכרעה בדבר קיומו של מעגל שלילי בגרף‪ ,‬והחזר‬
‫כמוהו‪.‬‬
‫סיבוכיות‪. O  V E   O  n 3  :‬‬
‫הערה‪ :‬מכיוון שכל צמתי הגרף הם שורשים‪ ,‬אם קיים מעגל שלילי אז הוא ישיג מכל צומת ולכן ניתן‬
‫לבחור בשלב (‪ )4‬צומת שרירותי‪.‬‬
‫‪13‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫אלגוריתמים חמדניים‪:‬‬
‫בגישה חמדנית מבצעים בכל שלב את הצעד הטוב ביותר כרגע‪.‬‬
‫קבוצה ב"ת גדולה ביותר בגרף אינטרוולים‪:‬‬
‫נתונות ‪ n‬משימות‪ ,‬לכל משימה ‪ i‬נתון זמן התחלה ‪ si‬וזמן סיום ‪ . f i‬יש מכונה בודדת המסוגלת‬
‫לבצע בכל רגע נתון משימה אחת לכל היותר‪.‬‬
‫גרף אינטרוולים‪ :‬גרף לא מכוון כך ש‪:‬‬
‫‪ .1‬אוסף הצמתים הם אינטרוולים‪.‬‬
‫‪ .4‬יש קשת בין שני אינטרוולים אם‪:‬ם הם נחתכים‪.‬‬
‫מחפשים תת‪-‬קבוצה של צמתים שבין כל שניים אין קשת‪" -‬זרים בזוגות"‪.‬‬
‫קבוצה בלתי תלויה‪ :‬קבוצה ‪ X  V‬שבה לכל ‪ u , v  X‬אין קשת ‪.  u , v   E‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬אוסף משימות ‪, a n ‬‬
‫‪ . S   a1 ,‬לכל משימה זמן התחלה ‪ si‬וזמן סיום ‪. f i‬‬
‫פלט‪ :‬תת‪-‬קבוצה מקסימאלית ‪ A  S‬של משימות (או אינטרוולים) הזרים בזוגות‪.‬‬
‫‪ .1‬אתחל ‪ A  ‬ומיין את המשימות לפי זמני סיום לא יורדים (ונוכל להניח מעכשיו ש‪-‬‬
‫‪ fn‬‬
‫‪.) f1  f 2 ‬‬
‫‪ .4‬בנוסף אתחל ‪ i  0‬ו‪ - i ( . f 0   -‬האינדקס האחרון שהוכנס ו‪ f i -‬זו נקודת הסיום שלו)‪.‬‬
‫‪ .4‬עבור ‪ m  1‬עד ‪ n‬בצע‪:‬‬
‫‪ 4.1‬אם ‪ a m‬זר לכל המשימות ב‪ , A -‬אז } ‪A  A  { a m‬‬
‫סיבוכיות‪. O  n lo g n  :‬‬
‫הערה‪ :‬הרעיון הוא שאם המשימה שהסתיימה אחרונה ב‪( A -‬המזוהה עם האינדקס ‪ ) i‬לא נחתכת‬
‫עם ‪ a m‬אז אף‪-‬אחת לא נחתכת איתו‪.‬‬
‫טענה‪ :1-‬בסיום האיטרציה ה‪ , k -‬קיים פיתרון אופטימאלי * ‪ X‬כך שלכל ‪, 1  j  k‬‬
‫*‬
‫‪.I j  X  IJ  X‬‬
‫‪14‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫עצי הופמן וקודים פרפיקסים‪:‬‬
‫נתונים ‪ n‬תווים‪ ,‬רוצים לקודד (להחליף) כל אחד מהם במחרוזת בינארית שונה‪ .‬המטרה היא למצוא‬
‫קידוד עבור טקסט המביא למינימום את אורך הטקסט המקודד‪.‬‬
‫מילה‪ :‬רצף של ביטים‪.‬‬
‫קוד‪ :‬אוסף לא ריק של מילים‪.‬‬
‫קוד חד‪-‬פענח‪ :‬בהינתן סדרה כלשהי של אותיות‪ ,‬אחרי שנקודד את הסדרה נוכל גם לשחזר אותה‪.‬‬
‫שתי סדרות שונות לא יקודדו לאותה סדרת ביטים‪.‬‬
‫קוד פרפיקסי‪ :‬קוד שבו אף מילה היא לא פרפיקס של מילה אחרת‪ .‬קוד פרפיקסי הוא חד‪-‬פענח‪.‬‬
‫התאמה בין קודים פרפיקסים לעצים בינאריים‪:‬‬
‫לכל קוד פרפיקסי מתאים עץ בינארי‪ .‬עלי העץ הם מילות הקוד‪ .‬יהי ‪ T‬עץ בינארי כזה ותהי ‪ x‬אות‬
‫שקודדנו‪ .‬המחרוזת שתייצג את התו ‪ x‬תופיע כמסלול משורש העץ לעלה המתאים‪.‬‬
‫נסמן ב‪ d T  x  -‬את עומק העלה ששווה גם לאורך מילת הקוד שמתאימה ל‪ . x -‬אם לכל אות ‪ x‬יש‬
‫תדירות ‪ , f  x ‬מספר הביטים הדרוש לקידוד הקובץ הוא‪  f  x  d T  x  :‬‬
‫‪ . B  T‬נאמר כי ‪T‬‬
‫‪x‬‬
‫הוא אופטימאלי (עבור הקוד והתדירות הנתונים) אם הסכום הנ"ל הוא המינימאלי האפשרי‪.‬‬
‫הערה‪ :‬ניתן להראות כי קוד אופטימאלי ייוצג ע"י עץ בינארי מלא (לכל צומת פנימי שני בנים)‪ .‬מספר‬
‫העלים‪ , n :‬מספר הצמתים הפנימיים‪. n  1 :‬‬
‫למה‪ :1-‬קיים עץ אופטימאלי בו שתי מילים ‪ x , y‬בעלות תדירויות מינימאליות מתאימות לזוג עלים‬
‫אחים בעלי עומק מקסימאלי‪.‬‬
‫הרעיון‪ :‬לעבור מבעיה עם ‪ n‬מילים‪-‬‬
‫‪ n  1‬מילים‬
‫‪‬‬
‫‪,  z, f  z ‬‬
‫‪‬‬
‫‪ y ‬‬
‫‪,  x, f  x   ,  y, f‬‬
‫‪ C    w1 , f1  ,‬לבעיה עם‬
‫‪ C     w1 , f1  ,‬כאשר‪ . f  z   f  x   f  y  :‬ולאחר שנפתור‬
‫בעיה זו עבור ‪ n  1‬מילים‪ ,‬נחליף את ‪ z‬ונתייחס אליה כאל צומת פנימית עם בנים ‪. x , y‬‬
‫למה‪ :2-‬יהי ‪ C ‬הקוד המתקבל מ‪ C -‬ע"י החלפת זוג אותיות בעלות תדירויות מינימאליות באות‬
‫חדשה ‪ z‬כך ש ‪ , f  z   f  x   f  y ‬ויהי ‪ T ‬עץ אופטימאלי עבור ‪ , C ‬אז העץ ‪ T‬המתקבל מ‪-‬‬
‫‪ T ‬ע"י הפיכת העלה המתאים ל‪ z -‬לצומת פנימי ולו שני בנים ‪ , x , y‬הוא עץ אופטימאלי עבור ‪. C‬‬
‫אלגוריתם הופמן רקורסיבי לקוד פרפיקסי אופטימאלי‪:‬‬
‫)‪:Recursive_Huffman(Q‬‬
‫קלט‪ :‬ערימה ‪. Q‬‬
‫פלט‪ :‬עץ הופמן של איברי ‪. Q‬‬
‫‪ .1‬אם ‪ , | Q | 2‬קודד אות אחת ב‪ '0'-‬ואת השנייה ב‪.'1'-‬‬
‫‪ .4‬אחרת‪,‬‬
‫‪ 4.1‬הוצא מ‪ 4 Q -‬איברים ‪ x , y‬בעלי תדירות מינימאלית‪ ,‬והכנס ל‪ Q -‬איבר חדש ‪z‬‬
‫שתדירותו ‪. f  z   f  x   f  y ‬‬
‫‪ 4.4‬קרא ל‪ Recursive_Huffman(Q) -‬שמחזיר את ‪. T ‬‬
‫הוסף לעלה המתאים ל‪ z -‬את ‪ x‬ו‪ y -‬כבנים ב‪ , T  -‬והחזר את העץ שהתקבל‪. T -‬‬
‫סיבוכיות‪. O  n lo g n  :‬‬
‫‪15‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫קבוצה ב"ת גדולה ביותר ממושקלת עם אינטרוולים‪:‬‬
‫נתון אוסף משימות כאשר משימה מאופיינת כמו קודם בזמני התחלה וסיום אבל גם במשקל ‪ . w i‬יש‬
‫למצוא תת‪-‬קבוצה ב"ת של אינטרוולים שמשקלה הוא המקסימאלי האפשרי‪.‬‬
‫‪.  a1 ,‬‬
‫‪ - o p t  i ‬המחיר של פיתרון אופטימאלי כלשהו עבור המשימות ‪, a i ‬‬
‫‪ - p red  i ‬האינדקס של האינטרוול שהסתיים מאוחר ביותר מבין האינטרוולים ‪ a i‬שמסתיימים עד‬
‫‪ , si‬או ‪ 0‬אם אין כאלה‪.‬‬
‫נגדיר ‪. o p t  0   0‬‬
‫טענה‪ :‬לכל ‪ 1  i  n‬מתקיים‪:‬‬
‫‪ opt  i  1 ‬‬
‫‪. opt  i   m ax ‬‬
‫‪ opt  pred  i    w i‬‬
‫האלגוריתם‪:‬‬
‫‪ .1‬אתחל ‪ A  0    , o p t  0   0‬ומיין את המשימות בסדר לא יורד לפי זמני הסיום‪.‬‬
‫‪ .4‬לכל ‪ 1  i  n‬מצא את ‪. p red  i ‬‬
‫‪ .4‬לכל ‪ 1  i  n‬בצע‪:‬‬
‫‪ 4.1‬אם‪ o p t  i  1   o p t  p red  i    w i :‬אזי‪:‬‬
‫‪A  i   A  p red  i    { a i } 4.1.1‬‬
‫‪. o p t  i   o p t  p red  i    w i 4.1.4‬‬
‫‪ 4.4‬אחרת‪:‬‬
‫‪. A  i   A  i  1  4.4.1‬‬
‫‪o p t  i   o p t  i  1  4.4.4‬‬
‫‪ .3‬החזר את ‪. A  n ‬‬
‫סיבוכיות‪. O  n lo g n  :‬‬
‫מילה בינארית רחוקה‪:‬‬
‫מרחק בין שתי מחרוזות בינאריות באורך ‪x n : n‬‬
‫‪ x  x1 x 2‬ו‪y n -‬‬
‫‪ y  y1 y 2‬מוגדר להיות‪:‬‬
‫‪. d  x , y   i  [ n ] : xi  y i ‬‬
‫המרחק של מחרוזת ‪ w‬מקבוצת מחרוזות ‪ A‬נתון ע"י‪. d  w , A   m in  d  w , a  : a  A  :‬‬
‫הרעיון‪ :‬לבנות את ‪ w‬בצורה חמדנית‪ -‬את ‪ w i‬נקבע לערך ההפוך מהביט ה‪ i -‬המתקבל ע"י רוב‬
‫המחרוזות ב‪ A -‬אשר קרובות ביותר ל‪ w -‬כרגע‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬קבוצה ‪ A‬של ‪ k‬מחרוזות בינאריות מאורך ‪. n‬‬
‫פלט‪ :‬מחרוזת בינארית ‪ w‬כך ש‪. d  w , A     n log k  -‬‬
‫‪16‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫‪. B  A .1‬‬
‫‪ .4‬עבור על ‪ i‬מ‪ 1-‬עד‪: n -‬‬
‫‪ 4.1‬חשב כמה וקטורים יש ב‪ B -‬כך שהכניסה ה‪- i -‬ית שלהם היא ‪ 0‬וכמה כאלה יש עם ‪1‬‬
‫בכניסה זו‪ .‬אם יש יותר וקטורים עם כניסה ‪ 0‬קבע ‪ , w i  1‬אחרת‪ :‬קבע‪. w i  0 :‬‬
‫‪ 4.4‬הסר מ‪ B -‬את כל הוקטורים שהכניסה ה‪- i -‬ית שלהם שונה מהכניסה של ‪. w i‬‬
‫‪ 4.4‬אם ‪ B‬ריקה קבע ‪. B  A‬‬
‫סיבוכיות‪. O  nk  :‬‬
‫צביעה של גרפים‪:‬‬
‫צביעה חוקית‪ :‬יהא ‪ G   V , E ‬גרף לא מכוון‪ .‬צביעה חוקית של ‪ G‬היא פונקציה ‪ c : V  N‬כך‬
‫שלכל ‪ u v  E‬מתקיים‪. c  u   c  v  :‬‬
‫המספר הכרומאטי‪ :‬המספר המינימאלי של צבעים הדרוש לצביעה של גרף ‪ . G‬סימון‪.   G  :‬‬
‫נסמן ב‪ d n -‬‬
‫‪ d 1  d 2 ‬את הדרגות של צמתי הגרף‪ ,‬מסודרים בסדר לא עולה‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף לא מכוון ‪ G   V , E ‬וסדר כלשהו על הצמתים‪.‬‬
‫פלט‪ :‬צביעה חוקית ‪ c‬של ‪ G‬המשתמשת בלכל היותר ‪ d 1  1‬צבעים‪.‬‬
‫‪ .1‬עבור צומת עם הסדר הנתון של הצמתים‪ .‬יהא ‪ v‬הצומת הנוכחי‪.‬‬
‫‪ .4‬קבע את ‪ c  v ‬להיות הצבע המינימאלי שאינו בשימוש ע"י שכניו של ‪. v‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫אלגוריתם חמדן משופר‪:‬‬
‫קלט‪ :‬גרף לא מכוון ‪. G   V , E ‬‬
‫פלט‪ :‬צביעה של ‪ G‬בלכל היותר ‪ d   G   1‬צבעים‪.‬‬
‫‪ .1‬מיין את צמתי הגרף לפי דרגותיהם‪ ,‬מהגבוה לנמוך‪.‬‬
‫‪ .4‬הרץ את האלגוריתם הקודם עם הצמתים מסודרים לפי המיון משלב (‪.)1‬‬
‫סיבוכיות‪. O  V  E lo g E  :‬‬
‫הערה‪ :‬האלגוריתם הוכיח אי‪-‬שוויון קומבינטורי מעניין‪.   G   d   G   1 :‬‬
‫שברים מצריים‪:‬‬
‫טענה‪ :‬כל מספר רציונאלי בתחום ‪  0,1 ‬ניתן לכתיבה כסכום סופי של שברים מצריים שונים‪.‬‬
‫האלגוריתם‪ :‬כל עוד אין בידינו דבר מצרי‪ ,‬מצא את השבר המצרי הגדול ביותר שנכנס בתוך (כלומר‪,‬‬
‫הקטן מ) השבר שבידינו‪ -‬שבר זה יהיה אחד המחוברים‪ .‬על ההפרש נריץ את האלגוריתם ברקורסיה‪.‬‬
‫‪17‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫כיסוי בצמתים של עצים‪:‬‬
‫כיסוי בצמתים (‪ :)Vertex Cover‬בהינתן גרף לא מכוון ‪ , G   V , E ‬כיסוי בצמתים של ‪ G‬הוא‬
‫קבוצת צמתים ‪ U  V‬כך שלכל קשת ‪ , u v  E‬לפחות אחד מהצמתים ‪ u , v‬שייך ל‪. U -‬‬
‫הרעיון‪ :‬נביט בעלה ‪ v‬של העץ‪ .‬יהיה ‪ u‬השכן (היחיד) שלו‪ .‬כל כיסוי חייב לכסות את הקשת ‪uv‬‬
‫ולכן בהכרח מכיל אחד מבין ‪ . u , v‬נבחין כי אין טעם לקחת את ‪ v‬לכיסוי שכן ‪ v‬מכסה אך ורק את‬
‫‪ uv‬וזאת לעומת ‪ u‬שאולי מכסה גם קשתות נוספות‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬עץ לא מכוון ‪. G   V , E ‬‬
‫פלט‪ :‬כיסוי צמתים ל‪G -‬‬
‫‪. U   .1‬‬
‫‪ .4‬כל עוד לא קיים עלה ‪ v‬ב‪: G -‬‬
‫‪ 4.1‬הוסף את ‪ , u‬השכן של ‪ v‬ל‪. U -‬‬
‫‪ 4.4‬הסר את כל הקשתות הנוגעות ב‪. u -‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫טענה‪ :1-‬בכל יער בו יש קשת אחת לפחות‪ ,‬יש שני עלים‪ .‬ולכן כל עוד יש קשתות בגרף‪ ,‬יש עלה‪.‬‬
‫טענה‪ :2-‬לכל ‪ i‬קיים כיסוי מינימאלי המכיל את הצמתים ‪, v i‬‬
‫‪( v1 , v 2 ,‬סדר הכניסה ל‪.) U -‬‬
‫קידוד הופמן‪:‬‬
‫טענה‪ :‬אם כל תו מופיע בקובץ בתדירות קטנה ממש מ‪ 1 3 -‬אזי בהכרח בעץ הופמן לא תהיה מילת‬
‫קוד מאורך ‪.1‬‬
‫טענה‪ :‬לכל אלגוריתם כיווץ ולכל אורך ‪ n‬טבעי‪ ,‬קיימת מילה ‪ x  {0,1} n‬שהאלגוריתם אינו מכווץ‪.‬‬
‫‪18‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫תכנות דינאמי‪:‬‬
‫סידור אופטימאלי לכפל של ‪ n‬מטריצות‪:‬‬
‫נתונה סדרה של ‪ n‬מטריצות‪, An :‬‬
‫‪ A1 , A2 ,‬ונרצה לחשב את המכפלה‪ An :‬‬
‫‪ . A1  A2 ‬הסדר‬
‫בו נבצע את ההכפלות ישפיע במידה רבה על סיבוכיות החישוב‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ n :‬מטריצות ‪, An‬‬
‫‪ A1 ,‬כאשר מטריצה ‪ Ai‬ממימד ‪. p i 1  p i‬‬
‫‪. A1 ‬‬
‫פלט‪ :‬סידור סוגריים אופטימאלי למכפלה ‪ An‬‬
‫נחזיק מערך דו‪-‬מימדי ] ‪ , m [ i , j‬שישמור בכניסה ה‪ i , j -‬את מספר ההכפלות המינימאלי בהכפלת‬
‫‪ Aj‬‬
‫‪ . Ai ‬ונרצה לקבל כפלט את ] ‪. m [1, n‬‬
‫נחשב את ] ‪ m [ i , j‬באופן רקורסיבי‪:‬‬
‫ אם ‪ , i  j‬אז השרשרת מכילה מטריצה בודדת ולכן ‪. m [ i , j ]  0‬‬‫ אם ‪ , i  j‬נניח שיש השמת סוגריים אופטימאלית שמפצלת את ‪, A j‬‬‫מספר המכפלות עבור ‪, A j‬‬
‫‪ , Ai ,‬בין ‪ Ak‬ל‪ , Ak 1 -‬אז‬
‫‪ Ai ,‬הוא‪ . m [ i , j ]  m [ i , k ]  m [ k  1, j ]  p i 1  p k  p j :‬כעת יש‬
‫‪B1  B 2‬‬
‫‪B1‬‬
‫‪B2‬‬
‫‪  j  1 ‬אפשרויות לבחירת ‪ k‬ולכן‪:‬‬
‫‪i j‬‬
‫‪i j‬‬
‫‪ 0‬‬
‫‪m [i, j ]  ‬‬
‫‪m in m [ i , k ]  m [ k  1]  p i 1  p k  p j ‬‬
‫‪ i  k  j ‬‬
‫‪ .1‬עבור ‪ 1  i  n‬בצע‪. m [ i , i ]  0 :‬‬
‫‪ .4‬עבור ‪ j  1‬עד ‪ n  1‬בצע‪( :‬אורך הרצפים נקבע ע"פ ‪.) j‬‬
‫‪ 4.1‬עבור ‪ l  1‬עד ‪ n  j‬בצע‪( :‬המטריצה השמאלית ביותר נקבעת לפי ‪) l‬‬
‫‪. m [ l , l  j ]  m in  m [ l , k ]  m [ k  1, l  j ]  p l 1 p k p l  j  4.1.1‬‬
‫‪lk l  j‬‬
‫סיבוכיות‪. O  n 3  :‬‬
‫‪19‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫אלגוריתם פלויד וורשל למציאת כל המסלולים הקלים ביותר‪:‬‬
‫‪i j‬‬
‫‪0‬‬
‫‪‬‬
‫‪w  i, j    w  i, j ‬‬
‫‪‬‬
‫‪‬‬
‫פונקצית המשקל המוכללת‪ i , j   E :‬‬
‫‪otherw ise‬‬
‫פונקצית חסם עליון המוכללת‪ :‬פו' ‪ d : V  V  R‬שמקיימת‪. dist  i , j   d  i , j   w  i , j  :‬‬
‫כלל שיפור מקומי‪ :‬עבור השלשה ‪ :  i , k , j ‬אם ‪ d  i , k   d  k , j   d  i , j ‬אז‪:‬‬
‫‪. d  i, j   d  i, k   d  k , j ‬‬
‫טענה‪ :‬אם ‪ d‬פונקצית חסם עליון מוכללת והופעל עליה כלל שיפור מקומי‪ ,‬אז אחרי העדכון ‪d‬‬
‫נותרה פונקצית חסם עליון מוכללת‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ , G   V , E  :‬פונקצית משקל ‪ w : E  R‬ובה"כ‪, n} :‬‬
‫‪. V  {1, 2,‬‬
‫פלט‪ :‬לכל זוג צמתים לכל זוג צמתים ‪. d  i , j   d ist  i , j  -  i , j   V‬‬
‫‪ .1‬לכל זוג צמתים ‪  i , j ‬בצע‪. d  i , j   w  i , j  :‬‬
‫‪ .4‬עבור ‪ k  1‬עד ‪ n‬בצע‪:‬‬
‫‪ 4.1‬לכל זוג צמתים ‪ i , j‬בצע שיפור ‪  i , k , j ‬כלומר‪:‬‬
‫‪. d  i , j   m in  d  i , j  , d  i , k   d  k , j ‬‬
‫‪k‬‬
‫סיבוכיות‪. O  V 3  :‬‬
‫רמה‪ :k-‬מסלולים שמכילים בתור צמתים פנימיים רק צמתים מ‪ 1-‬עד‪.k -‬‬
‫‪ : dist    i , j ‬משקל המסלול המינימאלי מבין כל המסלולים ברמה ה‪ k -‬מ‪ i -‬ל‪ j -‬או ‪ ‬אם אין‬
‫‪k‬‬
‫מסלול כזה‪.‬‬
‫למה‪ :1-‬לכל ‪ , o  k  n‬אחרי איטרציה ‪ k‬מתקיים‪. d  i , j   dist    i , j  :‬‬
‫‪k‬‬
‫‪ dist  k 1   i , j ‬‬
‫טענה‪ :‬לכל ‪: 1  k  n‬‬
‫‪ i , j   m in   k 1‬‬
‫‪k 1‬‬
‫‪ i , k   dist    k , j ‬‬
‫‪ dist‬‬
‫‪k ‬‬
‫‪. dist‬‬
‫‪21‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫‪:Knapsack‬‬
‫‪ a1 ,‬עם משקלים חיוביים‬
‫נתון תרמיל גב שלו קיבולת משקל ‪ W‬ונתונים ‪ n‬עצמים ‪, a n‬‬
‫‪ . w1 ,‬לכל עצם ‪ a i‬מותאם מספר ‪ p i‬המציין את החשיבות של העצם‪ .‬רוצים להכניס לשק‬
‫‪, wn‬‬
‫קבוצת עצמים שחשיבותם מקסימאלית‪ .‬כלומר‪:‬‬
‫‪wi  W‬‬
‫‪‬‬
‫‪‬‬
‫‪p i  m ax   p j‬‬
‫‪‬‬
‫‪‬‬
‫‪1 i  n‬‬
‫‪‬‬
‫‪wj  W ‬‬
‫‪‬‬
‫‪‬‬
‫‪and‬‬
‫נסמן ב‪ F  k , w  -‬את הרווח המקסימאלי כאשר בוחרים עצמים מתוך ‪, a k‬‬
‫‪1 i  n‬‬
‫‪ a1 ,‬בלבד‪ ,‬וגודל‬
‫התרמיל הוא ‪ . w‬אנו רוצים לחשב את ‪. F  n , W ‬‬
‫טענה‪ :1-‬אם ‪ k  0‬או ‪ w  0‬אז ‪ . F  k , w   0‬אחרת‪:‬‬
‫‪wk  w‬‬
‫‪otherw ise‬‬
‫‪‬‬
‫‪‬‬
‫‪ F  k  1, w ‬‬
‫‪F k, w  ‬‬
‫‪m ax  F  k  1, w  , p k  F  k  1, w  w k‬‬
‫‪‬‬
‫‪‬‬
‫כלומר‪ :‬אם המשקל חוקי‪ ,‬נרצה את המקסימאלי מבין רצף ההכנסות שכולל את הפריט ורצף‬
‫ההכנסות שלא כולל את הפריט‪.‬‬
‫האלגוריתם‪:‬‬
‫צור מטריצה ‪ A‬מגודל ‪  n  1    W  1 ‬ומלא את השורה המתאימה ל ‪ k  0‬עד לשורה‬
‫המתאימה ל‪ , k  n -‬כאשר כל שורה מלא בסדר כלשהו‪ .‬את חישוב כניסות המטריצה בצע לפי‬
‫הנוסחה שבטענה‪ .1-‬בסיום החזר את ] ‪. A[ n , W‬‬
‫סיבוכיות‪( O  n W  :‬כל כניסה ב‪ .) O  1  -‬סיבוכיות פסאודו פולינומיאלית‪.‬‬
‫הערה‪ :‬ניתן למצוא מהו הפיתרון (ולא רק את ערכו) ע"י סימון איזו כניסה עדכנה את הכניסה הנוכחית‬
‫במטריצה‪.‬‬
‫קבוצה בלתי תלויה מקסימאלית בעץ‪:‬‬
‫מציאת קבוצה בלתי תלויה מקסימאלית בעץ מכוון ‪. T   V , E ‬‬
‫הרעיון‪ :‬נכוון את העץ ונסמן ב‪ r -‬את השורש‪ .‬ולכל צומת ‪ v‬נסמן‪:‬‬
‫ ‪ : S  v ‬גודל קבוצה ב"ת מקסימאלית בתת עץ ש‪ v -‬שורשו הכוללת את ‪. v‬‬‫‪‬‬
‫ ‪ : S  v ‬גודל קבוצה ב"ת מקסימאלית בתת עץ ש‪ v -‬שורשו שאינה כוללת את ‪. v‬‬‫‪‬‬
‫‪ : S  v  -‬גודל קבוצה ב"ת מקסימאלית בתת עץ ש‪ v -‬שורשו‪ ,‬ללא הגבלות‪.‬‬
‫‪ v  , S   v ‬‬
‫טענה‪ :2-‬לכל ‪ v  V‬מתקיים‪:‬‬
‫‪u ‬‬
‫‪‬‬
‫‪S‬‬
‫‪‬‬
‫‪S  v   m ax  S‬‬
‫‪v  1 ‬‬
‫‪‬‬
‫‪S‬‬
‫‪u  child  v ‬‬
‫‪S u ‬‬
‫‪v  ‬‬
‫‪‬‬
‫‪S‬‬
‫‪u  child  v ‬‬
‫‪21‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬עץ לא מכוון ‪. T   V , E ‬‬
‫פלט‪ :‬גודל קבוצה בלתי תלויה מקסימאלית‪.‬‬
‫‪ .1‬הרץ ‪ DFS‬על ‪ T‬עם הווריאציה הבאה‪ :‬בכל פעם שמבצעים נסיגה מצומת ‪ , v‬חשב את‬
‫‪. S  v, S  v, S v‬‬
‫‪ .4‬החזר את ‪. S  r ‬‬
‫סיבוכיות‪. O  V  E  :‬‬
‫קבוצה בלתי תלויה מקסימאלית בגרף כללי‪:‬‬
‫האלגוריתם‪:‬‬
‫‪. S   .1‬‬
‫‪ .4‬כל עוד ‪: V  ‬‬
‫‪ 4.1‬בחר צומת ‪ v  V‬בעל דרגה מינימאלית ‪ d‬בגרף הנוכחי‪.‬‬
‫‪ 4.4‬הוסף את ‪ v‬ל‪. S -‬‬
‫‪ 4.4‬מחק את ‪ v‬ואת כל שכניו _עם הקשתות החלות עליהם) מ‪. G -‬‬
‫‪ .4‬החזר את ‪. S‬‬
‫סיבוכיות‪O  V  E  :‬‬
‫משפט‪ :‬האלגוריתם מחזיר קבוצה ב"ת עם‬
‫‪n‬‬
‫‪ 1‬‬
‫צמתים‪ ,‬כאשר ‪ ‬זו הדרגה המינימאלית בגרף‪.‬‬
‫תת‪-‬סדרה מונוטונית ארוכה ביותר‪:‬‬
‫תהא ‪, a n‬‬
‫‪ a1 , a 2 ,‬סדרת מספרים‪ .‬נחפש תת‪-‬סדרה מונוטונית לא יורדת ארוכה ביותר של הסדרה‪.‬‬
‫הרעיון‪ :‬נמצא לכל ‪ , k‬אורך תת‪-‬סדרה מונוטונית לא יורדת ארוכה ביותר של הסדרה המסתיימת ב‪-‬‬
‫‪ . a k‬כלומר הערך המבוקש הוא‪. m ax T  k  : k  n  :‬‬
‫‪ - A  k    j : j  k and a j  a k ‬קבוצת האינדקסים של כל האיברים שיכולים להופיע לפני ‪a k‬‬
‫בתת‪-‬סדרה מונוטונית‪.‬‬
‫טענה‪:‬‬
‫‪Ak   ‬‬
‫‪Ak   ‬‬
‫‪j  A  k ‬‬
‫‪ j:‬‬
‫‪ m ax T‬‬
‫‪T k   1 ‬‬
‫‪ 0‬‬
‫סיבוכיות‪ :‬כל ערך ‪ T  k ‬ניתן לחשב ב‪ O  k  -‬ולקיחת מקסימום על כולם תיתן‪. O  n 2  :‬‬
‫‪22‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫בעיית הסוכן הנוסע האוקלידית הביטונית‪:‬‬
‫נתונות ‪ n‬נקודות במישור‪ ,‬יש לחשב את המעגל הקצר ביותר המחבר את כל הנקודות‪.‬‬
‫מעגל ביטוני‪ :‬מסלול המתחיל בנקודה השמאלית ביותר‪ ,‬מתקדם ימינה דרך חלק מהנקודות ואז‬
‫חוזר שמאלה דרך כל הנקודות הנותרות‪.‬‬
‫הרעיון‪ :‬נסמן את הנקודות ב‪, p n -‬‬
‫‪ p1 , p 2 ,‬לפי קואורדינאטת ‪ x‬עולה‪ .‬ניסוח שקול לבעיה‪ :‬שני‬
‫סוכנים שרוצים לנוע מ‪ p1 -‬ל‪ p n -‬תוך שהם נעים ימינה בלבד‪ ,‬יחדיו מבקרים בכל הנקודות אך אינם‬
‫מבקרים באותה נקודה‪ .‬מציאת זוג מסלולים כאלה משרה מסלול ביטוני‪.‬‬
‫‪ - d  i , j ‬המרחק בין הנקודות ‪. p i , p j‬‬
‫‪ - B  i ‬אורך מסלול ביטוני קצר ביותר עבור הנקודות ‪, p i‬‬
‫‪ . p1 ,‬נרצה לחשב את ‪. B  n ‬‬
‫‪ - B  i , j ‬נתנה את המסלול בנקודה‪ j -‬שבה מבקר הסוכן לפני שביקר בנקודה האחרונה‪. i -‬‬
‫‪i 1‬‬
‫‪ d  k , k  1‬‬
‫‪k  j 1‬‬
‫‪ j, i ‬‬
‫‪‬‬
‫‪d‬‬
‫‪d is tan ce for 1 st ' till i‬‬
‫‪‬‬
‫‪j  1‬‬
‫‪ j,‬‬
‫‪d‬‬
‫‪no one visit both j & j  1‬‬
‫‪B  j  1‬‬
‫‪‬‬
‫‪B  i, j  ‬‬
‫‪length w hrn both finish at j  1‬‬
‫‪dis tan ce for 2 nd : all dots from j  1 to i‬‬
‫ואז החישוב המבוקש יהיה‪B  i   m in  B  i , j  : j  [ i  2] :‬‬
‫סיבוכיות‪. O  n 3  :‬‬
‫רווח מקסימאלי בתורת המשחקים‪:‬‬
‫משחק שבו הרווח המקסימאלי של כל שחקן הינו סכום מספריו פחות סכום השחקן השני‪.‬‬
‫הרעיון‪:‬‬
‫עבור ‪ i  j‬נסמן ב‪ T  i , j  -‬את הרווח של אליס עבור משחק על הסדרה ‪, a j‬‬
‫הרקורסיבי הוא היחס הבא‪:‬‬
‫‪i j‬‬
‫‪i j‬‬
‫‪ . a i , a i  1 ,‬היחס‬
‫‪‬‬
‫‪ ai‬‬
‫‪T  i, j   ‬‬
‫‪m ax  a i  T  i  1, j  , a j  T  i , j  1 ‬‬
‫‪‬‬
‫‪‬‬
‫אם ‪ : i  j‬יש רק איבר אחד בסדרה ולכן אין ברירה אלא לקחת אותו ולהרוויח ‪. a i‬‬
‫אחרת‪ ,‬יש בחירה בין לקחת ‪ a i‬ל‪-‬לקחת ‪ . a j‬ואז לפי הבחירה‪ ,‬התור עובר לשחקן השני והסכום‬
‫שהוא הרוויח עקב בחירה זו‪ ,‬יורק מסכום השחקן הראשון ולכן המינוס‪.‬‬
‫סיבוכיות‪. O  n 2  :‬‬
‫‪23‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫רשתות זרימה וזרימת מקסימום‪:‬‬
‫אפיוני רשתות זרימה‪:‬‬
‫ קיבולת על הקשתות שחוסמת את כמות הזרימה על כל קשת‪.‬‬‫ צומת מקור שמייצר זרימה‪.‬‬‫ צומת בור (או "יעד") שקולט את הזרימה‪.‬‬‫ זרימה על הקשתות‪.‬‬‫תכונות של זרימה ברשתות‪:‬‬
‫נסמן ב‪ f  e  -‬את הזרימה על הקשת המכוונת ‪. e  E‬‬
‫אילוץ הקיבול‪ :‬הזרימה דרך הקשת ‪ e‬אינה יכולה לחרוג מקיבול הקשת‪ ,‬כלומר‪:‬‬
‫‪.0  f e  c e‬‬
‫שימור הזרימה‪ :‬לכל הצמתים } ‪ , v  V \ { s , t‬סה"כ הזרימה שנכנסת ל‪ v -‬שווה לסה"כ הזרימה‬
‫שיוצאת מ‪. v -‬‬
‫ערך פונקצית הזרימה‪ :‬סה"כ הזרימה מהמקור לבור‪ ,‬סימון‪ | f | :‬או ‪F‬‬
‫‪‬‬
‫‪f e‬‬
‫‪‬‬
‫‪f e ‬‬
‫‪e  out  t ‬‬
‫‪.F ‬‬
‫‪e  in  t ‬‬
‫חתך ‪ s-t‬ברשת זרימה‪:‬‬
‫חתך‬
‫‪‬‬
‫‪  S , S‬כך ש‪ S  V , S  V \ S -‬ומתקיים‪. s  S , t  S :‬‬
‫קיבול של חתך ‪c  e  :  S , S ‬‬
‫למה‪ :1-‬לכל חתך ‪s-t‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪e  S , S‬‬
‫‪( c  S , S  ‬סכום קשתות שיוצאת מ ‪ S‬ל‪.) S -‬‬
‫‪  S , S‬ולכל פונקצית זרימה ‪ f‬מתקיים‪f  e  :‬‬
‫‪‬‬
‫‪e S , S ‬‬
‫‪f e ‬‬
‫מסקנה‪ :‬אפשר לחשב את ערך פונקצית הזרימה ‪ F‬ע"י הסתכלות על חתך כלשהו‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪.F ‬‬
‫‪e  S , S‬‬
‫‪ ,  S , S‬או ע"י‬
‫חישב סה"כ הזרימה מהמקור או ע"י חישוב סה"כ הזרימה לבור‪.‬‬
‫למה‪ :2-‬לכל חתך‬
‫‪‬‬
‫‪  S , S‬ולכל פונקצית זרימה ‪ f‬מתקיים‪:‬‬
‫מסקנה‪ :‬אם קיים חתך ‪s-t‬‬
‫‪‬‬
‫‪‬‬
‫‪.F  cS,S‬‬
‫‪  S , S‬כך ש‪ F  c  S , S  -‬אז ‪ F‬היא זרימת מקסימום‪.‬‬
‫מסלולי שיפור‪:‬‬
‫קיבול שיורי‪ :‬לכל קשת ‪ e   u , v ‬עם קיבול ‪ c  e ‬וזרימה ‪ f  e ‬נגדיר שתי קשתות עם קיבול‬
‫שיורי‪:‬‬
‫‪ .1‬קשת קדמית ‪  u , v ‬עם קיבול ‪. c  e   f  e ‬‬
‫‪ .4‬קשת אחורית ‪  v , u ‬עם קיבול ‪. f  e ‬‬
‫הערה‪ :‬למעשה‪ ,‬קיבול כל קשת הינו סך הזרימה שניתן להזרים עליה בנוסף לזרימה הקיימת‪.‬‬
‫הגרף השיורי‪ :‬יסומן ‪ G f‬הוא אוסף כל הקשתות עם קיבול שיורי חיובי ממש‪.‬‬
‫מסלול שיפור‪ :‬מסלול מ‪ s -‬ל‪ t -‬בגרף השיורי‪.‬‬
‫‪24‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫למה‪ :3-‬עבור מסלול שיפור ‪ p‬תהי ‪ ‬הקיבול השיורי הקטן ביותר לאורך ‪ . p‬אז א נגדיל את‬
‫הזרימה ב‪  -‬בכל קשת המתאימה לקשת קדמית ב‪ p -‬ונטין את הזרימה ב‪  -‬בכל קשת המתאימה‬
‫לקשת אחורית ב‪ , p -‬נקבל פונקצית זרימה חוקית כך שערך הזרימה גדל ב‪.  -‬‬
‫משפט חתך מינימום‪-‬זרימת מקסימום (‪:)Min Cut – Max Flow‬‬
‫תהי ‪ f‬פונקצית זרימה ברשת זרימה ‪ . N   G , s , t , c ‬אזי הטענות הבאות שקולות‪:‬‬
‫‪ f .1‬זרימת מקסימום‪.‬‬
‫‪ .4‬אין מסלול שיפור מ‪ s -‬ל‪ t -‬ברשת השיורית‪.‬‬
‫‪ .4‬קיים חתך ‪s-t‬‬
‫טענה‪ :1-‬אם‬
‫‪‬‬
‫‪‬‬
‫‪  S , S‬עבורו‬
‫‪‬‬
‫‪( F  c  S , S‬וזהו חתך מינימום)‪.‬‬
‫‪ e   S , S‬אז ‪ . f  e   c  e ‬כלומר‪ e ,‬רוויה‪.‬‬
‫טענה‪ :2-‬אם ‪ e   S , S ‬אזי ‪. f  e   0‬‬
‫האלגוריתם של ‪ Ford-Fulkerson‬למציאת זרימת מקסימום‪:‬‬
‫האלגוריתם הגנרי‪:‬‬
‫‪ .1‬אתחול‪ -‬זרימה ‪ 0‬בכל הקשתות‪.‬‬
‫‪ .4‬כל עוד קיים מסלול שיפור ‪ p‬מ‪ s -‬ל‪ t -‬ב‪ , G f -‬שפר עליו את הזרימה (ניתן למצוא מסלול שיפור‬
‫ע"י הרצת ‪ ,BFS‬למשל)‪.‬‬
‫הערות‪:‬‬
‫‪‬‬
‫אם הקיבולים על הקשתות לא רציונאליים‪ ,‬לא מובטח שהאלגוריתם יעצור‪.‬‬
‫‪‬‬
‫אם הקיבולים על הקשתות שלמים‪ ,‬האלגוריתם ימצא זרימת מקסימום בשלמים‪ ,‬שהרי יש שיפור‬
‫ב‪ 1-‬לפחות בכל איטרציה‪ .‬נשים‪-‬לב שמספר האיטרציות עלול להגיע עד ל‪ , F -‬ערך זרימת‬
‫המקסימום‪.‬‬
‫*‬
‫סיבוכיות‪ :‬מספר האיטרציות‪ , O  | f * |  :‬זמן לביצוע כל איטרציה‪ . O  V  E  :‬סה"כ‪. O  f * E  :‬‬
‫האלגוריתם של אדמונדס‪-‬קרפ‪:‬‬
‫בכל איטרציה בוחרים את מסלול השיפור הקצר ביותר מ‪ s -‬ל‪. t -‬‬
‫גרעין של רשת זרימה‪ :‬אוסף קשתות ב‪  G , s , t , c  -‬על מסלול קצר ביותר מ‪ s -‬ל‪ . t -‬סימון‪. S  G  :‬‬
‫טענה‪ :1-‬תהי ‪  G , s , t , c ‬רשת זרימה ותהי ‪ v   S  G ‬‬
‫‪  u‬אז הוספת הקשת ‪ v  u ‬‬
‫ל‪G -‬‬
‫אינה משנה את הגרעין ‪. S  G ‬‬
‫מסקנה‪ :‬אם נוסיף ‪ k‬קשתות שהפוכות לקשתות גרעין‪ ,‬הגרעין יישמר‪.‬‬
‫טענה‪ :2-‬יהיו ‪ G ‬ו‪ G  -‬שתי רשתות שיוריות באיטרציות עוקבות של האלגוריתם‪ .‬אז לפחות אחד‬
‫מהשניים מתקיים‪:‬‬
‫‪(  G   s , t    G   s , t  .1‬המסלול הקצר ביותר מתארך)‪.‬‬
‫‪( | S  G   | | S  G   | .4‬גודל הגרעין קטן)‪.‬‬
‫מסקנה‪ :‬מקרה‪ 1-‬יכול להתרחש | ‪ | V‬פעמים לכל היותר‪ .‬בין שתי פעמים עוקבות שבהן ‪ 1‬התרחש‪,‬‬
‫הגרעין יכול היה לקטון בלכל היותר | ‪ . | E‬ולכן כמות האיטרציות היא‪. O  V E  :‬‬
‫‪25‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫סיבוכיות‪ :‬איטרציה בודדת לוקחת‪ O  E  :‬ולכן בסה"כ‪:‬‬
‫‪‬‬
‫‪. O  E 2V‬‬
‫האלגוריתם של דיניץ‪:‬‬
‫גרף שכבות‪ :‬בהינתן גרף שיורי ‪ , G f‬גרף השכבות‪ L f -‬הוא תת‪-‬גרף של הגרף השיורי‪ ,‬המכיל רק‬
‫את הקשתות המעבירות אותנו משכבה אחת לאחרת ועוצר כשמגיע ל‪. t -‬‬
‫זהו תת‪-‬גרף המכיל את כל המסלולים הקצרים ביותר מ‪ s -‬ל‪ . t -‬סימון‪ -  f  v  :‬אורך המסלול הקצר‬
‫ביותר מ‪ s -‬ל‪. v -‬‬
‫מכיל רק קשתות ‪ u  v‬ב‪ G f -‬עבורן‪.  f  v    f  u   1 :‬‬
‫הגרף מכיל רק צמתים ‪ v‬כך ש‪.  f  v    f  t  -‬‬
‫זרימה חוסמת בגרף השכבות‪ :‬זרימה שאין עבורה מסלולי שיפור בגרף השכבות (כלומר‪ ,‬אין‬
‫מסלולים מכוונים מ‪ s -‬ל‪ t -‬בגרף השכבות לאחר שמוחקים קשתות עם קיבול אפס)‪.‬‬
‫האלגוריתם‪:‬‬
‫‪ f  e   0 .1‬לכל קשת ‪. e  E‬‬
‫‪ .4‬כל עוד רשת השכבות‬
‫‪‬‬
‫‪  L f , s , t , c f‬מכילה מסלול מ‪ s -‬ל‪: t -‬‬
‫‪ 4.1‬מצא זרימה חוסמת ‪ f ‬ברשת השכבות‪.‬‬
‫‪( f  f  f  4.4‬שיפור ‪ f‬באמצעות הזרימה החוסמת)‪.‬‬
‫‪ .4‬החזר את ‪. f‬‬
‫טענה‪ :1-‬בסיום ריצת האלגוריתם‪ f ,‬היא זרימת מקסימום של ‪.  G , s , t , c ‬‬
‫טענה‪ :2-‬יהיו ‪( G ‬הראשונה) ו‪( G  -‬השנייה) שתי רשתות שיוריות באיטרציות עוקבות של‬
‫האלגוריתם של דיניץ‪ .‬אז מתקיים‪.  G   s , t    G   s , t  :‬‬
‫מסקנה‪ :‬האלגוריתם של דיניץ מבצע לכל היותר | ‪ | V‬איטרציות‪.‬‬
‫מציאת זרימה חוסמת‪:‬‬
‫‪ f   0 .1‬לכל ‪ e‬ברשת השכבות‪.‬‬
‫‪ .4‬כל עוד יש קשתות שיוצאות מ‪: s -‬‬
‫‪ 4.1‬הרץ ‪ DFS‬מ‪ s -‬עד שתגיע לצומת עם דרגת יציאה ‪.0‬‬
‫‪ 4.4‬אם הצומת הזה אינו ‪ , t‬מוחקים את כל הקשתות שנכנסות אליו‪.‬‬
‫‪ 4.4‬אם הצומת הזה הוא ‪: t‬‬
‫‪ 4.4.1‬יהי ‪ p‬המסלול מ‪ s -‬ל‪ t -‬בסריקה הנוכחית‪.‬‬
‫‪ 4.4.4‬מוסיפים ל‪ f  -‬את הזרימה הגדולה ביותר שניתן להזרים על‪-‬פני ‪. p‬‬
‫‪ 4.4.4‬מוחקים את כל הקשתות ב‪ p -‬שלא ניתן להזרים עליהן עוד זרימה‪.‬‬
‫סיבוכיות‪. O  V E  :‬‬
‫‪26‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫זרימה עם חסמים תחתונים‪:‬‬
‫רשת זרימה עם קיבולים עליונים ותחתונים היא‪ b : E  R .  G , s , t , c , b  :‬מציין את הקיבולים‬
‫התחתונים על כל קשת‪.‬‬
‫הערה‪ :‬לא תמיד קיימת זרימה חוקית‪ ,‬בניגוד לזרימה ללא חסמים תחתונים בה תמיד יש זרימה אפס‬
‫שהיא חוקית‪.‬‬
‫הכרעה האם יש זרימה חוקית‪:‬‬
‫נבנה רשת זרימה ‪ N    G , s , t , c  ‬בעלת קיבולים עליונים בלבד‪.‬‬
‫} ‪, V   V  { s , t } , E   E  {t  s , s  t }  { s   u , u  t  : u  V‬‬
‫ועבור כל ‪ c   e   c  e   b  e  : e  E‬ו‪. c   t  s    -‬‬
‫‪b e‬‬
‫‪‬‬
‫‪b e‬‬
‫‪‬‬
‫‪c  s  u  ‬‬
‫‪e in  e ‬‬
‫‪c  u  t ‬‬
‫‪e out  u ‬‬
‫משפט‪ :‬קיימת זרימה חוקית ב‪ N -‬אם"ם קיימת ב‪ N  -‬זרימת מקסימום שערכה הוא‪.  b  e  :‬‬
‫‪e E‬‬
‫‪27‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫שידוך מקסימום בגרף דו‪-‬צדדי‪:‬‬
‫עבור ‪ G   V  L  R , E ‬גרף דו‪-‬צדדי‪:‬‬
‫שידוך‪ :‬תת‪-‬קבוצה של קשתות ‪ M‬כך שלכל שתי קשתות אין נקודת קצה משותפת‪.‬‬
‫שידוך מקסימום‪ :‬שידוך ‪ M‬כך שלכל שידוך ‪ M ‬אחר מתקיים‪. | M | | M  | :‬‬
‫שידוך מושלם‪ :‬שידוך ‪ M‬כך שכל צומת בגרף היא נקודת קצה של איזושהי קשת מ‪. M -‬‬
‫מציאת שידוך מקסימום בעזרת זרימה‪:‬‬
‫נגדיר את הגרף המכוון ‪ G    V , E  ‬באופן הבא‪:‬‬
‫}‪V   V  { s , t‬‬
‫‪E     s , u  : u  L     u , v  : uv  E , u  L , v  R     v , t  : v  R ‬‬
‫טענה‪ :1-‬ב‪ G -‬יש שידוך בגודל ‪ k‬אם"ם ב‪ G  -‬יש זרימה בגודל ‪. k‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף דו‪-‬צדדי ‪. G   V  L  R , E ‬‬
‫פלט‪ :‬שידוך מקסימום ב‪. G -‬‬
‫‪ .1‬בנה את רשת הזרימה ‪ N    G , s , t , c ‬עם ‪ G ‬כפי שהוגדר לעיל ו‪. c  1 -‬‬
‫‪ .4‬הרץ את פורד‪-‬פולקרסון לחישוב זרימת מקסימום ב‪. N  -‬‬
‫‪ .4‬החזר‪. M   uv : f  u , v   1 :‬‬
‫סיבוכיות‪. O  V E  :‬‬
‫כיסוי מינימאלי במסלולים‪:‬‬
‫כיסוי במסלולים‪ :‬יהי ‪ G   V , E ‬גרף מכוון‪ .‬כיסוי במסלולים של צמתי ‪ G‬הוא קבוצת מסלולים‬
‫זרים בצמתים ב‪ G -‬כך שכל צומת ב‪ G -‬מוכל באחד המסלולים בכיסוי (מסלול עשוי להיות מורכב‬
‫מצומת יחיד)‪.‬‬
‫הרעיון‪ :‬לייצג מסלול ע"י כך שנשדך לכל צומת את הצומת העוקב לו במסלול‪.‬‬
‫נגדיר גרף דו‪-‬צדדי לא מכוון ‪ G    V   L  R , E  ‬באופן הבא‪:‬‬
‫} ‪E   {u 1 v 2 :  u , v   E‬‬
‫} ‪R  {v 2 : v  V‬‬
‫} ‪L  { v1 : v  V‬‬
‫טענה‪ :2-‬ב‪ G -‬יש כיסוי במסלולים בגודל ‪ k‬אם"ם ב‪ G  -‬יש שידוך בגודל ‪. n  k‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף ‪.DAG G   V , E ‬‬
‫פלט‪ :‬כיסוי מינימאלי במסלולים‪.‬‬
‫‪ .1‬חשב את ‪. G ‬‬
‫‪ .4‬מצא שידוך מינימום ‪ M‬ב‪. G  -‬‬
‫‪ .4‬החזר כיסוי שקשתותיו הן כל הקשתות ‪ uv‬כך ש‪. u1v 2  M -‬‬
‫סיבוכיות‪. O  V E  :‬‬
‫‪28‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫משפט החתונה של ‪:Hall‬‬
‫הגדרה‪ :‬יהא ‪ G   V , E ‬גרף לא מכוון‪ .‬בהינתן קבוצת צמתים ‪ , A‬נסמן ב‪   A  -‬את קבוצת‬
‫השכנים של צמתי ‪ , A‬כלומר‪.   A    v  V :  u  A , u v  E  :‬‬
‫המשפט‪ :‬יהא ‪ G   V  L  R , E ‬גרף דו‪-‬צדדי עם ‪ . | L | | R | n‬ב‪ G -‬קיים שידוך מושלם‬
‫אם"ם לכל ‪ A  L‬מתקיים‪. |   A  | | A | :‬‬
‫הקשירות בקשתות‪:‬‬
‫קשירות בקשתות‪ :‬בהינתן גרף לא מכוון ‪ , G   V , E ‬הקשירות בקשתות של ‪ , G‬הוא המספר‬
‫המינימאלי של קשתות שהסרתן מ‪ G -‬הופכת אותו ללא קשיר‪ .‬סימון‪.   G  :‬‬
‫טענה‪ :1-‬נסמן ב‪ e  A  -‬את מספר הקשתות החוצות חתך ‪  A , V \ A ‬כלשהו בגרף (זהו אינו חתך‬
‫‪ .)s-t‬אז מתקיים‪ ,   G   m i n  e  A : A  V , A { , V } :‬כלומר‪ :‬מספר הקשתות המינימאלי‬
‫בחתך כלשהו בגרף‪.‬‬
‫הגדרת רשת זרימה עבור הבעיה‪:‬‬
‫נגדיר גרף מכוון ‪ G    V , E  ‬באופן הבא‪ . E     u , v  ,  v , u  : uv  E  :‬ניתן לכל קשת קיבול‬
‫יחידה ונקבע את ‪ s‬להיות צומת שרירותי מ‪. V -‬‬
‫טענה‪ :2-‬לכל‬
‫‪ t  V‬נסמן ב‪ f t * -‬זרימה מקסימאלית ברשת ‪ . N t   G , s , t , c ‬אז מתקיים‪:‬‬
‫‪.   G   m in  f t * : t  V ‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬גרף לא מכוון וקשיר ‪. G   V , E ‬‬
‫פלט‪.   G  :‬‬
‫‪ .1‬חשב את ‪. G ‬‬
‫‪ .4‬קבע ‪ s‬באופן שרירותי‪ ,‬ולכל ‪ t  s‬חשב את * ‪. f t‬‬
‫‪ .4‬החזר‪. m in | f t * |: t  V \ { s } :‬‬
‫סיבוכיות‪ :‬להרצה אחת לחישוב זרימת מקסימום‪:‬‬
‫‪  O V E ‬‬
‫*‬
‫‪( O  E f‬כי ‪ | f t | n‬לכל ‪ .) t‬ול‪n -‬‬
‫*‬
‫הרצות‪. O  V 2 E  :‬‬
‫‪29‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫קונבולוציות והתמרת פורייה המהירה (‪:)FFT‬‬
‫כפל פולינומים‪:‬‬
‫נתון פולינום ממעלה ‪,  a n  0  n‬‬
‫‪n‬‬
‫‪j‬‬
‫‪x‬‬
‫‪j‬‬
‫‪a‬‬
‫‪. Ax ‬‬
‫‪j0‬‬
‫ייצוג‪ :1-‬שמירת הפולינום בעזרת וקטור המקדמים שלו‪, a n  -‬‬
‫חישוב ערך בנקודה‪; O  n  :‬‬
‫‪. a   a 0 , a1 ,‬‬
‫חיבור שני פולינומים‪; O  n  :‬‬
‫כפל שני פולינומים‪:‬‬
‫‪‬‬
‫‪2‬‬
‫‪O n‬‬
‫ייצוג‪ :2-‬פולינום ממעלה ‪ n‬ניתן לייצוג בעזרת ‪ n  1‬נקודות שמקיימות‪. y i  A  x i  :‬‬
‫חיבור שני פולינומים (עבור אותן נקודות ‪; O  n  :) x‬‬
‫סיבוכיות הכפל‪. O  n  :‬‬
‫מעבר מייצוג ע"י וקטור לייצוג ע"י נקודות‪:‬‬
‫בוחרים ‪ n  1‬ערכי ‪ x‬שונים‪ ,‬מציבים ומקבלים את ערכי ‪ y‬המתאימים‪.‬‬
‫מעבר מייצוג ע"י נקודות לייצוג ע"י וקטור‪ -‬משפט האינטרפולציה‪:‬‬
‫בהינתן ‪ n  1‬נקודות שונות ‪  x i , y i ‬כך ש‪ x i  x j -‬אז קיים פולינום יחיד ‪ A‬ממעלה‪ , n -‬כך ש‪-‬‬
‫‪. A  xi   y i‬‬
‫סיבוכיות מעבר בין הייצוגים‪. O  n lo g n  :‬‬
‫אלגוריתם יעיל לכפל פולינומים – קונבולוציה‪:‬‬
‫‪ .1‬נבחר ‪ 2 n‬ערכים ‪, x 2 n‬‬
‫‪ x1 ,‬ונמצא את ערכי הפולינומים ‪ A  x j  , B  x j ‬עבור ‪. 1  j  2 n‬‬
‫‪ .4‬נחשב את ‪ C  x j   A  x j   B  x j ‬לכל ‪. j‬‬
‫‪ .4‬נחשב את המקדמים של ‪, c 2 n  2 - C  x ‬‬
‫‪ c 0 , c1 ,‬מהערכים שחישבנו‪, C  x 2 n  -‬‬
‫‪ C  x1  ,‬תוך‬
‫שימוש במשפט האינטרפולציה‪.‬‬
‫הבעיה‪ :‬בשלב (‪ :)1‬חישוב ישיר של ערך הפונקציה ממעלה ‪ n  1‬ב‪ 2 n -‬נקודות דורש ‪   n 2 ‬ולכן‬
‫נתגבר על הבעיה ע"י לקיחת ‪ 2 n‬נקודות שיש ביניהן קשר‪ :‬שורשי היחידה המרוכבים‪.‬‬
‫למה‪ :1-‬ניתן לחשב את ‪ A  x ‬ב‪ 2 n -‬שורשי היחידה ב‪ O  n lo g n  -‬צעדים‪.‬‬
‫‪2 n 1‬‬
‫למה‪ :2-‬לכל פולינום‬
‫‪s‬‬
‫‪x‬‬
‫‪s‬‬
‫‪c‬‬
‫‪ C  x  ‬והפולינום המתאים‬
‫‪s0‬‬
‫‪ , d s  C  w s , 2 n ‬מתקיים‪D  w 2 n  s , 2 n  :‬‬
‫‪2 n 1‬‬
‫‪s‬‬
‫‪dsx‬‬
‫‪‬‬
‫‪ D  x  ‬כאשר‬
‫‪s0‬‬
‫‪1‬‬
‫‪2n‬‬
‫‪( c s ‬כלומר נוכל לקבל את מקדמי הפולינום ‪C  x ‬‬
‫ע"י חישוב ערכי ‪ D  x ‬בשורשי היחידה)‪.‬‬
‫‪31‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫חיבור איברי קבוצות ביעילות‪:‬‬
‫יהיו }‪, n‬‬
‫‪ . A , B  {1, 2,‬נגדיר‪. A  B  { a  b : a  A , b  B } :‬‬
‫אלגוריתם לחישוב ‪:A+B‬‬
‫‪. A , B  {1, 2,‬‬
‫קלט‪ :‬קבוצות ‪ A , B‬ומספר ‪ n‬כך ש‪, n} -‬‬
‫פלט‪ :‬הקבוצה ‪. A  B‬‬
‫‪n‬‬
‫‪ .1‬חשב את הפולינומים‪:‬‬
‫‪i‬‬
‫‪bx‬‬
‫‪i‬‬
‫‪n‬‬
‫‪bx ‬‬
‫‪i‬‬
‫‪ai x ,‬‬
‫‪i 1‬‬
‫‪i B‬‬
‫‪1‬‬
‫‪bi  ‬‬
‫‪0‬‬
‫‪i B‬‬
‫‪i A‬‬
‫‪‬‬
‫‪ a  x  ‬כאשר‬
‫‪i 1‬‬
‫‪1‬‬
‫‪ai  ‬‬
‫‪0‬‬
‫‪i A‬‬
‫‪ .4‬חשב את הפולינום‪  a b   x  :‬כאשר עבור כל ‪ , 1  k  2 n‬המקדם של ‪ x k‬בפולינום ‪ a b‬הוא‪:‬‬
‫‪2n‬‬
‫‪k i‬‬
‫‪ab‬‬
‫‪i‬‬
‫‪ . c k ‬אך כך ‪ c k  1‬אם"ם ‪. k  A  B‬‬
‫‪i 1‬‬
‫‪ .4‬החזר‪. {i : c k  1} :‬‬
‫סיבוכיות‪. O  n lo g n  :‬‬
‫מחזור מינימאלי של מחרוזת בינארית‪:‬‬
‫תהא ‪s n 1‬‬
‫‪ s  s 0 s1‬מחרוזת בינארית‪.‬‬
‫מחזור של מחרוזת‪ :‬נאמר כי ‪ s‬היא בעלת מחזור ‪ t‬אם לכל ‪( i  t j‬מודולו ‪ ) t‬מתקיים ‪. s i  s j‬‬
‫סימון‪ - T  s  :‬המספר המינימאלי ‪ t‬שמקיים תכונות מחזור של מחרוזת‪.‬‬
‫האלגוריתם‪:‬‬
‫קלט‪ :‬מחרוזת בינארית ‪s n 1‬‬
‫‪. s  s 0 s1‬‬
‫פלט‪. T  s  :‬‬
‫‪n 1‬‬
‫‪ .1‬חשב את הפולינומים‬
‫‪x‬‬
‫‪s n 1‬‬
‫‪   1‬‬
‫‪n 1‬‬
‫‪x‬‬
‫‪x ‬‬
‫‪2‬‬
‫‪s0‬‬
‫‪s2‬‬
‫‪   1 x    1‬‬
‫‪   1‬‬
‫‪s1‬‬
‫‪x‬‬
‫‪sn 2‬‬
‫‪   1‬‬
‫‪s0‬‬
‫‪p  x     1‬‬
‫‪s n 1‬‬
‫‪q  x     1‬‬
‫‪ .4‬חשב את הפולינום‪ , p q  x  :‬כאשר עבור ‪ 1  k  n  1‬המקדם של ‪ x n  k 1‬בפולינום הוא‪:‬‬
‫| }‪  n  k   2  | {i : s i  s k  i or 0  i  n  k  1‬‬
‫‪‬‬
‫‪s n 1  n  k 1 i ‬‬
‫‪   1   1‬‬
‫‪s1‬‬
‫‪ c k ‬ולכן‬
‫‪ c k  n  k‬אם"ם ל‪ s -‬יש מחזור ‪( k‬ואחרת ‪.) c k  n  k‬‬
‫‪ .4‬החזר את ה‪ k -‬המינימאלי עבורו ‪ c k  n  k‬ואם לא קיים כזה‪ ,‬החזר‪. n :‬‬
‫סיבוכיות‪. O  n lo g n  :‬‬
‫‪31‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫תרגילים לדוגמא‪:‬‬
‫א‪ .‬אלגוריתם‪:‬‬
‫‪ .1‬נמיין את ‪ n‬האינטרוולים‪ ,‬פעם לפי נקודת התחלה ופעם לפי נקודת הסיום שלהם‪.‬‬
‫‪ .4‬נאתחל ‪ S( S   , x  0‬יכיל את האינטרוולים בכיסוי)‪.‬‬
‫‪ .4‬מצא מבין כל האינטרוולים שמתחילים לפני או ב‪ x0‬את זה שמסתיים הכי רחוק‪ ,‬נסמנו‪. I i -‬‬
‫‪ , S  S  { I i } .3‬ונזרוק את כל האינטרוולים שעברנו עליהם והם לא ‪. I i‬‬
‫‪( .3‬נקודת הסיום של ‪. x  ) I i‬‬
‫‪ .3‬חוזרים לשלב ‪ 1‬ומפסיקים כאשר ‪ , x  1‬כלומר‪ ,‬כאשר האינטרוול שלקחנו לכיסוי מכסה את‬
‫הנקודה האחרונה בקטע‪.‬‬
‫סיבוכיות‪:‬‬
‫מיון מערך האינטרוולים פעמיים‪ . O  n lo g n  -‬עוברים על מערך האינטרוולים פעם אחת וכל איבר‬
‫שעברנו זורקים ולכן המעבר ב‪ O  n  -‬כי בכל איבר שאנחנו עוברים‪ ,‬מבצעים מספר קבוע של‬
‫פעולות‪.‬‬
‫נכונות‪:‬‬
‫יהי ‪ I j‬האינטרוול עם נקודת הסיום הכי גדולה מבין אלה שמכילים את ‪ .0‬כל כיסוי חוקי חייב להכיל‬
‫את הנקודה ‪ .0‬נראה כי קיים כיסוי מינימאלי שמכיל את ‪. I i‬‬
‫נניח בשלילה כי הכיסוי האופטימאלי מכיל אינטרוול אחר ‪ , I j‬אזי גם } ‪ S  { I j }  { I i‬הוא כיסוי חוקי‬
‫כי ‪ I i‬מכסה יותר נקודות מ‪ I j -‬והוא כיסוי באותו גודל‪ .‬מצאנו לכן כיסוי מינימאלי שמכיל את ‪ . I i‬כמו‪-‬‬
‫כן‪ ,‬בהינתן ש‪ I i -‬שייך לכיסוי המינימאלי צריך לכסות את שאר הקטע גם ע"י כיסוי מינימאלי לכן‬
‫באותה השיטה נעבור על שאר הקטעים ונמצא כיסוי אופטימאלי המכיל את כולם‪ .‬ולכן האלגוריתן‬
‫מחזיר כיסוי אופטימאלי‪.‬‬
‫‪32‬‬
‫©ענת עציון‬
‫אלגוריתמים ‪ – )443432( 1‬אביב תש"ע‬
‫שאלות על אינטרוולים‪:‬‬
‫סעיף ראשון נפתר ע"י אלגוריתם חמדן‪ ,‬מוכיחים ע"י השוואה ליפתרון אופטימאלי והחלפת האיברים‬
‫בו‪.‬‬
‫סעיף שני עם משקלים ע"י תכנון דינאמי‪ -‬מוכיחים באינדוקציה או ע"י גרף מסלולים קצרים‪.‬‬
‫שאלות שיש להתאים זוגות‪ -‬ע"י שידוך‪.‬‬
‫א‪.‬‬
‫(‪ 6‬נק') נתון גרף מכוון ופשוט ‪ G   V , E ‬ושני צמתים ‪ s‬ו‪ . t -‬ברצוננו לחשב את המספר‬
‫המקסימאלי של מסלולים מכוונים זרים בקשתות בין ‪ s‬ל‪ . t -‬נגדיר את רשת הזרימה הבאה‪:‬‬
‫‪ N   G , s , t , c ‬כך ש‪ .  e  E , c  e   1 -‬הוכיחו כי ערך זרימת המקסימום ב ‪ N‬שווה‬
‫למספר המקסימאלי של מסלולים מכוונים זרים בקשתות בין ‪ s‬ל‪. t -‬‬
‫נסמן ב‪ M-‬את המספר המקסימאלי של מסלולים מכוונים זרים בקשתות בין ‪ s‬ל‪. t -‬‬
‫‪.a‬‬
‫בהינתן זרימה מקסימלית עבור כל קשת בה עוברת זרימה נוסיפה למסלולים‬
‫המכוונים‪ .‬כלומר‪ ,‬אם בין ‪ u‬ו‪ v-‬יש זרימה‪ ,‬אזי נאחד את ‪ u‬ו‪ v-‬להיות באותו‬
‫מסלול‪ ,.‬ואת הקשת שלהן נאחד למסלול כמו כן‪ .‬לא יתכן כי תשתתף קשת אחת‬
‫בשני מסלולים‪ ,‬כי קיבולת הקשתות היוצאת מ‪ u-‬היא ‪ , 1‬כלומר סה"כ הזרימה‬
‫העוברת דרכו לא יכולה להיות יתר מכמות הקשתות הנכנסות ‪ .‬לכן קיבלנו‬
‫מסלולים זרים בקשתות‪ ,‬ומן הסתם זה קטן מהמספר המקסימלי האפשרי של‬
‫מסלולים מכוונים זרים בקשתות בין ‪ s‬ל‪. t -‬‬
‫‪.b‬‬
‫עבור כל ‪ 2‬קשתות באותו מסלול ובעלות צומת משותף‪ ,‬כלומר‪ v-u-w :‬נעביר‬
‫זרימה בגודל ‪ 1‬מהצומת ‪ v‬ל‪ u-‬ומהצומת ‪ u‬ל‪ .w-‬קיבלנו זרימה חוקית‪ ,‬כי‬
‫קיבולת הקשתות היוצאת מ‪ u-‬היא ‪ , 1‬כלומר סה"כ הזרימה העוברת דרכו לא‬
‫יכולה להיות יתר מכמות הקשתות הנכנסות אחרת היתה קשת המשתתפת בשני‬
‫מסלולים‪ .‬ולכן הזרימה החוקית לבטח קטנה מהזרימה המקסימלית האפשרית‪.‬‬
‫‪33‬‬
‫©ענת עציון‬