אלגוריתמים קומבינטורים

‫אלגוריתמים קומבינטורים‬
‫תקצירי הרצאות ־ רועי משולם‬
‫אלגוריתמים לבעיות סדר‬
‫נסמן }‪ [n] = {1, . . . , n‬ויהא ‪ Sn‬אוסף התמורות על ]‪.[n‬‬
‫בעיית המיון‪ :‬בהנתן סדרת מספרים ממשיים שונים ) ‪ a = (a1 , . . . , an‬מצא את התמורה‬
‫היחידה ‪ π ∈ Sn‬עבורה )‪ π .aπ(1) < . . . < aπ(n‬זו תיקרא התמורה הממיינת של ‪.a‬‬
‫אנו נתרכז באלגוריתמים המשתמשים רק בהשוואות ולא ־ למשל ־ בפעולות אלגבריות‬
‫המנצלות תכונות של הממשיים מעבר ליחס הסדר ביניהם‪ .‬חישוב במודל זה מתואר על ידי‬
‫עץ השוואות‪.‬‬
‫דוגמא‪:‬‬
‫‪x1 <? x2‬‬
‫‪x 2 <? x 3‬‬
‫כן‬
‫כן‬
‫לא‬
‫לא‬
‫‪x1 <? x3‬‬
‫לא‬
‫כן‬
‫‪x1 < x2 < x3‬‬
‫‪x 1 <? x 3‬‬
‫כן‬
‫‪x1 < x3 < x2‬‬
‫‪x2 <? x3‬‬
‫‪x2 < x1 < x3‬‬
‫לא‬
‫‪x3 < x1 < x2‬‬
‫כן‬
‫‪x2 < x3 < x1‬‬
‫לא‬
‫‪x3 < x2 < x1‬‬
‫האלגוריתם מופעל באופן הבא‪ :‬קלט ) ‪ a = (a1 , a2 , a3‬מגדיר מסלול מהשורש לעלה באופן‬
‫הבא‪ :‬כאשר בקודקוד פנימי המסומן ב־ ‪ xi <? xj‬משווים בין ‪ ai‬לבין ‪ .aj‬אם ‪ai < aj‬‬
‫ממשיכים ימינה בעץ ואם ‪ aj < ai‬ממשיכים שמאלה בעץ‪ .‬התמורה המופיעה על העלה‬
‫שבקצה המסלול היא התמורה הממיינת של ‪.a‬‬
‫הערה‪ :‬נשים לב שבאלגוריתם זה מספר ההשוואות המקסימלי שביצענו על קלט הוא ‪ .3‬האם‬
‫יש אלגוריתם למיון שלושה מספרים המבצע לכל היותר ‪ 2‬השוואות על כל קלט? נענה על‬
‫שאלה זו בהמשך‪.‬‬
‫מודל עץ ההשוואות‬
‫עץ בינארי ‪ T‬הוא גרף מכוון עם שורש ‪ s‬כך שדרגת היציאה של כל קודקוד ≥ ‪ .2‬בדרך כלל‬
‫לא נסמן חץ על צלע אלא נבין שכיוון הצלע הוא מלמעלה למטה‪ .‬עלים הם קודקודים עם‬
‫דרגת יציאה ‪ .0‬הבנים הימני והשמאלי של קודקוד ‪ v‬מסומנים )‪ lef t(v), right(v‬בהתאמה‬
‫)אם הם קיימים(‪ .‬גובה העץ ) ‪ h(T‬הוא מספר הצלעות המירבי במסלול מכוון בין שורש‬
‫לעלה‪.‬‬
‫יהא ‪ T‬עץ בינארי שבו כל קודקוד פנימי ‪ v‬מתוייג על ידי השוואה ‪ q(v) = xi <? xj‬כאשר‬
‫‪ ,1 ≤ i, j ≤ n‬וכל עלה ‪ v‬מתוייג על ידי תמורה ‪.π(v) ∈ Sn‬‬
‫‪1‬‬
‫לכל וקטור ) ‪ a = (a1 , . . . , an‬של ממשיים שונים נגדיר מסלול‬
‫) ‪P ath(a) = (s = v0 , . . . , vm‬‬
‫מהשורש ‪ s‬לאחד העלים באופן הבא‪ :‬נניח שהגדרנו את ‪ s = v0 , . . . , vk‬עד ‪ 0 ≤ k‬כלשהו‪.‬‬
‫אם ‪ vk‬עלה‪ ,‬נגדיר ‪ m = k‬ונסיים‪ .‬אחרת ‪ vk‬קדקד פנימי ויהא ‪ .q(vk ) = xi <? xj‬נגדיר‬
‫עתה‬
‫‬
‫‪right(vk ) ai < aj‬‬
‫= ‪vk+1‬‬
‫‪lef t(vk ) aj < ai‬‬
‫העץ המתוייג ‪ T‬ייקרא עץ השוואות למיון ‪ n‬איברים אם לכל ) ‪ a = (a1 , . . . , an‬כנ"ל‬
‫מתקיים‪ P ath(a) = (s = v0 , . . . , vm ) :‬גורר ש ) ‪ π(vm‬היא התמורה הממיינת של ‪.a‬‬
‫כל אלגוריתם השוואות למיון ניתן לייצוג על ידי עץ השוואות מתוייג ‪.T‬‬
‫סיבוכיות האלגוריתם הינה מספר ההשוואות המירבי שיבצע האלגוריתם ‪ T‬על קלט באורך ‪,n‬‬
‫ותסומן )‪ .cT (n‬סיבוכיות האלגוריתם שווה לגובה עץ ההשוואות ‪ ,T‬כלומר ) ‪.cT (n) = h(T‬‬
‫בפועל‪ ,‬נוח יותר לתאר אלגוריתמי השוואות על ידי "תוכנית מחשב" המאפשרת בין השאר‬
‫שמוש בלולאות וקריאות רקורסיביות‪.‬‬
‫מספר אלגוריתמי מיון‬
‫להלן נתאר מספר אלגוריתמי מיון ונעריך את סיבוכיותם‪.‬‬
‫‪Insertion Sort‬‬
‫יהא ) ‪ A = (A1 , . . . , An‬וקטור של ממשיים שונים‪ .‬המיון מתבצע ב־ ‪ m‬שלבים‪ ,‬כאשר‬
‫בסוף השלב ה־ ‪ i‬הסדרה החלקית )‪ A(1), . . . , A(i‬ממויינת‪ .‬בשלב ה־ )‪ (i + 1‬משווים את‬
‫)‪ A(i + 1‬בזה אחר זה ל־ )‪ . . . , A(i − 1), A(i‬עד שמוצאים את מקומו ביניהם‪.‬‬
‫דוגמא‪:‬‬
‫הסדרה בסוף‬
‫‪4 5 3 6‬‬
‫‪7 5 3 6‬‬
‫‪5 7 3 6‬‬
‫‪4 5 7 6‬‬
‫‪4 5 6 7‬‬
‫שלב ‪i‬‬
‫‪7‬‬
‫‪4‬‬
‫‪4‬‬
‫‪3‬‬
‫‪3‬‬
‫‪i‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫תיאור על ידי התוכנית‪:‬‬
‫)‪IS(A, n‬‬
‫‪For i = 2 to n‬‬
‫)‪k ← A(i‬‬
‫‪j ←i−1‬‬
‫)‪while (k < A(j) & j ≥ 1‬‬
‫)‪A(j + 1) ← A(j‬‬
‫‪j ←j−1‬‬
‫‪A(j + 1) ← k‬‬
‫טענה‪:‬‬
‫‬
‫‪n‬‬
‫‪2‬‬
‫‬
‫= )‪cIS (n‬‬
‫‪2‬‬
‫הוכחה‪ :‬מספר ההשוואות המבוצעות בשלב ‪ i‬הוא לכל היותר ‪ .i − 1‬לכן‬
‫‬
‫‪.‬‬
‫‪n‬‬
‫‪2‬‬
‫‬
‫= )‪(i − 1‬‬
‫‪n‬‬
‫‪X‬‬
‫≤ )‪cIS (n‬‬
‫‪i=1‬‬
‫מאידך על הקלט )‪ A = (n, n − 1, . . . , 2, 1‬יבוצעו בדיוק ‪ i − 1‬השוואות בשלב ‪ i‬ולכן‬
‫‬
‫‪.‬‬
‫‪n‬‬
‫‪2‬‬
‫‬
‫= )‪(i − 1‬‬
‫‪n‬‬
‫‪X‬‬
‫≥ )‪cIS (n‬‬
‫‪i=1‬‬
‫‬
‫בעיית המיזוג‪ :‬נתונים שני וקטורים ממויינים זרים ) ‪ a = (a1 < . . . < ak‬ו־ < ‪b = (b1‬‬
‫) ‪ .. . . < bl‬עלינו למיין את הסידרה ‪ c = {ai }ki=1 ∪{bj }lj=1‬כך ש‪.c = (c1 < . . . < ck+l ) :‬‬
‫להלן אלגוריתם השוואת רקורסיבי הממזג את ‪ a ∪ b‬לתוך ‪.c‬‬
‫)‪merge(a, k, l, b, c‬‬
‫‪If k = l = 0 stop.‬‬
‫‪If k = 0 do c(j) ← b(j), j = 1, . . . , l and stop.‬‬
‫‪If l = 0 do c(i) ← b(i), j = 1, . . . , k and stop.‬‬
‫)‪If a(k) < b(l‬‬
‫)‪c(k + l) ← b(l‬‬
‫)‪merge(a, k, b, l − 1, c‬‬
‫)‪If a(k) > b(l‬‬
‫)‪c(k + l) ← a(k‬‬
‫)‪merge(a, k − 1, b, l, c‬‬
‫נסמן ב־ )‪ cM (k, l‬את הסיבוכיות של ‪ merge‬על קלטים )‪ (a, b‬באורכים )‪.(k, l‬‬
‫טענה ‪ 1‬אם )‪ (k, l) 6= (0, 0‬אזי ‪.cM (k, l) ≤ k + l − 1‬‬
‫הוכחה ‪ 1‬אינדוקציה על ‪ .k + l‬המקרים ‪ k = 0‬ו־ ‪ l = 0‬ברורים‪ .‬נניח אפוא ‪.k, l ≥ 1‬‬
‫מהתיאור הרקורסיבי של האלגוריתם ומהנחת האינדוקציה נובע כי‬
‫})‪cM (k, l) ≤ 1 + max{cM (k − 1, l), cM (k, l − 1‬‬
‫‪≤ 1 + max{(k − 1) + l − 1, k + (l − 1) − 1} = k + l − 1.‬‬
‫אלגוריתם מיון־מיזוג שיתואר להלן הוא דוגמא לשימוש בטכניקה אלגוריתמית הנקראת‬
‫"הפרד ומשול" )‪ (divide and conquer‬המבוססת על פיצול הבעיה למספר תת־בעיות קטנות‬
‫יותר‪ ,‬פתרון כל אחת מהן‪ ,‬ולאחר מכן סינתזה של הפתרונות החלקיים לפתרון מלא‪.‬‬
‫‪3‬‬
Merge Sort
M S(A, n)
If n = 1 stop.
B ← (A(1), . . . , A(b n2 c)
C ← (A(b n2 c + 1), . . . , A(n))
M S(B, b n2 c)
M S(C, d n2 e)
merge(B, b n2 c, C, d n2 e, A)
‫ מהתיאור הרקורסיבי של‬.n ‫ על קלט באורך‬M S ‫ את הסיבוכיות של‬cM S (n) ‫נסמן ב־‬
‫ אזי‬n ≥ 2 ‫האלגוריתם נובע כי אם‬
n
n
n
n
cM S (n) ≤ cM S (b c) + cM S (d e) + cM (b c, d e)
2
2
2
2
(1)
n
n
≤ cM S (b c) + cM S (d e) + n − 1
2
2
:‫מסקנה‬
k
k
cM S (2 ) ≤ k · 2
‫ ואזי לפי הנחת האינדוקציה ו־‬k ≥ 1 ‫ נניח‬.‫ ברור‬k = 0 ‫ המקרה‬.k ‫ אינדוקציה על‬:‫הוכחה‬
‫ נקבל‬1
cM S (2k ) ≤ 2cM S (2k−1 ) + cM (2k−1 , 2k−1 ) ≤
2(k − 1) · 2k−1 + 2k − 1 = k · 2k − 1 < k · 2k
‫ מתקיים‬n ≥ 1 ‫ לכל‬:‫מסקנה‬
cM S (n) ≤ 2n log2 n + 2n.
‫ ולכן‬2k < 2n ‫ אזי‬.2k−1 < n ≤ 2k ‫ כך ש־‬k ‫ יהא‬:‫הוכחה‬
cM S (n) < cM S (2k ) = k2k < 2n log2 n = 2n log2 n + 2n.
4
‫תרגיל‪ :‬הוכח באינדוקציה על ‪ n‬ובעזרת )‪ (1‬כי‬
‫‪cM S (n) ≤ ndlog2 ne ≤ n log2 n + n.‬‬
‫סיבוכיות בעיית המיון‬
‫נסמן ב־)‪ Csort (n‬את )‪ min CA (n‬כאשר ‪ A‬עובר על כל אלגוריתמי הסדר למיון ‪ n‬איברים‪.‬‬
‫מהתרגיל נובע כי‬
‫‪Csort (n) ≤ CM S (n) ≤ n log2 n + n‬‬
‫נראה כי סיבוכיות זו אופטימלית עד כדי הקבוע הכפלי של ‪ .n‬יהא ) ‪ L(T‬מספר העלים בעץ‬
‫בינארי ‪.T‬‬
‫טענה‪.L(T ) ≤ 2h(T ) :‬‬
‫הוכחה‪ :‬אינדוקציה על ) ‪ .h = h(T‬המקרה ‪ h = 0‬ברור‪ .‬נניח ‪ h > 0‬ויהיו ‪ T1 , T2‬העצים‬
‫הנטועים בבנים של השורש‪ .‬אזי ‪ h(Ti ) ≤ h(T ) − 1‬ולכן לפי הנחת האינדוקציה‬
‫‪L(T ) = L(T1 ) + L(T2 ) ≤ 2h(T1 ) + 2h(T2 ) ≤ 2h(T )−1 + 2h(T )−1 = 2h(T ) .‬‬
‫‬
‫מסקנה‪Csort (n) ≥ log2 n! :‬‬
‫הוכחה‪ :‬יהא ‪ T‬עץ השוואות לסדרות באורך ‪ n‬כך ש־ ) ‪.Csort (n) = h(T‬‬
‫מכיוון שכל תמורה ‪ π ∈ Sn‬היא תמורה ממיינת של סדרה מסויימת הרי ש־ !‪L(T ) ≥ n‬‬
‫ולכן‬
‫!‪Csort (n) = h(T ) ≥ log2 L(T ) ≥ log2 n‬‬
‫‬
‫הערכה אסימפטוטית ל־ !‪log2 n‬‬
‫הפונקציה ‪ ln x‬היא מונוטונית עולה וחיובית באינטרוול )∞ ‪ .[1,‬לכן‬
‫‪n+1‬‬
‫‪ln xdx = [x ln x − x]|n+1‬‬
‫=‬
‫‪2‬‬
‫‪Z‬‬
‫≤ ‪ln j‬‬
‫‪2‬‬
‫‪n‬‬
‫‪X‬‬
‫‪j=1‬‬
‫)‪(n + 1) ln(n + 1) − (n + 1) − (2 ln 2 − 2‬‬
‫‪≤ (n + 1) ln(n + 1) − (n + 1).‬‬
‫‪5‬‬
‫‪n+1‬‬
‫‪n‬‬
‫‪n−1‬‬
‫‪2‬‬
‫‪1‬‬
‫וגם‬
‫‪n‬‬
‫‪Z‬‬
‫≥ ‪ln j‬‬
‫‪ln xdx‬‬
‫‪1‬‬
‫‪n‬‬
‫‪X‬‬
‫‪j=1‬‬
‫‪= [x ln x − x]|n1 = n ln n − n + 1.‬‬
‫‪n‬‬
‫‪n−1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫מסקנה‪n log2 n − O(n) ≤ log2 n! ≤ n log2 n + O(n) :‬‬
‫מסקנה‪Csort (n) ≥ log2 n! ≥ n log2 n − O(n) :‬‬
‫עוד על בעיית המיזוג‬
‫נחזור לבעיית המיזוג‪ :‬בהינתן שני וקטורים ממויינים זרים‬
‫) ‪a = (a1 < . . . < ak ) , b = (b1 < . . . < bl‬‬
‫עלינו למיין את ‪ .a ∪ b‬נסמן ב־ )‪ Cmerge (k, l‬את סיבוכיות הבעיה‪ .‬ראינו אלגוריתם פשוט‬
‫למיזוג שסיבוכיותו מקיימת ‪ cM (k, l) ≤ k + l − 1‬לכן ‪.Cmerge (k, l) ≤ k + l − 1‬‬
‫טענה‪:‬‬
‫‬
‫‪k+l‬‬
‫‪k‬‬
‫‬
‫‬
‫‪Cmerge (k, l) ≥ log2‬‬
‫הוכחה‪ :‬נעיין בעץ השוואות ‪ T‬לבעיית המיזוג של הוקטור ) ‪ x = (x1 < . . . < xk‬עם‬
‫) ‪ .y = (y1 < . . . < yl‬כל קודקוד פנימי בעץ מתוייג ע"י ‪ xi <? yj‬וכל עלה מתוייג על ידי‬
‫תמורה על ‪ {xi }ki=1 ∪ {yj }lj=1‬שבה ‪ x1 < . . . < xk‬וגם ‪ .y1 < . . . < yl‬כמו כן כל תמורה‬
‫המקיימת אילוצים אלה מופיעה על אחד מהעלים‪ .‬מספר התמורות על ‪{xi }ki=1 ∪ {yj }lj=1‬‬
‫‬
‫‬
‫‪k+l‬‬
‫‪.‬‬
‫שעבורן מתקיים ‪ x1 < . . . < xk‬וגם ‪ y1 < . . . < yl‬הוא‬
‫‪k‬‬
‫‬
‫‬
‫‬
‫‬
‫‬
‫‪k+l‬‬
‫‪k+l‬‬
‫) ‪h(T‬‬
‫‪.h(T ) ≥ log2‬‬
‫‪ 2‬ולכן‬
‫≥‬
‫לכן‬
‫‪k‬‬
‫‪k‬‬
‫‪6‬‬
k+l
log2
≤ Cmerge (k, l) ≤ k + l − 1 :‫מסקנה‬
k
‫ )כאשר‬ai < b < ai+1
.k = 1 ‫ ו־‬k = l ‫להלן נדון בשני המקרים הקיצוניים‬
:l = 1 ‫המקרה‬
‫ עבורו‬0 ≤ i ≤ k ‫ עלינו למצוא‬b ‫ ו־‬A = (a1 < . . . < ak ) ‫בהינתן‬
.(ak+1 = ∞ ‫ ו־‬a0 = −∞ ‫מגדירים‬
:‫דרך יעילה לבצע זאת היא על ידי חיפוש בינארי‬
BS(A, k, b, i)
If k = 1 & A(1) < b then i = 1, stop.
If k = 1 & A(1) > b then i = 0, stop.
If b > A(d k2 e)
0
k
A = (A(d e + 1), . . . , A(k))
2
0
k
BS(A , b c, b, i)
2 k
i←i+
2
If b < A(d k2 e)
00
k
A = (A(1), . . . , d e − 1))
2
00
k
BS(A , d e − 1, b, i)
2
.k ‫ באורך‬A ‫ את הסיבוכיות של חיפוש בינארי כאשר‬cBS (k) ‫נסמן ב־‬
:‫טענה‬
cBS (k) ≤ dlog2 (k + 1)e
‫ מתקיים‬k > 1 ‫ וכי לכל‬cBS (1) = 1 ‫ מתיאור האלגוריתם נובע כי‬:‫הוכחה‬
k
k
k
cBS (k) ≤ 1 + max{cBS (b c), cBS (d e − 1)} ≤ 1 + cBS (b c)
2
2
2
‫ אזי‬2t−1 ≤ k ≤ 2t − 1 ‫נניח‬
k
k
≤ 1+dlog2 2t−1 e = t = dlog2 (k + 1)e
cBS (k) ≤ 1+cBS (b c) ≤ 1+ log2 b c + 1
2
2
:‫מסקנה‬
Cmerge (k, 1) = dlog2 (k + 1)e
7
‫שימוש של חיפוש בינארי למיון‬
‫אם נחליף ב־ ‪ Insertion sort‬את החיפוש הסדרתי בחיפוש בינארי נקבל אלגוריתם מיון‬
‫יעיל המתואר להלן‪:‬‬
‫)‪BIS(A, n‬‬
‫‪For i = 2 to n‬‬
‫)‪Binary insert A(i) into A(1) < . . . < A(i − 1‬‬
‫נסמן ב־ )‪ cBIS (n‬את סיבוכיות )‪ .BIS(A, n‬אזי ‪ cBIS (1) = 0‬ולכל ‪ n ≥ 1‬מתקיים‬
‫‪cBIS (n) ≤ cBIS (n − 1) + cmerge (n − 1, 1) = cBIS (n − 1) + dlog2 ne‬‬
‫מסקנה‪:‬‬
‫‪dlog2 ne ≤ ndlog2 ne‬‬
‫‪n‬‬
‫‪X‬‬
‫≤ )‪cBIS (n‬‬
‫‪i=1‬‬
‫‬
‫המקרה ‪:k = l‬‬
‫במקרה זה‬
‫‬
‫‪≤ Cmerge (k, k) ≤ 2k − 1‬‬
‫‪2k‬‬
‫‪k‬‬
‫‬
‫‪22k‬‬
‫‪≤ log2‬‬
‫‪2k + 1‬‬
‫‪2k − log2 (2k + 1) = log2‬‬
‫טענה‪:‬‬
‫‪Cmerge (k, k) = 2k − 1.‬‬
‫הוכחה‪ :‬נגדיר שתי סדרות באורך ‪ b = (b1 , . . . , bk ) ,a = (a1 , . . . , ak ) :k‬כאשר‬
‫‪bi = 2i.‬‬
‫‪ai = 2i − 1,‬‬
‫יהי ‪ T‬עץ ההשוואות של אלגוריתם למיזוג שתי סדרות באורך ‪ ,k‬ויהא ‪ P‬המסלול שעובר‬
‫הזוג )‪ (a, b‬על ‪ .T‬העלה שבקצה המסלול מתוייג על ידי התמורה‬
‫‪x1 < y1 < x2 < y2 < · · · < xk < yk‬‬
‫נראה כי כל ההשוואות מהצורות‬
‫‪1≤t≤k‬‬
‫‪xt < yt ,‬‬
‫ו־‬
‫‪1≤t≤k−1‬‬
‫מופיעות על קודקוד פנימי כלשהוא במסלול ‪.P‬‬
‫‪8‬‬
‫‪yt < xt+1 ,‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫)א( נניח בשלילה כי ‪ xt <? yt‬לא מופיע ב־ ‪ .P‬נגדיר ‪ a = {ai }ki=1‬ו־ ‪b = {bj }lj=1‬‬
‫על ידי‬
‫‬
‫‪0‬‬
‫= ‪ai i‬‬
‫‪6 t‬‬
‫= ‪ai‬‬
‫‪bt i = t‬‬
‫ו־‬
‫‪i 6= t‬‬
‫‪i=t‬‬
‫‪bi‬‬
‫‪at‬‬
‫‬
‫‪0‬‬
‫= ‪bi‬‬
‫‪0‬‬
‫‪0‬‬
‫נשים לב כי אם ‪ i 6= j‬או ‪ i = j 6= t‬אזי ‪ ,ai < bj ↔ ai < bj‬ולכן מכיוון‬
‫‪0‬‬
‫‪0‬‬
‫שההשוואה ‪ xt < yt‬אינה מופיעה ב־ ‪ P‬הרי שהזוג ) ‪ (a , b‬יתקדם באותו מסלול‬
‫כמו הזוג )‪ ,(a, b‬ולפיכך יסיים בתמורה ‪ x1 < y1 < . . . , xk < yk‬בסתירה לכך ש ־‬
‫‪0‬‬
‫‪0‬‬
‫‪.at 6< bt‬‬
‫‪00‬‬
‫‪00‬‬
‫‪0‬‬
‫‪00‬‬
‫)ב( נניח בשלילה כי ‪ yt <? xt+1‬לא מופיע ב־ ‪ .P‬נגדיר ‪ a = {ai }ki=1‬ו־ ‪b = {bj }lj=1‬‬
‫על ידי‬
‫‬
‫‪00‬‬
‫‪ai i 6= t + 1‬‬
‫= ‪ai‬‬
‫‪bt i = t + 1‬‬
‫ו־‬
‫‪i 6= t‬‬
‫‪i=t‬‬
‫‪00‬‬
‫‪bi‬‬
‫‪at+1‬‬
‫‬
‫‪00‬‬
‫= ‪bi‬‬
‫‪00‬‬
‫שוב ‪ ai < bj ↔ ai < bj‬אלא אם )‪ .(i, j) = (t + 1, t‬ולכן אם ההשוואה‬
‫‪00‬‬
‫‪00‬‬
‫‪ yt < xt+1‬אינה מופיעה ב־ ‪ P‬הרי ש־ ) ‪ (a , b‬יעבור אותו מסלול כמו )‪(a, b‬‬
‫‪00‬‬
‫‪00‬‬
‫ולפיכך יסיים בתמורה ‪ x1 < y1 < . . . , xk < yk‬בסתירה לכך ש־ ‪.bt < at+1‬‬
‫מ־)א( ו־)ב( נובע כי המסלול ‪ P‬הינו באורך לפחות ‪ 2k + 1‬ולכן ‪.Cmerge (k, k) ≥ 2k − 1‬‬
‫‬
‫‪9‬‬
‫ערימות‬
‫נסמן }‪ N = {n ∈ Z : n ≥ 1‬ונגדיר ל־ ‪i ∈ N‬‬
‫‪right(i) = 2i + 1.‬‬
‫‪lef t(i) = 2i,‬‬
‫העץ הבינארי האינסופי הוא הגרף המכוון על קבוצת הקודקודים ‪ N‬שצלעותיו הן ))‪(i, lef t(i)), (i, right(i‬‬
‫לכל ‪ .i ≥ 1‬עץ בינארי ‪ T‬על ‪ n‬קודקודים ייקרא מאוזן אם הוא איזומורפי לתת הגרף של‬
‫העץ הבינארי האינסופי המושרה על קבוצת הקודקודים }‪.[n] = {1, . . . , n‬‬
‫יהא ‪ T‬עץ בינארי מאוזן על קבוצת הקודקודים ‪ |V | = n ,V‬ויהא ‪ A = (A(v))v∈V‬מערך‬
‫המאונדקס על ידי ‪ A .V‬ייקרא ערימה אם לכל ‪ v ∈ V‬מתקיים‬
‫‪A(v) ≥ max{A(lef t(v)), A(right(v))}.‬‬
‫)כמובן‪ ,‬נתייחס ל־ )‪ lef t(v), right(v‬רק אם הם מוגדרים‪(.‬‬
‫לקודקוד ‪ u ∈ V‬נסמן ב־ ‪ Tu‬את תת העץ הנטוע ב־ ‪.u‬‬
‫בניית ערימה‬
‫דרך אחת להפוך מערך ‪ (A(v))v∈V‬לערימה היא על ידי מיון הדורש )‪ O(n log n‬השוואות‪:‬‬
‫אנו נתאר אלגוריתם יעיל יותר הדורש רק )‪ O(n‬השוואות‪ .‬האלגוריתם ישתמש בשגרת עזר‬
‫הפותרת את הבעייה הבאה‪ :‬נניח כי ‪ v ∈ V‬וכי צמצום ‪ A‬ל־ )‪ Tlef t(v‬הוא ערימה וכן צמצום‬
‫‪ A‬ל־ )‪ Tright(v‬הוא ערימה‪.‬‬
‫)‪ Heapif y(A, n, v‬המתוארת להלן הופכת את ‪ A‬המצומצם ל־ ‪ Tv‬לערימה‪:‬‬
‫)‪Heapify(A, n, v‬‬
‫‪if A(v) ≥ max{A(lef t(v)), A(right(v))} stop.‬‬
‫)‪else if A(lef t(v)) > A(v‬‬
‫)‪exchange A(lef t(v)) & A(v‬‬
‫))‪Heapif y(A, n, lef t(v‬‬
‫‪else‬‬
‫)‪exchange A(right(v)) & A(v‬‬
‫))‪Heapif y(A, n, right(v‬‬
‫נסמן ב־ )‪ height(v‬את גובה העץ ‪ ,Tv‬אזי הסיבוכיות של )‪ Heapif y(A, n, v‬הינה‬
‫))‪.O(height(v‬‬
‫בניית ערימה מתבצעת על ידי האלגוריתם הבא‪:‬‬
‫)‪makeheap(A,n‬‬
‫‪For i = n down to 1‬‬
‫)‪Heapif y(A, n, i‬‬
‫יהא ‪ 2m ≤ n ≤ 2m+1 − 1‬אזי הסיבוכיות של ‪ makeheap‬הינה‬
‫!‬
‫‪n‬‬
‫‪2m+1‬‬
‫‪X‬‬
‫‪X−1‬‬
‫(‪heightT (i) = O‬‬
‫= ))‪heightT (i‬‬
‫‪O‬‬
‫‪i=1‬‬
‫‪i=1‬‬
‫‪10‬‬
m
m
X
X
j
O(
(m − j)2 ) = O(
j2m−j )
j=0
j=0
≤ O(2m )
∞
X
j2−j .
j=0
∞
X
jxj = x(
j=0
∞
X
j=1
=x·(
‫עתה‬
∞
X
0
jxj−1 ) = x(
xj )
j=0
x
1 0
.
) =
1−x
(1 − x)2
P∞
.O(2m ) = O(n) ‫ היא‬makeheap(A, n) ‫ לכן הסיבוכיות של‬. j=1 j2−j = 2 ‫ולכן‬
‫מיון ערימה‬
Heapsort(A, n)
makeheap(A, n)
For i = n down to 2
exchange A(1) ↔ A(i)
Heapif y({A(1), . . . , A(i − 1)}, 1)
‫ חסומה על ידי‬Heapsort ‫הסיבוכיות של‬
CHeapsort (n) ≤ CM akeheap (n) + (n − 1)O(log n) ≤ O(n log n)
‫בחירה‬
.aπ(1) < . . . < aπ(n) ,π ∈ Sn ‫ סדרה עם תמורה ממיינת‬A = (a1 , . . . , an ) ‫תהא‬
‫נגדיר‬
sel(A, k) = aπ(k) .
.sel(A, 1) = min A, sel(A, n) = max A ‫למשל‬
‫ מיון מלא נותן כמובן‬.|A| = n ‫ עבור‬selk (A) ‫ את הסיבוכיות של חשוב‬C(n, k) ‫נסמן ב־‬
‫ בהמשך נראה כי קיים‬.Csel (n, k) ≤ O(n log n) ‫ ולכן‬,1 ≤ k ≤ n ‫ לכל‬sel(A, k) ‫את‬
.Csel (n, k) ≤ e
cn ‫ מתקיים‬k ‫ כך שלכל‬e
c ‫קבוע מוחלט‬
:‫טענה‬
Csel (n, 1) = n − 1 •
Csel (n, 2) = n + dlog2 ne − 2 •
11
‫נתאר עתה אלגוריתם רקורסיבי )‪ Sel(A, n, k‬המוצא את )‪ sel(A, k‬של סדרה ‪ A‬באורך ‪.n‬‬
‫)‪Sel(A, n, k‬‬
‫)א( נחלק את ‪ A‬לחמישיות ‪ F1 , . . . , F n5‬ונמצא את החציון של כל חמישייה‪:‬‬
‫)‪bi ← Sel(Fi , 5, 3‬‬
‫יהא ) ‪ B = (b1 , . . . , b n5‬וקטור החציונים‪.‬‬
‫‪n‬‬
‫‪ x ← Sel(B, n5 , 10‬החציון של ‪.B‬‬
‫)ב( יהא )‬
‫)ג( נחשב‪:‬‬
‫}‪C = {ai ∈ A : ai < x‬‬
‫}‪D = {ai ∈ A : ai > x‬‬
‫)ד(‬
‫‪‬‬
‫‪|C| ≥ k‬‬
‫)‪ Sel(C, |C|, k‬‬
‫‪x‬‬
‫‪|C| = k − 1‬‬
‫← )‪Sel(A, n, k‬‬
‫‪‬‬
‫‪Sel(D, |D|, k − |C| − 1) |C| ≤ k − 2‬‬
‫נסמן ב־ )‪ cSel (n, k‬את הסיבוכיות של האלגוריתם )‪ Sel(A, n, k‬ונסמן‬
‫‪e‬‬
‫)‪ .S(n‬הערכת )‪ S(n, k‬מבוססת על העובדה הבאה‪:‬‬
‫)‪= max1≤k≤n cSel (n, k‬‬
‫טענה‪ C, D :‬המתקבלות בצעד ‪ 3‬באלגוריתם מקיימות‬
‫‪7n‬‬
‫‪10‬‬
‫≤ |‪|C|, |D‬‬
‫‪12‬‬
‫ יהיו‬:‫הוכחה‬
[
C0 =
{y ∈ Fi : y ≤ bi } ⊂ C
{i:bi <x}
D0
[
D0 =
{y ∈ Fi : y ≥ bi } ⊂ D
{i:bi >x}
3n
|C| ≥ |C0 | ≥
10
|D| ≥ |D0 | ≥
‫אזי‬
3n
10
‫ולכן‬
C0
|C| ≤ n − |D| ≤
7n
10
|D| ≤ n − |C| ≤
7n
10
Sel(A, n, k) ‫הערכת סיבוכיות‬
:‫נעריך את מספר ההשוואות בכל אחד מהשלבים באלגוריתם‬
5
.‫־ים‬bi ‫ השוואות למציאת ה־‬n5 · cSel (5, 3) ≤ n5 ·
= 2n (‫)א‬
2
n
.x ‫ השוואות למציאת‬cSel ( n5 , 10
) (‫)ב‬
.C, D ‫ השוואות לקביעת‬n (‫)ג‬
.sel(D, |C| − k − 1) ‫ ו־‬sel(C, k) ‫ השוואות למציאת‬maxα cSel ( 7n
10 , α) (‫)ד‬
‫לכן‬
cSel (n, k) ≤ 2n + cSel
n n ,
+ n + max cSel
α
5 10
7n
,α
10
e n ) + S(
e 7n )
≤ 3n + S(
5
10
‫ולכן‬
e
e n ) + S(
e 7n )
S(n)
≤ 3n + S(
5
10
‫ אזי‬,
Pm
i=1 θi
g(n) ≤
1−
13
< 1 ‫ כאשר‬g(n) ≤
Cn
Pm
i=1 θi
.
Pm
i=1
:‫למה‬
g(θi n) + cn ‫אם‬
‫‬
‫מסקנה‪:‬‬
‫‪= 30n‬‬
‫‪7‬‬
‫‪10‬‬
‫‪3n‬‬
‫‪e‬‬
‫)‪cSel (n, k) ≤ S(n‬‬
‫≤‬
‫‪1 − 15 −‬‬
‫קידוד חסר רעש ‪(noiseless) coding‬‬
‫הבעייה‪ :‬נתון קובץ הכתוב באלף בית סופי ‪ .x1 , . . . , xn‬ברצוננו לקודד אותו בתווים‬
‫בינאריים כך שיתקיים‪:‬‬
‫)א( אפשר יהיה לשחזר את הקובץ המקורי מהקובץ המקודד‪.‬‬
‫)ב( הקובץ המקודד יהיה באורך מינימלי‪.‬‬
‫דוגמא‪ :‬האלף בית הוא }‪ .{A, B, C, D‬בקובץ ‪ N‬אותיות עם טבלת השכיחויות הבאה‪:‬‬
‫‪D‬‬
‫‪C‬‬
‫‪B‬‬
‫‪A‬‬
‫‪1‬‬
‫‪8‬‬
‫‪1‬‬
‫‪8‬‬
‫‪1‬‬
‫‪4‬‬
‫‪1‬‬
‫‪2‬‬
‫אות‬
‫שכיחות‬
‫פתרון א‪:‬‬
‫‪D‬‬
‫‪11‬‬
‫‪C‬‬
‫‪10‬‬
‫‪B‬‬
‫‪01‬‬
‫‪A‬‬
‫‪00‬‬
‫הקובץ המקודד הוא באורך‬
‫אות‬
‫קוד‬
‫‪N‬‬
‫‪N‬‬
‫‪N‬‬
‫‪N‬‬
‫‪·2+ ·2+ ·2+ ·2 = 2N‬‬
‫‪2‬‬
‫‪4‬‬
‫‪8‬‬
‫‪8‬‬
‫ביטים‬
‫פתרון ב‪:‬‬
‫‪D‬‬
‫‪111‬‬
‫‪C‬‬
‫‪110‬‬
‫‪B‬‬
‫‪10‬‬
‫‪A‬‬
‫‪0‬‬
‫הקובץ המקודד הוא באורך‬
‫אות‬
‫קוד‬
‫‪N‬‬
‫‪N‬‬
‫‪N‬‬
‫‪N‬‬
‫‪·1+ ·2+ ·3+ ·3 = 1.75N‬‬
‫‪2‬‬
‫‪4‬‬
‫‪8‬‬
‫‪8‬‬
‫ביטים‬
‫אנו רואים כי בחירה מושכלת של הקוד יכולה לשפר משמעותית את אורך הקובץ המקודד‪.‬‬
‫הגדרה‪ :‬צופן רישא הוא אוסף מילים בינאריות ‪ w1 , . . . , wM ∈ {0, 1}N‬כך שלכל ‪i 6= j‬‬
‫המילה ‪ wi‬איננה רישא של ‪.wj‬‬
‫טענה‪ :‬צופן רישא ניתן לפענוח יחיד‪ .‬כלומר‪ ,‬אם‬
‫‪wi0 . . . wis = wj0 . . . wjt‬‬
‫אזי ‪ s = t‬ומתקיים ‪ il = jl‬לכל ‪.1 ≤ l ≤ t‬‬
‫טענה‪ :‬יש התאמה חח"ע בין עצים בינאריים עם ‪ M‬עלים לבין צופני רישא עם ‪ M‬מילים‪.‬‬
‫‪14‬‬
‫הוכחה‪ :‬נסמן את צלעות העץ הפונות שמאלה ב־ ‪ 0‬ואת אלה הפונות ימינה ב־ ‪ .1‬לכל עלה‬
‫‪ j‬מתאים את המילה הבינארית המתארת את המסלול מהשורש לעלה‪ .‬אוסף ‪ M‬המילים‬
‫המתקבל באופן זה מעץ עם ‪ M‬עלים הוא צופן רישא‪ ,‬וכל צופן רישא מתקבל באופן יחיד‪.‬‬
‫‬
‫דוגמא‪:‬‬
‫}‪{000, 001, 01, 10, 11‬‬
‫‪1‬‬
‫‪1‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪ {wi }M‬עם אורכים ‪ |wi | = li‬אם ורק אם‬
‫טענה‪ :‬קיים צופן רישא ‪i=1‬‬
‫‪2−li ≤ 1‬‬
‫‪M‬‬
‫‪X‬‬
‫‪i=1‬‬
‫לפי השקילות בין עצים בינאריים לבין צופני רישא הטענה שקולה ל‪:‬‬
‫טענה‪:‬‬
‫קיים עץ בינארי ‪ T‬עם עלים ‪ v1 , . . . , vM‬כך ש ‪ hT (vi ) = li‬אם ורק אם‬
‫‪2−li ≤ 1‬‬
‫‪M‬‬
‫‪X‬‬
‫‪i=1‬‬
‫)כאן )‪ hT (v‬הוא גובה העלה ‪ v‬בעץ ‪ ,T‬כלומר המרחק בין השורש לעלה ‪.(v‬‬
‫הוכחה‪:‬‬
‫כיוון ⇐‪ :‬יהא ‪ .L = max1≤i≤M li‬יהא ∞‪ T‬העץ הבינארי השלם האינסופי‪ .‬לכל ‪1 ≤ i ≤ n‬‬
‫נסמן‬
‫‪ v}.‬צאצא של ‪Ai = {v ∈ T∞ : hT∞ (v) = L, vi‬‬
‫אזי ‪ |Ai | = 2L−li‬ו־ ∅ = ‪ Ai ∩ Aj‬לכל ‪ 1 ≤ i < j ≤ n‬ולכן‬
‫‪2−li ≤ 1.‬‬
‫‪M‬‬
‫‪X‬‬
‫⇒ ‪2L−li‬‬
‫‪i=1‬‬
‫‪M‬‬
‫‪X‬‬
‫‪i=1‬‬
‫= | ‪Ai‬‬
‫‪n‬‬
‫[‬
‫| ≥ ‪2L‬‬
‫‪i=1‬‬
‫כיוון ⇒‪ :‬בלי הגבלת הכלליות נניח כי ‪ .lM = max1≤i≤M li‬לפי הנחת האינדוקציה קיים‬
‫‪0‬‬
‫עץ ‪ T‬עם עלים ‪ v1 , . . . , vM −1‬כך ש־ ‪ hT 0 (vi ) = li‬לכל ‪ .1 ≤ i ≤ M − 1‬יהיו‬
‫‪ v}.‬צאצא של ‪Ai = {v ∈ T∞ : hT∞ (v) = lM , vi‬‬
‫‪15‬‬
‫הקבוצות ‪ Ai‬זרות בזוגות ומקיימות ‪.|Ai | = 2lM −li‬‬
‫‪M‬‬
‫‪−1‬‬
‫‪X‬‬
‫‬
‫‪2lM −li ≤ 2lM 1 − 2−lM = 2lM − 1.‬‬
‫= | ‪|Ai‬‬
‫לכן קיים קודקוד ‪ vM‬בגובה ‪ lM‬שאינו שייך ל־ ‪Ai‬‬
‫‪i=1‬‬
‫‪i=1‬‬
‫‪i=1‬‬
‫‪MS‬‬
‫‪−1‬‬
‫‪M‬‬
‫‪−1‬‬
‫‪X‬‬
‫= | ‪Ai‬‬
‫‪M‬‬
‫‪−1‬‬
‫[‬
‫|‬
‫‪0‬‬
‫ולכן } ‪ vm‬וכל אבותיו{ ∪ ‪T = T‬‬
‫‪i=1‬‬
‫‪.‬‬
‫הוא העץ הדרוש‪.‬‬
‫נסמן ב־|‪ |w‬את האורך של מילה בינארית ‪.w‬‬
‫בעיית הקידוד חסר הרעש )‪:(noiseless coding‬‬
‫בהינתן וקטור הסתברויות ) ‪pi = 1 ,pi ≥ 0 ,p = (p1 , . . . , pM‬‬
‫‪M‬‬
‫‪P‬‬
‫מצא צופן רישא‬
‫‪i=1‬‬
‫‪ w1 , . . . , wM‬כך ש־ | ‪pi |wi‬‬
‫‪M‬‬
‫‪P‬‬
‫הוא מינימלי‪.‬‬
‫‪i=1‬‬
‫ניסוח שקול‪ :‬מצא עץ עם עלים ‪ v1 , . . . , vM‬כך ש־ ) ‪pi hT (vi‬‬
‫‪M‬‬
‫‪P‬‬
‫= )‪ c(T, p‬מינימלי‪.‬‬
‫‪i=1‬‬
‫נסמן )‪.f (p) = minT c(T, p‬‬
‫‪M‬‬
‫‪P‬‬
‫תהא ‪pi log2 p1i‬‬
‫= ) ‪ H(p) = H(p1 , . . . , pM‬פונקציית האנטרופיה המוגדרת על‬
‫}‪pi = 1‬‬
‫‪n‬‬
‫‪P‬‬
‫‪i=1‬‬
‫‪.{(p1 , . . . , pM ) : pi ≥ 0,‬‬
‫‪i=1‬‬
‫משפט ‪Shannon‬‬
‫‪H(p) ≤ f (p) < H(p) + 1‬‬
‫הוכחה‪ :‬בהינתן ) ‪ p = (p1 , . . . , pM‬נגדיר‬
‫‪pi = 1‬‬
‫‪M‬‬
‫‪X‬‬
‫=‬
‫‪1‬‬
‫‪pi e‬‬
‫‪ .li = dlog2‬אזי‬
‫‪−log2 p1‬‬
‫‪2‬‬
‫‪i‬‬
‫‪i=1‬‬
‫‪M‬‬
‫‪X‬‬
‫≤ ‪2−li‬‬
‫‪i=1‬‬
‫‪M‬‬
‫‪X‬‬
‫‪i=1‬‬
‫ולכן קיים עץ בינארי ‪ T‬עם עלים ‪ v1 , . . . , vM‬כך ש־ ‪ hT (vi ) = li‬ולכן‬
‫‪M‬‬
‫‪X‬‬
‫‪1‬‬
‫‪1‬‬
‫<‪e‬‬
‫‪pi (log2‬‬
‫‪+ 1) = H(p) + 1‬‬
‫‪pi‬‬
‫‪p‬‬
‫‪i‬‬
‫‪i=1‬‬
‫‪pi dlog2‬‬
‫‪M‬‬
‫‪X‬‬
‫‪i=1‬‬
‫= ‪pi li‬‬
‫‪M‬‬
‫‪X‬‬
‫≤ )‪f (p‬‬
‫‪i=1‬‬
‫הפונקציה )‪ g(y) = log2 (y‬קמורה ולכן לכל ‪ y1 , . . . , yM‬ו־ ) ‪ p = (p1 , . . . , pM‬כך ש־‬
‫‪M‬‬
‫‪P‬‬
‫‪ pi ≥ 0 , pi = 1‬מתקיים‬
‫‪i=1‬‬
‫) ‪pi g(yi‬‬
‫‪n‬‬
‫‪X‬‬
‫!‬
‫≥‬
‫‪i=1‬‬
‫‪pi yi‬‬
‫‪n‬‬
‫‪X‬‬
‫‪i=1‬‬
‫‪16‬‬
‫‪g‬‬
‫ולכן‬
PM
i=1
2−li ≤ 1 ‫ אזי‬.l1 , . . . , lM ‫ צופן רישא עם אורכים‬w1 , . . . , wM ‫יהא‬
0 ≥ log2
M
X
M
X
2−li
2−li = log2 (
)
pi
pi
i=1
i=1
M
X
M
M
M
X
X
X
2−li
1
−li
≥
=
+
pi log2
pi log2
pi log2 2
= H(p) −
pi li
pi
pi i=1
i=1
i=1
i=1
:‫ לפי משפט שנון‬,‫ מצד שני‬.f (p) ≤ 1.75 ‫ ראינו כי‬.p = ( 21 , 14 , 18 , 18 ) :‫דוגמא‬
1
1
1
1
log2 2 + log2 4 + log2 8 + log2 8 = 1.75.
2
4
8
8
f (p) ≥ H(p) =
.‫לכן הצופן שתיארנו הוא אופטימלי‬
f (p1 , . . . , pM ) ‫ למציאת‬Huffman ‫אלגוריתם‬
‫ אזי‬.pi ≥ 0,
PM
i=1
pi = 1 ,p1 ≥ . . . pM −1 ≥ pM ‫ יהיו‬:‫משפט‬
f (p1 , . . . , pM ) = f (p1 , . . . , pM −2 , pM −1 + pM ) + pM −1 + pM
0
0
p = (p1 , . . . , pM −2 , pM −1 + pM ) ‫ עץ אופטימלי עבור הוקטור‬T ‫ יהא‬:‫ כוון אחד‬:‫הוכחה‬
0
0
0
‫ לשני בניו‬vM −1 ‫ על ידי פיצול‬T ‫ עץ חדש‬T ‫ ניצור מ־‬.v1 , . . . , vM −2 , vM −1 ‫עם עלים‬
‫ אזי‬.vM −1 , vM
0
0
c(T , p ) =
M
−2
X
0
pi hT 0 (vi ) + (pM −1 + pM )hT 0 (vM −1 )
i=1
:‫לכן‬
c(T, p) =
M
−2
X
pi hT (vi ) + pM −1 hT (vM −1 ) + pM hT (vM )
i=1
=
M
−2
X
0
0
pi hT 0 (vi ) + pM −1 (hT 0 (vM −1 ) + 1) + pM −2 (hT 0 (vM −1 ) + 1)
i=1
0
0
= c(T , p ) + pM −1 + pM
‫ולכן‬
0
0
f (p1 , . . . , pM ) ≤ c(T, p) = c(T , p ) + pM −1 + pM
= f (p1 , . . . , pM −2 , pM −1 + pM ) + pM −1 + pM
T ‫ אם העלים של‬.p1 ≥ . . . ≥ pM ,p = (p1 , . . . , pM ) ‫ עץ אופטימלי ל־‬T ‫ יהא‬:‫כוון שני‬
PM
.f (p) = i=1 pi hT (vi ) ‫ אזי מתקיים‬v1 , . . . , vM ‫הם‬
17
‫יהא ‪ 1 ≤ i ≤ M‬כך ש־‬
‫} ‪hT (vi ) = max{hT (vj ) : 1 ≤ j ≤ M‬‬
‫‪0‬‬
‫נסמן ב־ ‪ T‬את העץ המתקבל מ־ ‪ T‬על ידי החלפת ‪ vM‬ב־ ‪.vi‬‬
‫‪0‬‬
‫‪T‬‬
‫‪T‬‬
‫‪vM‬‬
‫‪vi‬‬
‫‪vi‬‬
‫‪vM‬‬
‫‪0‬‬
‫טענה‪ T :‬עץ אופטימלי ל־ ‪.P‬‬
‫הוכחה‪:‬‬
‫‪0‬‬
‫] ‪c(T , p) − c(T, p) = [hT 0 (vi )pi + hT 0 (vM )pM ] − [hT (vi )pi + hT (vM )pM‬‬
‫] ‪= [hT (vM )pi + hT (vi )pM ] − [hT (vi )pi + hT (vM )pM‬‬
‫‪= (hT (vM ) − hT (vi ))(pi − pM ) ≤ 0‬‬
‫‪0‬‬
‫לכן )‪ .c(T , p) ≤ c(T, p‬‬
‫מהטענה נובע כי קיים ‪ T‬אופטימלי כך ש־ ) ‪ .hT (vM ) = max1≤i≤M hT (vi‬מאופטימליות‬
‫‪ T‬נובע כי ‪ vM‬אינו בן יחיד שהרי אז אפשר היה להחליפו באביו ולהקטין את )‪ .c(T, p‬לכן‬
‫לאביו של ‪ vM‬יש צאצא נוסף ‪ .vi‬ממקסימליות ) ‪ hT (vM‬נובע כי ‪ vi‬הוא אחיו של ‪.vM‬‬
‫‪0‬‬
‫יהא ‪ vj‬כך ש־ } ‪ hT (vj ) = max{hT (vk ) : k 6= M‬ויהא ‪ T‬העץ המתקבל מהחלפת ‪ vj‬ו־‬
‫‪.vM −1‬‬
‫‪0‬‬
‫טענה‪ T :‬עץ אופטימלי ל־ ‪.p‬‬
‫הוכחה‪:‬‬
‫‪0‬‬
‫] ‪c(T , p) − c(T, p) = [hT 0 (vj )pj + hT 0 (vM −1 )pM −1 ] − [hT (vj )pj + hT (vM −1 )pM −1‬‬
‫] ‪= [hT (vM −1 )pj + hT (vj )pM −1 ] − [hT (vj )pj + hT (vM −1 )pM −1‬‬
‫‪= (hT (vM −1 ) − hT (vj )) (pj − pM −1 ) ≤ 0‬‬
‫‪0‬‬
‫ולכן )‪ .c(T , p) = c(T, p‬‬
‫‪18‬‬
‫מהטענות נובע כי קיים ‪ T‬אופטימלי שבו ‪ vM −1 , vM‬אחים‪ .‬נגדיר את ‪ S‬להיות עץ עם עלים‬
‫‪ u1 , . . . , uM −1‬על ידי‪:‬‬
‫‬
‫‪vi‬‬
‫‪1≤i≤M −2‬‬
‫= ‪ui‬‬
‫‪parent(vM −1 ) = parent(vM ) i = M − 1‬‬
‫ויהא ) ‪ .q = (q1 , . . . , qM −1 ) = (p1 , . . . , pM −2 , pM −1 + pM‬אזי‬
‫) ‪pi hT (vi ) + (pM −1 + pM )hS (uM −1‬‬
‫‪M‬‬
‫‪−2‬‬
‫‪X‬‬
‫= ) ‪qi hS (ui‬‬
‫‪M‬‬
‫‪−1‬‬
‫‪X‬‬
‫= )‪c(S, q‬‬
‫‪i=1‬‬
‫‪i=1‬‬
‫)‪pi hT (vi ) + (pM −1 + pM )(hT (vM −1 ) − 1‬‬
‫‪M‬‬
‫‪−2‬‬
‫‪X‬‬
‫=‬
‫‪i=1‬‬
‫) ‪pi hT (vi ) − (pM −1 + pM ) = c(T, p) − (pM −1 + pM‬‬
‫‪M‬‬
‫‪X‬‬
‫=‬
‫‪i=1‬‬
‫לפיכך‬
‫) ‪f (p1 , . . . , pM −2 , pM −1 + pM ) = f (q) ≤ f (p) − (pM −1 + pM‬‬
‫‬
‫אלגוריתם הופמן למציאת קוד רישא אופטימלי ל־ ) ‪:p = (p1 , . . . , pM‬‬
‫מצא את שני האיברים המינימליים ב־ ‪ .p‬בלי הגבלת הכלליות‬
‫‪.p1 , . . . , pM −2 ≥ pM −1 , pM‬‬
‫מצא ברקורסיה קוד רישא אופטימלי ל־ ) ‪ q = (p1 , . . . , pM −2 , pM −1 + pM‬ופצל את‬
‫הקודקוד המתאים ל־ ‪ pM +1 + pM‬לשני בניו‪.‬‬
‫דוגמא‪:‬‬
‫‪1‬‬
‫‪0.45‬‬
‫}‪{000, 001, 01, 10, 11‬‬
‫‪0.55‬‬
‫‪0.25 0.3‬‬
‫‪19‬‬
‫‪0.25‬‬
‫‪0.10.15 0.2‬‬
‫עצים פורשים מינימליים והאלגוריתם החמדן‬
‫עצים ויערות‬
‫גרף )‪ G = (V, E‬ייקרא קשיר אם יש בו מסלול בין כל שני קודקודים‪.‬‬
‫‪ G‬ייקרא אציקלי או יער אם אינו מכיל מעגלים‪.‬‬
‫‪ G‬הוא עץ אם ‪ G‬קשיר ואציקלי‪.‬‬
‫עץ פורש של ‪ G‬הוא תת גרף ) ‪ E 0 ⊂ E ,T = (V, E 0‬כך ש־ ‪ T‬עץ‪.‬‬
‫נסמן ב־ )‪ c(G‬את מספר רכיבי הקשירות של גרף ‪.G‬‬
‫טענה‪:‬‬
‫)א( כל עץ מכיל עלה‪.‬‬
‫)ב( אם )‪ T = (V, E‬עץ אזי ‪ .|E| = |V | − 1‬באופן כללי‪ :‬אם )‪ G = (V, E‬יער אזי‬
‫)‪.|E| = |V | − c(G‬‬
‫)ג( יהא )‪ G = (V, E‬גרף קשיר ויהא ) ‪ F = (V, E 0‬יער כאשר ‪ ,E 0 ⊂ E‬אזי קיים עץ‬
‫פורש ) ‪ T = (V, E 00‬כך ש ־ ‪.E 0 ⊂ E 00 ⊆ E‬‬
‫בפרט‪ :‬כל גרף קשיר מכיל עץ פורש‪.‬‬
‫טענה )תכונת החילוף ליערות(‪ :‬יהיו ) ‪ F2 = (V, E2 ) ,F1 = (V, E1‬שני יערות על אותה‬
‫קבוצת קודקודים ‪ .V‬אם | ‪ |E1 | < |E2‬אזי קיימת צלע ‪ e ∈ E2 − E1‬כך ש־ )}‪(V, E1 ∪ {e‬‬
‫יער‪.‬‬
‫הקודקודים של רכיבי הקשירות השונים‬
‫‬
‫הוכחה‪ :‬יהא ) ‪ k = c(F1‬ויהיו ‪ V1 , . . . , Vk‬קבוצות ‬
‫‪Vi‬‬
‫‪ (Vi ,‬הוא יער )כי אינו מכיל‬
‫של ‪ .F1‬נשים לב כי לכל ‪ 1 ≤ i ≤ k‬הגרף ) ‪∩ E2‬‬
‫‪2‬‬
‫‬
‫‬
‫‪Vi‬‬
‫|‪.‬‬
‫מעגל( ולכן ‪∩ E2 | ≤ |Vi | − 1‬‬
‫‪2‬‬
‫עתה‪ :‬אם קיימים ‪ 1 ≤ i < j ≤ k‬וצלע ‪ e = {u, v} ∈ E2‬כך ש־ ‪ u ∈ Vi , v ∈ Vj‬אזי‬
‫}‪ E1 ∪ {e‬יער כדרוש‪.‬‬
‫‪Vj‬‬
‫‪Vk‬‬
‫‬
‫אחרת )‬
‫‪Vi‬‬
‫‪2‬‬
‫‬
‫‪Sk‬‬
‫∩ ‪i=1 (E2‬‬
‫‪V1‬‬
‫‪Vi‬‬
‫= ‪ E2‬ואזי‬
‫| ‪(|Vi | − 1) = |V | − k = |E1‬‬
‫‪k‬‬
‫‪X‬‬
‫‪i=1‬‬
‫‪20‬‬
‫‬
‫≤|‬
‫‪Vi‬‬
‫‪2‬‬
‫‬
‫∩ ‪|E2‬‬
‫‪k‬‬
‫‪X‬‬
‫‪i=1‬‬
‫= | ‪|E2‬‬
‫בסתירה להנחה | ‪ .|E2 | > |E1‬‬
‫ברצוננו למצוא עץ פורש‬
‫יהא )‪ G = (V, E‬גרף קשיר עם ‪0‬פונקציית משקל ‪P .w : E → R‬‬
‫מינימלי )עפ"מ( ב־ ‪ ,G‬כלומר עץ ) ‪ T = (V, E‬כך ש־ )‪ w(T ) = e∈E 0 w(e‬מינימלי‪.‬‬
‫הערה‪ :‬לפונקציית משקל ‪ w‬יתכנו מספר עצים פורשים מינימליים‪.‬‬
‫אלגוריתם קרוסקל )‪ (Kruskal‬למציאת עפ"מ‬
‫אתחול‪ :‬תהא ‪ e1 ∈ E‬כך ש־ }‪.w(e1 ) = min{w(e) : e ∈ E‬‬
‫איטרציה‪ :‬נניח שבחרנו את ‪ .1 ≤ k ≤ n − 2 ,e1 , . . . , ek‬נבחר צלע‬
‫מינימלי כך שהגוף )} ‪ (v, {e1 , . . . , ek , ek+1‬אציקלי‪.‬‬
‫נסמן } ‪.E 0 = {e1 , . . . , en−1‬‬
‫‪ ek+1‬בעלת משקל‬
‫‪0‬‬
‫טענה‪ (V, E ) :‬עפ"מ של הגרף הממושקל ‪.G‬‬
‫נוכיח עובדה יותר חזקה‪.‬‬
‫‪0‬‬
‫טענה‪ :‬יהא ) ‪ T = (V, F‬עץ פורש כלשהוא ב־ ‪ ,F = {f1 , . . . , fn−1 } ,G‬כך ש־‬
‫‪w(f1 ) ≤ · · · ≤ w(fn−1 ).‬‬
‫אזי לכל ‪ 1 ≤ k ≤ n − 1‬מתקיים‬
‫) ‪w(ek ) ≤ w(fk‬‬
‫הוכחה‪ :‬נסמן } ‪ (V, Ek−1 ) .Ek−1 = {e1 , . . . , ek−1 }, Fk = {f1 , . . . , fk‬ו־ ) ‪ (V, Fk‬הם‬
‫יערות ולכן לפי למת החילוף קיימת צלע ‪ fi ∈ Fk‬כך ש־ } ‪ Ek−1 ∪ {fi‬יער‪ .‬לכן לפי בחירת‬
‫‪ ek‬נובע כי ) ‪ .w(fi ) ≥ w(ek‬מאחר ו־ ) ‪ w(fk ) ≥ w(fi‬הרי שגם ) ‪ .w(fk ) ≥ w(ek‬‬
‫דוגמא‪:‬‬
‫‪1‬‬
‫‪g‬‬
‫‪b‬‬
‫‪e2‬‬
‫‪e4 4‬‬
‫‪e1‬‬
‫‪1‬‬
‫‪a‬‬
‫‪6‬‬
‫‪f‬‬
‫‪2‬‬
‫‪e3‬‬
‫‪c‬‬
‫‪3‬‬
‫‪9‬‬
‫‪10‬‬
‫‪e6‬‬
‫‪7‬‬
‫‪e‬‬
‫‪e5‬‬
‫‪8‬‬
‫‪10‬‬
‫‪d‬‬
‫תיאור מפורט של אלגוריתם קרוסקל‪ :‬נסמן בכל שלב את רכיב הקשירות של הקודקוד ‪v‬‬
‫בעץ המתהווה ‪ F‬על ידי )‪.A(v‬‬
‫אתחול‪ A(u) = {u} ,F ← ∅ :‬לכל ‪.u ∈ V‬‬
‫‪21‬‬
‫מיין את צלעות ‪.w(f1 ) ≤ . . . ≤ w(fm ) G‬‬
‫לכל ‪ 1 ≤ k ≤ m‬בצע‪ :‬תהי }‪ .fk = {u, v‬אם )‪ A(u) 6= A(v‬אזי } ‪ F ← F ∪ {fk‬ולכל‬
‫)‪.A(x) ← A(u) ∪ A(v) ,x ∈ A(u) ∪ A(v‬‬
‫צלעות רכיבי קשירות‬
‫‪F‬‬
‫‪ab‬‬
‫‪ab,c,d,e,f,g‬‬
‫‪ab‬‬
‫‪ab,bg‬‬
‫‪abg,c,d,e,f‬‬
‫‪bg‬‬
‫‪ab,bg,bc‬‬
‫‪abcg,d,e,f‬‬
‫‪bc‬‬
‫‪a‬‬
‫‪c‬‬
‫‬
‫‪ab,bg,bc,gf‬‬
‫‪abcgf,d,e‬‬
‫‪gf‬‬
‫‪af‬‬
‫‪abcdgf,e‬‬
‫‪ad‬‬
‫‪ab,bg,bc,gf,ad‬‬
‫‪c‬‬
‫‪d‬‬
‫‬
‫‪ab,bg,bc,gf,ad,ad‬‬
‫‪abcdegf‬‬
‫‪ae‬‬
‫‪ef‬‬
‫‪e‬‬
‫‪d‬‬
‫‬
‫ניתוח סיבוכיות אלגוריתם קרוסקל‬
‫בכל שלב של האלגוריתם נחזיק אוסף רכיבי קשירות שחלקם ריקים ‪ .A1 , . . . , An‬בתחילת‬
‫האלגוריתם ‪ |Ai | = 1‬לכל ‪ .1 ≤ i ≤ n‬נסמן | ‪ `i = |Ai‬ולכל ‪ v ∈ V‬יהא )‪ i(v‬כך ש־‬
‫)‪ .v ∈ Ai(v‬בשלב ה־ ‪ k‬בודקים את הצלע ה־ ‪ k‬הקטנה ביותר }‪.fk = {u, v‬‬
‫)‪ (I‬אם )‪ i(u) = i(v‬עוברים לצלע הבאה‪.‬‬
‫)‪ (II‬אחרת )‪ .i(u) 6= i(v‬אם )‪ `i(u) > `i(v‬מאחדים את )‪ Ai(v‬לתוך )‪ Ai(u‬ומעדכנים את‬
‫)∗(‪ A‬ואת )∗(‪.i‬‬
‫ספירת פעולות‪ O(|E| log |E|) :‬למיון הצלעות‪ .‬בדיקת )‪ i(u) = i(v‬לכל צלע }‪{u, v‬‬
‫ובסה"'כ )|‪ O(|E‬השוואות‪ .‬עבור ‪ |V | − 1‬צלעות מתבצע )‪.(II‬‬
‫טענה‪ :‬כל קודקוד מוזז‪/‬מעודכן )| ‪ O(log(|V‬פעמים‪.‬‬
‫הוכחה‪ :‬נשים לב כי אם הקודקוד )‪ v ∈ Ai(v‬הוזז ל־ )‪ Ai(u‬אזי הקבוצה החדשה של ‪v‬‬
‫גדולה לפחות פי שניים מ־ )‪ .Ai(v‬לכן מספר ההזזות של קודקוד קטן שווה מ־ | ‪ .log |V‬‬
‫לכן סה"כ פעולות ב־ )‪ (II‬הוא )| ‪ O(|V | log |V‬וסה"כ סיבוכיות האלגוריתם היא )|‪.O(|E| log |E‬‬
‫אלגוריתם פרים ‪PRIM‬‬
‫יהא ‪ v1‬קודקוד שרירותי ב־ ‪ .V‬נגדיר באינדוקציה סדרת עצים ) ‪ Tk = (Vk , Ek‬כך ש־‬
‫‪ ,Ek = {e1 , . . . , ek−1 } ⊂ E ,Vk = {v1 , . . . , vk } ⊂ V ,|Vk | = k‬באופן הבא‪:‬‬
‫} ‪.E1 = ∅ , V1 = {v1‬‬
‫נניח שהגדרנו את ) ‪ Tk = (Vk , Ek‬עבור ‪ ,1 ≤ k < n − 1‬ונגדיר את ‪ .Tk+1‬תהא‬
‫) ‪ e = {u, v} ∈ E(Vk , V −Vk‬צלע בעלת משקל מינימלי כך ש־ ‪ .u ∈ Vk , v ∈ V −Vk‬נגדיר‬
‫‪ Ek+1 = E∪{ek } ,Vk+1 = Vk ∪{vk+1 } ,vk+1 = v , ek = e‬ו־ ) ‪.Tk+1 = (Vk+1 , Ek+1‬‬
‫טענה‪ Tn :‬עפ"מ‪.‬‬
‫הוכחה‪ :‬נוכיח באינדוקציה על ‪ k‬כי ‪ Tk‬מוכל בעפ"מ‪ .‬טענה זו ברורה ל ‪.k = 1‬‬
‫‪22‬‬
‫נניח שהוכחנו זאת ל־ ‪ k‬ויהא ) ‪ Tk ⊂ T = (V, F‬עפ"מ‪ .‬אם ‪ ek ∈ F‬אזי ‪.Tk+1 ⊂ T‬‬
‫∈ ‪.ek‬‬
‫אחרת ‪/ F‬‬
‫יהא ‪ C‬מעגל ב־ } ‪ F ∪ {ek‬ותהא } ‪ f ∈ C − {ek‬כך ש־ ) ‪ .f ∈ E(Vk , V − Vk‬מבחירת ‪ek‬‬
‫נובע כי ) ‪.w(f ) ≥ w(ek‬‬
‫‪0‬‬
‫‪0‬‬
‫יהא )} ‪ .T = (V, F − {f } ∪ {ek‬אזי ‪ T‬ע"פ המקיים‬
‫‪0‬‬
‫) ‪w(T ) = w(T ) − w(f ) + w(ek+1 ) ≤ w(T‬‬
‫‪0‬‬
‫ולכן ‪ T‬עפ"מ המכיל את ‪ .Tk+1‬‬
‫ממוש של אלגוריתם ‪ PRIM‬ע"י ערימות‬
‫להלן‪ ,‬ערימה תהיה עץ בינארי מאוזן עם משקלות )‪ w(x‬על הקדקדים ‪ ,x‬כך ש‬
‫}))‪w(x) ≤ min{w(lef t(x)), w(right(x‬‬
‫אלגוריתם ‪PRIM‬‬
‫בכל שלב של האלגוריתם ‪ ,1 ≤ k ≤ n‬נחזיק עץ ) ‪Tk = (Vk , Ek‬‬
‫כאשר } ‪ ,Ek = {e1 , . . . , ek−1 } ,Vk = {v1 , . . . , vk‬וכן‪ ,‬ערימה ‪ Hk‬שקדקדיה הם צלעות‬
‫החתך ) ‪ (Vk , V − Vk‬המסודרת לפי המשקלות של הצלעות בגרף המקורי‪.‬‬
‫אתחול‪H1 ,V1 = {v1 } ,E1 = ∅ :‬־ ערימה על החתך ) ‪.(v1 , V − v1‬‬
‫אטרציה‪ :‬נתונים ) ‪ Tk = (Vk , Ek‬ו־ ‪ Hk‬כנ"ל‪ .‬נבחר את הצלע )‪,u ∈ Vk ,e = (u, v‬‬
‫‪ v ∈ V − Vk‬הנמצאת בשורש ‪.Hk‬‬
‫נגדיר ‪.Vk+1 = Vk ∪ {vk+1 } ,Ek+1 = Ek ∪ {ek } ,ek = e ,vk+1 = v‬‬
‫נעדכן את ‪ Hk‬ל־ ‪.Hk+1‬‬
‫בסוף התהליך ‪ ,Tn‬עפ"מ‪.‬‬
‫סבוכיות‪:‬‬
‫נחשב את סיבוכיות עדכון הערימה ‪ Hk‬לערימה ‪.Hk+1‬‬
‫בעדכון זה משמיטים מ־ ‪ Hk‬את כל הצלעות מהצורה ‪ xvk+1‬כאשר ‪ x ∈ Vk‬ומוסיפים את‬
‫כל הצלעות מהצורה ‪ vy‬כאשר ‪.y ∈ V − Vk‬‬
‫כל פעולה כזו ניתן לבצע ע"י ‪ Heapify‬ולכן עלותה )‪ O(log n‬השוואות‪.‬‬
‫מאחר שבצענו ‪ degvk+1‬השמטות ‪ /‬הוספות במעבר מ־ ‪ Hk‬ל־ ‪ ,Hk+1‬הרי סיבוכיות הכוללת‬
‫היא‪:‬‬
‫‪X‬‬
‫· ‪O(log V‬‬
‫)| ‪degv) = O(|E| log |V‬‬
‫‪v∈V‬‬
‫‪23‬‬
‫חיפוש רוחב )‪(BFS‬‬
‫נתון‪ :‬גרף מכוון )‪ G = (V, E‬על ‪ |V | = n‬קדקדים‪ ,‬וקודקוד קבוע ‪.u ∈ V‬‬
‫מטרה‪ :‬לסרוק את כל קודקודי ‪ V‬החל מ־ ‪.u‬‬
‫אלגוריתם חיפוש רוחב מייצר סידור של הקודקודים ‪ u = v1 , . . . , vn‬באופן הבא‪ :‬בכל שלב‬
‫באלגוריתם יש שתי סדרות של קודקודים ‪.S, R‬‬
‫‪ = S‬סדרת קודקודים שכבר טופלו‪ = R .‬סדרת קודקודים שעדיין בטיפול‪.‬‬
‫נסמן ב־ )‪ Γ(v‬את שכני הקדקד ‪.v‬‬
‫אתחול‪.S = ∅ , R ← (u) :‬‬
‫איטרציה‪ :‬יהא ‪ v‬הקודקוד השמאלי ב־ ‪ .R‬אם קיים )‪ x ∈ Γ(v) − (S ∪ R‬הוסף את ‪ x‬ל־‬
‫‪ R‬מימין‪ .‬אם ‪ ,Γ(v) ⊂ S ∪ R‬השמט את ‪ v‬מ־ ‪ R‬והוסף אותו מימין ל־ ‪ .S‬כאשר ∅ = ‪R‬‬
‫סיים וסמן ) ‪.S = (u = v1 , v2 , . . . , vn‬‬
‫אלגוריתם ‪ BFS‬מאפשר חישוב פונקציות שונות על ‪.G‬‬
‫דוגמא‪ :‬חישוב המרחק המינימלי )‪ d(u, x‬מקדקד קבוע ‪ u‬לקדקד כלשהוא ‪: x ∈ V‬‬
‫נגדיר פונקציות‪ π : V → V ∪ {∅} , d∗ : V → R :‬ע"י‬
‫אתחול‪ , π(x) = ∅ ,d∗ (x) ≡ 0 :‬לכל ‪. R ← (u = v1 ) ,S = ∅ .x ∈ V‬‬
‫איטרציה‪ :‬יהא ‪ v‬הקודקוד השמאלי ב־ ‪ R‬ויהא )‪ .x ∈ Γ(v) − (S ∪ R‬נוסיף את ‪ x‬ל־ ‪R‬‬
‫מימין‪ ,‬נגדיר ‪.π(x) = v ,d∗ (x) = d∗ (x) + 1‬‬
‫טענה‪ :‬לכל ‪ x ∈ V‬מתקיים )‪ d∗ (x) = d(u, x‬וגם ‪ . . . → π 2 (x) → π(x) → x‬הוא מסלול‬
‫באורך מינימלי מ־ ‪ u‬ל־ ‪.x‬‬
‫הטענה תנבע מהעובדות הבאות‪:‬‬
‫)‪0 = d∗ (v1 ) ≤ d∗ (v2 ) ≤ . . . ≤ d∗ (vn ) (I‬‬
‫הוכחה‪ :‬נראה כי ) ‪ d∗ (vj ) ≤ d∗ (vj+1‬באינדוקציה על ‪.j‬‬
‫המקרה ‪ j = 1‬ברור‪ .‬יהא ‪ .1 < j ≤ n − 1‬נניח כי ‪ vj‬התגלה כשכן של ‪ vi‬וכי‬
‫‪0‬‬
‫‪0‬‬
‫כשכן של ‪ .vi0‬אזי ‪ ,i ≤ i‬כי אם ‪ i < i‬אזי ‪ vj+1‬היה מופיע לפני ‪.vj‬‬
‫לכן לפי הנחת האינדוקציה ) ‪ d∗ (vi ) ≤ d∗ (vi0‬ולכן‬
‫‪ vj+1‬התגלה‬
‫‪d∗ (vj ) = d∗ (vi ) + 1 ≤ d∗ (vi0 ) + 1 = d∗ (vj+1 ).‬‬
‫‬
‫)‪d∗ (vj ) ≥ d(u, vj ) (II‬‬
‫‪∀1 ≤ j ≤ n‬‬
‫הוכחה‪ :‬אינדוקציה על ‪ .j‬המקרה ‪ j = 1‬ברור‪ .‬יהא ‪ 1 < j ≤ n‬ונניח כי ‪ vj‬התגלה כשכן‬
‫של ‪ .vi‬אזי‬
‫) ‪d(u, vj ) ≤ d(u, vi ) + 1 ≤ d∗ (vi ) + 1 = d∗ (vj‬‬
‫‬
‫הוכחת הטענה‪ :‬לפי )‪ (II‬די להראות כי )‪ .d∗ (v) ≤ d(u, v‬נוכיח זאת באינדוקציה על‬
‫` = )‪ .d(u, v‬המקרה ‪ ` = 0‬ברור‪ .‬נניח עתה כי ‪ ` ≥ 1‬ויהא ‪ v = vj‬כך ש־ ` = ) ‪.d(u, vj‬‬
‫יהא ‪ P‬מסלול קצר ביותר מ־ ‪ u‬ל־ ‪ vj‬ויהא ‪ vk‬הקודקוד הקודם ל־ ‪ vj‬במסלול‪ .‬נניח כי ‪vj‬‬
‫התגלה כשכן של ‪ .vi‬אזי ‪ ,i ≤ k‬אחרת ‪ vj‬היה מתגלה כשכן של ‪ .vk‬לכן ) ‪d∗ (vi ) ≤ d∗ (vk‬‬
‫ולכן‬
‫‪d∗ (vj ) = d∗ (vi ) + 1 ≤ d∗ (vk ) + 1 = d(u, vk ) + 1 = d(u, vj ),‬‬
‫‪24‬‬
‫כאשר ‪ d∗ (vk ) + 1 = d(u, vk ) + 1‬נובע מהנחת האינדוקציה‪ .‬‬
‫דוגמא‪:‬‬
‫‪a‬‬
‫‪d‬‬
‫‪e‬‬
‫=‪G‬‬
‫‪u‬‬
‫‪c‬‬
‫‪b‬‬
‫בכל שלב באלגוריתם נסמן ))‪ (d∗ (v), π(v‬מתחת לקודקוד ‪ v‬שהתגלה‪.‬‬
‫‪e‬‬
‫‪d‬‬
‫‪c‬‬
‫‪b‬‬
‫)‪(1, u‬‬
‫‪00‬‬
‫)‪(1, u‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫)‪(2, a‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫‪00‬‬
‫)‪(2, a‬‬
‫)‪(2, a‬‬
‫)‪(1, u‬‬
‫)‪(1, u‬‬
‫)∅ ‪(0,‬‬
‫)‪(2, a‬‬
‫)‪(3, c‬‬
‫)‪(3, c‬‬
‫‪a‬‬
‫‪u‬‬
‫)∅ ‪(0,‬‬
‫‪S‬‬
‫‪R‬‬
‫∅‬
‫‪u‬‬
‫∅‬
‫‪ua‬‬
‫∅‬
‫‪uab‬‬
‫‪u‬‬
‫‪ab‬‬
‫‪u‬‬
‫‪abc‬‬
‫‪u‬‬
‫‪abcd‬‬
‫‪ua‬‬
‫‪bcd‬‬
‫‪uab‬‬
‫‪cd‬‬
‫‪uab‬‬
‫‪cde‬‬
‫‪uabcde‬‬
‫∅‬
‫סיבוכיות ‪BFS‬‬
‫כל קודקוד בודק את כל שכניו ולכן הסיבוכיות היא‬
‫‪X‬‬
‫(‪O(|V |) + O‬‬
‫‪deg v) = O(|V | + |E|).‬‬
‫‪vinV‬‬
‫שימושים נוספים של ‪:BFS‬‬
‫בדיקת דו־צדדיות‪.‬‬
‫אלגוריתם ‪ Dijkstra‬למרחק המינימלי בגרף ממושקל‬
‫יהא )‪ G = (V, E‬גרף מכוון עם פונקציית משקל ‪ w : E → R+‬על הצלעות‪ .‬אם הצלע ‪ux‬‬
‫אינה בגרף מגדירים ∞ = )‪ .w(u, x‬הפונקציה ‪ w‬מגדירה מטריקה הנתונה ע"י‪:‬‬
‫‪X‬‬
‫{‪d(u, v) = min‬‬
‫‪ P }.‬מסלול מכוון ב־‪ G‬מ־‪ u‬ל־‪: v‬‬
‫‪e∈P‬‬
‫בהינתן ‪ u ∈ V‬ברצוננו לחשב את )‪ d(u, v‬לכל ‪ .v ∈ V‬אלגוריתם ‪ Dijkstra‬הפותר בעייה‬
‫זו מבוסס על הרעיון הבא‪ :‬מגדירים סדרה עולה של קבוצות‬
‫‪ {u} = S1 ⊂ . . . ⊂ Sn = V‬וסדרת ‪ d1 ≥ . . . ≥ dn‬של פונקציות על ‪ V‬כך שלכל‬
‫‪ 1 ≤ k ≤ n‬ולכל ‪ x ∈ Sk‬מתקיים )‪.dk (x) = d(u, x‬‬
‫אלגוריתם ‪Dijkstra‬‬
‫‪25‬‬
‫ ו־‬d1 (x) = w(u, x) ,S1 = {v1 = u} ‫ נגדיר‬k = 1 ‫ ל־‬:‫אתחול‬
u x=
6 u
π1 (x) =
∅ x=u
vk+1 ∈ πk : V → V ∪ {∅} ‫ ו־‬,dk : V → R+ ,Sk = {v1 , . . . , vk } ‫ בהינתן‬:‫איטרציה‬
:‫ כך ש‬V − Sk
dk (vk+1 ) = min{dk (x) : x ∈ V − Sk }
,Sk+1 = Sk ∪ {vk+1 } ‫נגדיר‬
dk+1 (x) =
dk (x)
min{dk (x), dk (vk+1 ) + w(vk+1 , x)}
x ∈ Sk+1
x∈
/ Sk

x ∈ Sk+1
 πk (x)
πk (x)
dk (x) ≤ dk (vk+1 ) + w(vk+1 , x),
πk+1 (x) =

vk+1 (x) dk (x) > dk (vk+1 ) + w(vk+1 , x),
x∈
/ Sk+1
x∈
/ Sk+1
‫ שכל קודקודיהם למעט האחרון‬x ‫ ל־‬u ‫ את אוסף המסלולים המכוונים מ־‬Pk (x) ‫נסמן ב־‬
‫ בגרף נסמן‬P ‫ עבור מסלול כלשהו‬.Sk ‫ נמצאים ב־‬P
‫ ־‬x ‫־ דהיינו‬
.w(P ) = e∈P w(e)
Dijkstra ‫משפט‬
‫ מתקיים‬1 ≤ k ≤ n ‫לכל‬
dk (x) = d(u, x) :x ∈ Sk ‫( לכל‬i)
dk (x) = min{w(P ) : P ∈ Pk (x)} :x ∈ V ‫( לכל‬ii)
.k + 1 ‫ ונוכיח ל־‬1 ≤ k < n ‫ נניח ל־‬.‫ ברור‬k = 1 ‫ המקרה‬.k ‫ אינדוקציה על‬:‫הוכחה‬
‫ אזי‬x ∈ Sk ‫ אם‬.x ∈ Sk+1 ‫( יהא‬i)
dk+1 (x) = dk (x) = d(u, x)
‫ אזי‬x = vk+1 ‫אם‬
dk+1 (vk+1 ) = dk (vk+1 ) = min{w(P ) : P ∈ Pk (x)} ≥ d(u, vk+1 )
‫ הקודקוד‬y ‫ יהא‬.d(u, vk+1 ) = w(P ) ‫ כך ש־‬vk+1 ‫ ל־‬u ‫ מסלול מכוון מ־‬P ‫ יהא‬,‫מאידך‬
.(y = vk+1 ‫ )ייתכן כי‬Sk ‫ שאינו ב־‬P ‫הראשון ב־‬
P0
y
u
0
‫ אזי‬.y ‫ ל־‬u ‫ קטע המסלול מ־‬P ‫יהא‬
0
d(u, vk+1 ) = w(P ) ≥ w(P ) ≥ min{w(Q) : Q ∈ Pk (y)}
= dk (y) ≥ dk (vk+1 )
vk+1
.d(u, vk+1 ) = dk (vk+1 ) = dk+1 (vk+1 ) ‫לכן‬
26
‫ אזי‬x ∈ Sk+1 ‫ אם‬.x ∈ V ‫( יהא‬ii)
(i)
dk+1 (x) = d(u, x) ≤ min{w(P ) : P ∈ Pk+1 (x)}
(I)
(II)
≤ min{w(P ) : P ∈ Pk (x)} = dk (x) = dk+1 (x).
.dk+1 (x) ‫( נובע מהגדרת‬II) ‫( נובע מהנחת האנדוקציה ו־‬I) ‫כאשר שיויון‬
.dk+1 (x) = min{w(P ) : P ∈ Pk+1 (x)} ‫לכן‬
.x ∈ V − Sk+1 ‫נניח‬
dk (x) = min{w(P ) : P ∈ Pk (x)} ≥ min{w(P ) : P ∈ Pk+1 (x)}
dk (vk+1 ) + w(vk+1 , x) = min{w(P ) : P ∈ Pk (vk+1 )} + w(vk+1 , x)
≥ min{w(P ) : P ∈ Pk+1 (x)}
.dk+1 (x) ≥ min{w(P ) : P ∈ Pk+1 (x)} ‫ולכן‬
‫ אזי‬z ∈ Sk ‫ אם‬.x ‫ לפני‬P ‫ הקודקוד האחרון ב־‬z ‫ ויהא‬P ∈ Pk+1 (x) ‫ יהא‬:‫כיוון שני‬
0
0
d(u, z) = dk (z) = min{w(Q : Q ∈ Pk (z)}
0
0
.d(u, z) = w(Q ) ‫ כך ש־‬Q ∈ Pk (z) ‫ולכן קיים‬
0
‫ אזי‬.P = P − {zx} ‫יהא‬
0
Q
P
0
0
w(P ) ≥ w(Q )
x
z
u
0
‫ולכן‬
0
0
w(P ) = w(P ) + w(zx) ≥ w(Q ) + w(zx)
≥ dk (x)
vk+1
0
‫ ולכן‬P = P − {vk+1 x} ∈ Pk (vk+1 ) ‫ אזי‬z = vk+1 ‫אם‬
u
w(P ) ≥ min{w(Q ) : Q ∈ Pk (vk+1 )}
P
‫הנחת האינדוקציה‬
=
dk (vk+1 )
vk+1
0
0
x
0
‫ולכן‬
0
w(P ) = w(P ) + w(vk+1 , x) ≥ dk (vk+1 ) + w(vk+1 , x)
27
‫לכן בכל מקרה‬
‫)‪w(P ) ≥ min{dk (x), dk (vk+1 ) + w(vk+1 , x)} = dk+1 (x‬‬
‫‬
‫מסקנה‪ :‬לכל ‪x ∈ V‬‬
‫)‪dn (x) = d(u, x‬‬
‫ו־ ‪ . . . → πn2 (x) → πn (x) → x‬הוא מסלול מינימלי מ־ ‪ u‬ל־ ‪.x‬‬
‫סיבוכיות אלגוריתם ‪Dijkstra‬‬
‫בכל איטרציה של האלגוריתם מעדכנים את ‪ dk‬ו־ ‪ πk‬ע"י )| ‪ O(|V‬פעולות‪ ,‬ולכן סה"כ‬
‫הסיבוכיות היא ) ‪.O(|V |2‬‬
‫דוגמא‪:‬‬
‫‪1‬‬
‫‪b‬‬
‫‪a‬‬
‫‪10‬‬
‫‪9‬‬
‫‪6‬‬
‫‪3‬‬
‫‪4‬‬
‫‪u‬‬
‫‪2‬‬
‫‪5‬‬
‫‪c‬‬
‫‪d‬‬
‫‪u‬‬
‫‪u‬‬
‫‪u‬‬
‫‪u‬‬
‫‪u‬‬
‫‪c‬‬
‫‪u‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫‪πk‬‬
‫‪b‬‬
‫‪u‬‬
‫‪d‬‬
‫‪c‬‬
‫‪a‬‬
‫‪a‬‬
‫‪a‬‬
‫‪u‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫‪d‬‬
‫‪2‬‬
‫‪d‬‬
‫‪d‬‬
‫‪5‬‬
‫‪5‬‬
‫‪5‬‬
‫‪5‬‬
‫‪5‬‬
‫‪u‬‬
‫∅‬
‫∅‬
‫∅‬
‫∅‬
‫∅‬
‫‪c‬‬
‫∞‬
‫‪7‬‬
‫‪7‬‬
‫‪7‬‬
‫‪7‬‬
‫‪dk‬‬
‫‪b‬‬
‫∞‬
‫‪14‬‬
‫‪13‬‬
‫‪9‬‬
‫‪9‬‬
‫‪a‬‬
‫‪10‬‬
‫‪8‬‬
‫‪8‬‬
‫‪8‬‬
‫‪8‬‬
‫‪u‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫למשל‪ ,‬המסלול המינימלי מ־ ‪ u‬ל־ ‪ b‬הוא‬
‫‪u = π5 (d) → d = π5 (a) → a = π5 (b) → b‬‬
‫אלגוריתם ‪Floyd-Warshall‬‬
‫∈ )‪(i, j‬‬
‫נתון‪ :‬גרף מכוון ממושקל על ]‪ .[n‬משקל הצלע )‪ (i, j‬הוא ‪ .w(i, j) ∈ R‬אם ‪/ E‬‬
‫מגדירים ∞ = )‪ .w(i, j‬כמו כן ‪ w(i, i) = 0‬לכל ‪.i‬‬
‫מטרה‪ :‬לחשב את } ‪ P‬מסלול מכוון מ־‪ i‬ל־‪d(i, j) = inf{w(P ) : j‬‬
‫הערות‪:‬‬
‫• אם לא קיים מסלול מכוון מ־ ‪ i‬ל־ ‪ j‬אזי ∞ = )‪.d(i, j‬‬
‫‪28‬‬
.d(i, j) = −∞ ‫ המכיל מעגל שלילי אזי‬j ‫ ל־‬i ‫• אם קיים מסלול מכוון מ־‬
.‫( באופן הבא‬Dk (i, j))ni,j=1 ‫ מטריצה‬0 ≤ k ≤ n ‫ נגדיר לכל‬:FW ‫אלגוריתם‬
.D0 (i, j) = w(i, j) :‫אתחול‬
‫ נגדיר‬1 ≤ k ≤ n ‫ לכל‬:‫איטרציה‬
Dk (i, j) = min{Dk−1 (i, j), Dk−1 (i, k) + Dk−1 (k, j)}.
‫ נסמן‬:‫ניתוח האלגוריתם‬
Pk (i, j) = {P : P − {i, j} ⊂ {1, . . . , k} ‫ כך ש־‬j‫ ל־‬i‫ מסלול מכוון מ־‬P }
Pek (i, j) = {P ∈ Pk (i, j) : ‫ לא מכיל מעגלים מכוונים‬P }
αk (i, j) = min{w(P ) : P ∈ Pk (i, j)}
α
ek (i, j) = min{w(P ) : P ∈ Pek (i, j)}
1 ≤ k ≤ n ‫ לכל‬:‫טענה‬
αk (i, j) ≤ min{αk−1 (i, j), αk−1 (i, k) + αk−1 (k, j)} (i)
α
ek (i, j) ≥ min{e
αk−1 (i, j), α
ek−1 (i, k) + α
ek−1 (k, j)} (ii)
0
0
‫ ויהיו‬αk−1 (i, j) = w(P ) ‫ כך ש־‬P ∈ Pk−1 (i, j) ‫( יהא‬i) :‫הוכחה‬
00
P ∈ Pk−1 (i, k) P
000
00
∈ Pk−1 (k, j)
‫כך ש־‬
000
w(P ) = αk−1 (i, k) w(P ) = αk−1 (k, j).
0
00
‫ ולכן‬P , P = P ∪ P
000
∈ Pk (i, j) ‫אזי‬
0
αk (i, j) ≤ min{w(P ), w(P )} = min{αk−1 (i, j), αk−1 (i, k) + αk−1 (k, j)}.
‫ אזי‬P ∈ Pek−1 (i, j) ‫ אם‬.w(P ) = α
ek (i, j) ‫ כך ש־‬P ∈ Pek (i, j) ‫( יהא‬ii)
w(P ) ≥ α
ek−1 (i, j)
00
0
0
00
‫ ואזי‬.P ∈ Pek−1 (k, j) ,P ∈ Pek−1 (i, k) ‫ כאשר‬P = P ∪ P ‫אחרת נסמן‬
0
00
α
ek (i, j) = w(P ) = w(P ) + w(P ) ≥ α
ek−1 (i, k) + α
ek−1 (k, j).
‫לכן‬
α
ek (i, j) ≥ min {e
αk−1 (i, j), α
ek−1 (i, k) + α
ek−1 (k, j)}
29
‫‬
‫מסקנה‪ :‬לכל ‪ 0 ≤ k ≤ n‬מתקיים‬
‫‪αk (i, j) ≤ Dk (i, j) ≤ α‬‬
‫‪ek (i, j).‬‬
‫מסקנה‪:‬‬
‫‪Dk (i, j) = αk (i, j) = α‬‬
‫)‪ (i‬אם אין מסלול מ־ ‪ i‬ל־ ‪ j‬הכולל מעגל שלילי אזי )‪ek (i, j‬‬
‫לכל ‪ 1 ≤ k ≤ n‬ובפרט‬
‫)‪d(i, j) = Dn (i, j‬‬
‫)‪ (ii‬יש מסלול מ־ ‪ i‬ל־ ‪ j‬הכולל מעגל שלילי ⇔ קיים ‪ 1 ≤ k ≤ n‬כך ש־ ‪Dn (k, k) < 0‬‬
‫וכך ש־‬
‫‪Dn (i, k) + Dn (k, j) < ∞.‬‬
‫הוכחה‪:‬‬
‫)‪ (i‬אם אין מסלול הכולל מעגל שלילי מ־ ‪ i‬ל־ ‪ j‬אזי המסלול המינימלי מ־ ‪ i‬ל־ ‪ j‬הוא‬
‫‪ αn (i, j) = α‬ולכן )‪ Dn (i, j‬שווה לשניהם‪.‬‬
‫פשוט ולכן )‪en (i, j‬‬
‫)‪ (ii‬נניח שיש מסלול ‪ P‬מ־ ‪ i‬ל־ ‪ j‬הכולל מעגל שלילי‪ .‬אזי ‪ P‬מכיל מעגל שלילי פשוט ‪.C‬‬
‫‪ .Dn (k, k) ≤ α‬כמו כן ברור שיש מסלולים‬
‫יהא ‪ k‬קודקוד ב־ ‪ .C‬אזי ‪en (k, k) < 0‬‬
‫פשוטים מ־ ‪ i‬ל־ ‪ k‬ומ־ ‪ k‬ל־ ‪ j‬ולכן ∞ < )‪.Dn (k, j), Dn (i, k‬‬
‫להיפך נניח כי ‪ Dn (k, k) < 0‬ו־ ∞ < )‪ .Dn (i, k) + Dn (k, j‬אזי יש מסלולים‬
‫‪000‬‬
‫‪00‬‬
‫‪00‬‬
‫‪0‬‬
‫מכוונים )‪ P ∈ Pn (k, k) ,P ∈ Pn (i, k‬עבורן ‪ ,w(P ) < 0‬ו־ )‪.P ∈ Pn (k, j‬‬
‫‪0‬‬
‫‪00‬‬
‫‪000‬‬
‫לכן ‪ P = P ∪ P ∪ P‬הוא המסלול הדרוש‪ .‬‬
‫סיבוכיות‪ O(|V |3 ) :‬כי בכל אחד מ־ ‪ n‬השלבים מעדכנים מטריצה ‪.n × n‬‬
‫חישוב המסלול הקצר ביותר‬
‫נגדיר‬
‫‬
‫∞ = )‪ w(i, j‬או ‪∅ i = j‬‬
‫= )‪π0 (i, j‬‬
‫אחרת ‪i‬‬
‫‬
‫)‪πk−1 (i, j) Dk (i, j) = Dk−1 (i, j‬‬
‫= )‪πk (i, j‬‬
‫)‪πk−1 (k, j) Dk (i, j) = Dk−1 (i, k) + Dk−1 (k, j‬‬
‫המסלול הקצר ביותר מ־ ‪ i‬ל־ ‪ j‬נתון ע"י‬
‫‪i → · · · → πn (i, πn (i, j)) → πn (i, j) → j‬‬
‫דוגמא‪:‬‬
‫‪30‬‬
a
−2
4
5
b
4
3
c
a
0
−2
∞
b
4
0
3
c
5
4
0
0
D1 = −2
∞
4
0
3
0
D2 = −2
1
4
0
3
D0 =
a
b
c
a
∅
b
∅
b
a
∅
c
c
a
b
∅
5
3
0
∅
π1 = b
∅
a
∅
c
a
a
∅
5
3
0
∅
π2 = b
b
a
∅
c
a
a
∅
π0 =
D3 = D2
a
b
c
π3 = π2
:c ‫ ל־‬b ‫מסלול מינימלי מ־‬
b = π3 (b, a) → a = π3 (b, c) → c.
31
‫חפוש עומק ‪(Depth First Search) DFS‬‬
‫קלט‪ G = (V, E) :‬גרף מכוון‪.‬‬
‫פלט‪ :‬יער מכוון פורש ‪ T‬של ‪.G‬‬
‫משתני האלגוריתם‪t :‬־ זמן בדיד ‪t = 1, 2, . . .‬‬
‫}‪ = color(v) ∈ {W, B, G‬צבע הקדקד ‪ v‬בזמן נתון‪ ,‬כאשר‪:‬‬
‫‪‬‬
‫‪ v‬טרם התגלה‬
‫‪ W‬‬
‫‪G‬‬
‫‪ v‬בטיפול‬
‫= )‪color(v‬‬
‫‪‬‬
‫הסתיים הטיפול ב ‪B v −‬‬
‫)‪ = d(v‬זמן הגלוי של ‪.v‬‬
‫)‪ = f (v‬זמן הסגירה של ‪.v‬‬
‫)‪ = π(v‬אב של ‪ v‬ביער ה־‪ T DFS‬של ‪.G‬‬
‫נסמן }‪.Γ+ (u) = {v : uv ∈ E‬‬
‫)‪DFS(G‬‬
‫‪t=0‬‬
‫‪∀u ∈ V π(u) = ∅ , color(u) = W‬‬
‫‪∀u ∈ V such that color(u) = W do DFS-visit(u).‬‬
‫)‪DFS-visit(u‬‬
‫‪color(u) ← G‬‬
‫‪t←t+1‬‬
‫‪d(u) ← t‬‬
‫) )‪∀v ∈ Γ+ (u): If color(v) = W then (π(v) ← u , DFS-visit(v‬‬
‫‪color(u) ← B‬‬
‫‪t←t+1‬‬
‫‪f (u) ← t‬‬
‫‪T‬‬
‫‪ u‬אם יש מסלול מכוון ב־‪ G‬מ־‪ u‬ל־‪ .v‬נסמן‬
‫נסמן ‪ u → v‬אם ‪ (u, v) ∈ E‬ו־ ‪v‬‬
‫יש מסלול מכוון מ־‪ u‬ל־‪ v‬ביער ה־‪.T DFS‬‬
‫מתיאור האלגוריתם נובע שהאנטרוולים ])‪ [d(u), f (u‬מקיימים‬
‫תכונת הסוגריים‪ :‬אם ‪ u 6= v‬אזי האנטרוולים ])‪ [d(v), f (v)] [d(u), f (u‬הינם זרים או‬
‫שאחד מוכל באחר‪.‬‬
‫‪v‬‬
‫‪T‬‬
‫‪d(u) < d(v) < f (v) < f (u) ⇔ u‬‬
‫טענה‪ :‬אם ‪ u → v‬אזי )‪.d(v) < f (u‬‬
‫הוכחה‪ :‬אם ‪ v‬טרם התגלה הרי שאי אפשר לסגור את ‪.u‬‬
‫הערה‪ .d(w) < f (u) 6⇐ u → v → w :‬למשל‪,‬‬
‫‪32‬‬
‫אם‬
‫‪4/5 u‬‬
‫‪v‬‬
‫‪2/9‬‬
‫‪1/10‬‬
‫‪3/6‬‬
‫‪7/8 w‬‬
‫למת המסלול הלבן‪ :‬אם ‪u1 → u2 → · · · um‬‬
‫אזי ‪um‬‬
‫‪T‬‬
‫ו־) ‪d(u1 ) < d(u2 ), . . . , d(um‬‬
‫‪.u1‬‬
‫צלום הצבעים בזמן ) ‪:d(u1‬‬
‫‪um−1‬‬
‫‪um‬‬
‫‪u3‬‬
‫‪u1‬‬
‫‪u2‬‬
‫הוכחה‪ :‬אנדוקציה על ‪ .m‬אם ‪ m = 2‬אזי‬
‫) ‪f (u1‬‬
‫הנחה‬
‫טענה‬
‫↓‬
‫↓‬
‫) ‪d(u1‬‬
‫<‬
‫) ‪d(u2‬‬
‫<‬
‫ולכן לפי תכונת הסוגריים ) ‪ d(u1 ) < d(u2 ) < f (u2 ) < f (u1‬ו־ ‪u2‬‬
‫יהא עתה ‪ .m > 2‬אזי‬
‫) ‪f (u1‬‬
‫הנחת‬
‫האנדוקציה‬
‫↓‬
‫) ‪f (um−1‬‬
‫<‬
‫‪T‬‬
‫‪.u1‬‬
‫הנחה‬
‫טענה‬
‫↓‬
‫↓‬
‫) ‪d(u1‬‬
‫<‬
‫) ‪d(um‬‬
‫<‬
‫לכן לפי תכונת הסוגריים ) ‪ d(u1 ) < d(um ) < f (um ) < f (u1‬ולכן ‪um‬‬
‫למת המסלול השחור‪ :‬אם ‪u1 → u2 → · · · → um‬‬
‫‪T‬‬
‫‪.um‬‬
‫ו־) ‪ f (u1 ), . . . , f (um−1 ) < f (um‬אזי ‪u1‬‬
‫צלום הצבעים בזמן ‪:f (um ) − 1‬‬
‫‪um‬‬
‫‪um−1‬‬
‫‪u2‬‬
‫‪33‬‬
‫‪u1‬‬
‫‪T‬‬
‫‪.u1‬‬
‫הוכחה‪ :‬אם ) ‪ d(um ) < d(u1‬אזי לפי תכונת הסוגריים‬
‫‪T‬‬
‫) ‪ d(um ) < d(u1 ) < f (u1 ) < f (um‬ואזי ‪u1‬‬
‫נניח בשלילה כי ) ‪ d(u1 ) < d(um‬ויהא‬
‫}) ‪ m − 1 ≥ i = max{j : d(uj ) ≤ d(u1‬אזי‬
‫‪.um‬‬
‫) ‪d(ui ) ≤ d(u1 ) < d(ui+1 ), . . . , d(um‬‬
‫ולכן‪ ,‬לפי למת המסלול הלבן ‪um‬‬
‫‪T‬‬
‫‪ ui‬ולכן ) ‪ ,f (um ) < f (ui‬סתירה להנחה‪.‬‬
‫‬
‫דוגמא להרצת ‪DFS‬‬
‫‪1/14‬‬
‫‪2/13‬‬
‫‪8/11‬‬
‫‪9/10‬‬
‫‪15/22‬‬
‫‪3/12‬‬
‫‪4/5‬‬
‫‪6/7‬‬
‫‪16/19‬‬
‫‪17/18‬‬
‫‪23/24‬‬
‫‪20/21‬‬
‫מיון טופולוגי‬
‫יהא )‪ G = (V, E‬גרף מכוון‪ .‬מיון טופולוגי של ‪ G‬הוא העתקה חח"ע ‪ ϕ : V → N‬כך ש־‬
‫‪ϕ(u) < ϕ(v) ⇐ u → v‬‬
‫טענה‪ :‬קיים מיון טופולוגי ל־‪ G‬אם"ם ‪ G‬חסר מעגלים מכוונים‪.‬‬
‫הוכחה‪ :‬אם ‪ u1 → · · · → um → u1‬מעגל ב־‪ G‬ו־‪ ϕ : V → N‬מיון טופולוגי אזי‬
‫) ‪ ϕ(u1 ) < · · · < ϕ(um ) < ϕ(u1‬סתירה‪.‬‬
‫להיפך‪ ,‬אם ‪ G‬חסר מעגלים מכוונים אזי יש קדקד ‪ u‬כך ש־‬
‫∅ = )‪.{v : (v, u) ∈ E} = Γ+ (u‬‬
‫יהא ‪ G‬הגרף המתקבל מ־‪ G‬ע"י השמטת ‪.u‬‬
‫לפי הנחת האנדוקציה יש ‪ ϕ0 : V 0 = V \ {u} → N‬כך ש ‪ ϕ0‬מיון טופולוגי של ‪.G0‬‬
‫נגדיר‬
‫‬
‫‪1‬‬
‫‪v=u‬‬
‫= )‪ϕ(v‬‬
‫‪ϕ0 (v) + 1 v ∈ V 0‬‬
‫‪34‬‬
‫אזי ‪ ϕ‬מיון טופולוגי של ‪.G‬‬
‫טענה‪ :‬אם ‪ G‬אציקלי אזי )‪ ϕ(u) = −f (u‬מיון טופולוגי של ‪.G‬‬
‫‪T‬‬
‫הוכחה‪ :‬נניח ‪ .u → v‬אם )‪ f (u) < f (v‬אזי )‪ d(v) < f (u) < f (v‬לפי הטענה ולכן ‪u‬‬
‫ולכן ‪ G‬מכיל מעגל מכוון‪ ,‬בסתירה להנחה‪.‬‬
‫‬
‫לכן )‪ f (u) > f (v‬ולכן )‪.ϕ(u) < ϕ(v‬‬
‫‪v‬‬
‫קשירות חזקה‬
‫‪.v‬‬
‫‪ u‬ו־‪u‬‬
‫יהא )‪ G = (V, E‬גרף מכוון‪ .‬נגדיר ‪ u ∼ v‬אם ‪v‬‬
‫∼ הוא יחס שקילות‪ .‬מחלקות השקילות של יחס זה נקראות רכיבי קשירות חזקה‪.‬‬
‫טענה‪ :‬נפעיל ‪ DFS‬על ‪ G‬ונקבל את סדרת זמני הסגירה של הקדקדים ‪.(f (u))u∈V‬‬
‫יהא ‪ Gt‬הגרף המתקבל מ־‪ G‬ע"י הפוך כוון הצלעות‪.‬‬
‫‪t‬‬
‫נפעיל ‪ DFS‬על ‪ Gt‬כאשר הקדקדים הנבחרים ב־) ‪ DFS(G‬נלקחים לפי סדר יורד של‬
‫‪.(f (u))u∈V‬‬
‫אזי רכיבי היער ‪ Gt‬מתלכדים עם רכיבי הקשירות החזקה של ‪.G‬‬
‫הוכחה‪ :‬יהיו ))‪ (d(u), f (u‬זמני הפתיחה והסגירה של הקדקד ‪ u ∈ V‬בהרצה הראשונה של‬
‫ה־‪ ,DFS‬ויהא ‪ T1‬יער ב־‪ DFS‬המתקבל‪.‬‬
‫יהא ‪ T2‬יער ה־‪ DFS‬המתקבל לאחר הרצת ‪ DFS‬על ‪ Gt‬בסדר יורד של )‪ .f (u‬יהיו‬
‫‪ V1 , . . . , Vm‬רכיבי הקשירות של ‪ T2‬עם שורשים ‪ v1 , . . . , vm‬לפי סדר קבלתם‪.‬‬
‫עלינו להראות כי ‪ V1 , . . . , Vm‬הם רכיבי הקשירות החזקה של ‪ .G‬ראשית נראה כי ‪ Vi‬קשיר‬
‫חזק‪ .‬די להראות כי לכל ‪ v ∈ Vi‬יש מסלולים מכוונים מ־‪ v‬ל־ ‪ vi‬ומ־ ‪ vi‬ל־‪ v‬ב־‪.G‬‬
‫‪T‬‬
‫‪ v‬ב־‪.G‬‬
‫עתה‪ v ∈ Vi ,‬גורר כי ‪ vi 2 v‬ב־ ‪ Gt‬ולכן ‪vi‬‬
‫‪ .v‬לפי בחירת סדר הקדקדים ב־‪ DFS‬השני‪ f (vi ) > f (u) ,‬לכל‬
‫נעיין במסלול הנ"ל ‪vi‬‬
‫‪ .v‬לכן מלמת המסלול‬
‫‪ u ∈ Vi‬ובפרט לכל הקדקדים ‪ u 6= vi‬הנמצאים במסלול ‪vi‬‬
‫‪T‬‬
‫‪ vi‬ב־‪ .G‬לכן ‪ Vi‬קשיר חזק‪.‬‬
‫השחור נובע כי ‪ vi 1 v‬ובפרט ‪v‬‬
‫עתה נשים לב כי אם ‪ i < j‬אזי אין צלע ב־ ‪ Gt‬מ־ ‪ vi‬ל־ ‪ ,vj‬ולכן ב־‪ G‬אין צלע מ־ ‪ Vj‬ל־ ‪.Vi‬‬
‫מכאן נובע כי ה־ ‪Vi‬־ים הם רכיבי הקשירות החזקה של ‪.G‬‬
‫‪vm‬‬
‫‪uj‬‬
‫‪vi‬‬
‫···‬
‫‪Vm‬‬
‫‪v1‬‬
‫···‬
‫‪Vj‬‬
‫‪Vi‬‬
‫‪35‬‬
‫‪TL‬‬
‫‪V1‬‬
‫דוגמא‪:‬‬
‫‪2/5‬‬
‫‪1/10‬‬
‫‪11/16‬‬
‫‪12/15‬‬
‫‪3/4‬‬
‫‪6/9‬‬
‫‪8/9‬‬
‫‪13/14‬‬
‫‪7/8‬‬
‫‪7/10‬‬
‫‪1/6‬‬
‫‪3/4‬‬
‫‪15/16‬‬
‫‪12/13‬‬
‫‪11/14‬‬
‫‪2/5‬‬
‫זרימה ברשתות‬
‫רשת זרימה היא גרף מכוון )‪ G = (V, E‬עם זוג קדקדים מיוחדים שונים‪:‬‬
‫‪ s‬הנקרא מקור )‪ (source‬ו־‪ t‬הנקרא בור )‪ ,(sink‬ופונקציה אי שלילית ‪.c : E → R+‬‬
‫)‪ c(e‬נקרא הקבול )‪ (capacity‬של הצלע ‪.e‬‬
‫לקדקד ‪ u ∈ V‬נסמן }‪ .T + (u) = {v : uv ∈ E} ,T − (u) = {w : wu ∈ E‬לפונקציה‬
‫‪ f : E → R‬ולקדקד ‪ u ∈ V‬נסמן‬
‫‪X‬‬
‫‪X‬‬
‫= )‪f + (u‬‬
‫= )‪f (uv) , f − (u‬‬
‫)‪f (wu‬‬
‫)‪w∈T − (u‬‬
‫)‪v∈T + (u‬‬
‫‪ f : E → R+‬תקרא זרימה )‪ (flow‬ברשת אם )‪ 0 ≤ f (e) ≤ c(e‬לכל ‪ ,e ∈ E‬ולכל‬
‫}‪.f + (u) = f − (u) u ∈ V \ {s, t‬‬
‫‪+‬‬
‫ערך הזרימה ‪ f‬מוגדר ע"י )‪.val(f ) = f (s) − f − (s‬‬
‫דוגמא‪ G :‬מתאר מערכת כבישים חד־סטריים מ־‪ s‬ל־‪.t‬‬
‫קבול כל צלע‪ ,‬דהיינו קטע כביש‪ ,‬הינו מספר הרכבים לשעה שקטע זה יכול לשאת )זו פונקציה‬
‫של רוחב קטע הכביש‪ ,‬איכותו וכול'(‪ .‬המטרה היא למצוא את מקסימום המכוניות לשעה‬
‫שאפשר להעביר מ־ ‪ s‬ל־ ‪.t‬‬
‫לקבוצת קדקדים לאו דווקא זרות ‪ A, B ⊂ V‬נגדיר‬
‫‪X‬‬
‫= )‪f (A, B‬‬
‫)‪f (ab‬‬
‫‪(a,b)∈A×B∩E‬‬
‫‪36‬‬
‫לקבוצת קדקדים ‪ S ⊂ V‬נסמן ‪ .S¯ = V \ S‬חתך ‪ s − t‬היא חלוקה ¯‬
‫)‪ (S, S‬כך ש ‪,s ∈ S‬‬
‫¯‪.t ∈ S‬‬
‫טענה‪ :‬לכל זרימה ‪ f‬ולכל חתך ‪¯ s − t‬‬
‫)‪ (S, S‬מתקיים‬
‫‪¯ − f (S,‬‬
‫)‪¯ S‬‬
‫)‪val(f ) = f (S, S‬‬
‫הוכחה‪:‬‬
‫‬
‫= )‪f + (u) − f − (u) = f (S, V ) − f (V, S‬‬
‫‪X‬‬
‫= )‪val(f ) = f + (s) − f − (s‬‬
‫‪u∈S‬‬
‫‬
‫ ‬
‫‬
‫‪¯ − f (S, S) + f (S,‬‬
‫)‪¯ S) = f (S, S‬‬
‫‪¯ − f (S,‬‬
‫)‪¯ S‬‬
‫)‪= f (S, S) + f (S, S‬‬
‫‬
‫לחתך ‪¯ s − t‬‬
‫)‪ (S, S‬נגדיר את קבול החתך ע"י‬
‫‪X‬‬
‫= ¯‬
‫)‪cap(S, S‬‬
‫)‪c(uv‬‬
‫¯‬
‫‪uv∈S×S∩E‬‬
‫דואליות חלשה‪ :‬לכל זרימת ‪ f‬וחתך ‪¯ s − t‬‬
‫)‪ (S, S‬מתקיים‬
‫¯‬
‫)‪val(f ) ≤ cap(S, S‬‬
‫הוכחה‪:‬‬
‫‪¯ − f (S,‬‬
‫)‪¯ S) ≤ f (S, S‬‬
‫= ¯‬
‫)‪val(f ) = f (S, S‬‬
‫¯‬
‫)‪c(uv) = cap(S, S‬‬
‫‪X‬‬
‫≤ )‪f (uv‬‬
‫¯‬
‫‪uv∈S×S∩E‬‬
‫‪X‬‬
‫=‬
‫¯‬
‫‪uv∈S×S∩E‬‬
‫יהיו ‪.u, v ∈ V‬‬
‫אוסף סדור של צלעות ) ‪ (e1 , . . . , em‬יקרא מסלול ‪) u − v‬לא מכוון( אם קיימת סדרת‬
‫קדקדים שונים ‪ u = v0 , v1 , . . . , vm = v‬כך שלכל ‪1 ≤ i ≤ m‬‬
‫או ‪ ei = vi−1 vi‬או ‪.ei = vi vi−1‬‬
‫אם ‪ ei = vi−1 vi‬נאמר ש־ ‪ ei‬בכוון המסלול‪,‬‬
‫ואם ‪ ei = vi vi−1‬נאמר ש־ ‪ ei‬נגד כוון המסלול‪.‬‬
‫בהנתן מסלול ‪ P‬וזרימה ‪ f‬נגדיר את העודף של ‪ f‬על צלע ‪ ei ∈ P‬ע"י‬
‫‬
‫‪c(ei ) − f (ei ) ei = vi−1 vi‬‬
‫= ) ‪εf,P (ei‬‬
‫) ‪f (ei‬‬
‫‪ei = vi vi−1‬‬
‫העודף של ‪ f‬על ‪ P‬יוגדר כ־ ) ‪εf,P = min εf,P (ei‬‬
‫‪1≤i≤m‬‬
‫טענה‪ :‬אם ‪ P‬מסלול ‪) s − t‬כלומר ‪ (v0 = s ,vm = t‬אזי קיימת זרימה ˜‪ f‬המקיימת‬
‫‪.val(f˜) = val(f ) + εf,P‬‬
‫‪37‬‬
‫הוכחה‪ :‬נגדיר‬
‫‪‬‬
‫‪‬‬
‫‪e 6∈ P‬‬
‫‪e = vi−1 vi‬‬
‫‪e = vi vi−1‬‬
‫)‪f (e‬‬
‫‪f (e) + εf,P‬‬
‫= )‪f˜(e‬‬
‫‪‬‬
‫‪f (e) − εf,P‬‬
‫מתקיים כי )‪.0 ≤ f˜(e) ≤ c(e‬‬
‫כמוכן )‪ f˜+ (u) = f˜− (u‬לכל ‪.u 6= s, t‬‬
‫דוגמא‪ :‬זרימה נוכחית‪:‬‬
‫‪t‬‬
‫‪3/6‬‬
‫‪4/7‬‬
‫‪6/9‬‬
‫‪6/10‬‬
‫‪6/8‬‬
‫‪3‬‬
‫‪3‬‬
‫‪6‬‬
‫‪s‬‬
‫‪4‬‬
‫‪3‬‬
‫)‪εf,P (e‬‬
‫‪εf,P = min εf,P (e) = 3‬‬
‫‪e∈P‬‬
‫זרימה מעודכנת‪:‬‬
‫‪t‬‬
‫‪7/7 9/9‬‬
‫‪0/6 3/8‬‬
‫‪9/10‬‬
‫‪s‬‬
‫התוצאנ הבסיסית בנושא זרימות ברשתות היא האפיון הבא של הזרימה המקסימלית שהוכח‬
‫ע"י ‪.Ford-Fulkenson‬‬
‫משפט הזרימה המקסימלית והחתך המינימלי ‪(MFMC) Max Flow Min Cut‬‬
‫‬
‫‬
‫)‪ (S, S‬חתך )‪¯ : (s, t‬‬
‫¯‬
‫)‪ f } = min cap(S, S‬זרימה ברשת ‪max {val(f ) :‬‬
‫הוכחה‪ :‬הראינו כי ¯‬
‫)‪max val(f ) ≤ min cap(S, S‬‬
‫¯‬
‫)‪(S,S‬‬
‫‪f‬‬
‫לכן‪ ,‬כדי להשלים את ההוכחה יש להראות שקיימת זרימה ‪ f‬וקיים חתך ‪¯ s − t‬‬
‫)‪ (S, S‬כך‬
‫ש־ ¯‬
‫)‪ .val(f ) = Cap(S, S‬תהא ‪ f‬זרימה ברשת עם ערך ) ‪ val(f‬מקסימלי‪ .‬נסמן‬
‫‬
‫‬
‫קיים מסלול ‪u ∈ V : P s − u‬‬
‫=‪S‬‬
‫כך ש־ ‪εf,P > 0‬‬
‫מהטענה נובע כי ‪ ,t 6∈ S¯ ,s ∈ S‬אחרת אפשר היה לקבל זרימה ˜‪ f‬עם ערך גדול יותר‪.‬‬
‫טענה‪:‬‬
‫)‪ (i‬אם ‪ uv ∈ S × S¯ ∩ E‬אזי )‪f (uv) = c(uv‬‬
‫‪38‬‬
‫)‪ (ii‬אם ‪ vu ∈ S¯ × S ∩ E‬אזי ‪f (vu) = 0‬‬
‫הוכחה‪:‬‬
‫)‪ (i‬יהא ‪ P‬מסלול ‪ s − u‬כך ש־ ‪εf,P > 0‬‬
‫נגדיר }‪ P 0 = P ∪ {uv‬אזי ‪ P 0‬מסלול ‪ s − v‬ומתקיים‬
‫})‪εf,P 0 = min{εf,P , c(uv) − f (uv‬‬
‫מאידך ‪ εf,P 0 = 0‬כי ‪ v 6∈ S‬ולכן )‪.c(uv) = f (uv‬‬
‫)‪ (ii‬יהא ‪ P‬מסלול ‪ s − u‬כך ש־ ‪ .εf,P > 0‬נגדיר }‪ P 00 = P ∪ {vu‬אזי ‪ P 00‬מסלול ‪s − v‬‬
‫ומתקיים‬
‫})‪εf,P 00 = min{εf,P , f (vu‬‬
‫מאידך ‪ εf,P 00 = 0‬כי ‪ v 6∈ S‬ולכן ‪f (vu) = 0‬‬
‫‬
‫מהטענה נובע כי‬
‫= )‪f (vu‬‬
‫‪X‬‬
‫‪f (uv) −‬‬
‫¯‬
‫‪vu∈S×S∩E‬‬
‫‪X‬‬
‫‪¯ − f (S,‬‬
‫= )‪¯ S‬‬
‫)‪val(f ) = f (S, S‬‬
‫¯‬
‫‪uv∈S×S∩E‬‬
‫¯‬
‫)‪c(uv) = cap(S, S‬‬
‫‪X‬‬
‫=‬
‫¯‬
‫‪uv∈S×S∩E‬‬
‫‬
‫הוכחת משפט ‪ MCMF‬מראה גם את התוצאה הבאה‪:‬‬
‫משפט‪ :‬אם כל הקבולים ברשת טבעיים אזי יש זרימה מקסימלית שלמה ‪ ,f‬כלומר ‪f (e) ∈ N‬‬
‫לכל ‪.e ∈ E‬‬
‫הוכחה‪ :‬תהא ‪ f‬זרימה מקסימלית בין כל הזרימות השלמות‪.‬‬
‫אם ‪ P‬מסלול ‪ ,s − t‬אזי ‪ εf,P ∈ N‬ולכן בגלל המקסימליות של ) ‪ val(f‬נובע כי ‪εf,P = 0‬‬
‫ולפיכך החתך ¯‬
‫)‪ (S, S‬שהוגדר בהוכחת משפט ‪ MCMF‬מקיים‬
‫¯‬
‫‬
‫)‪ val(f ) = Cap(S.S‬ולכן ‪ f‬זרימה מקסימלית ברשת‪.‬‬
‫אלגוריתם למציאת זרימה מקסימלית ברשת‬
‫נגדיר ‪ .f1 = 0‬נניח שהגדרנו זרימות ‪ .f1 , . . . , fk‬אם קיים מסלול ‪ P s − t‬המקיים‬
‫‪ εfk ,P > 0‬אזי נגדיל את ‪ fk‬לאורך המסלול ‪ P‬לזרימה ‪ fk+1 = f˜k‬כמתואר בטענה‪.‬‬
‫אם אין ‪ P‬כנ"ל אזי ‪ fk‬זרימה מקסימלית‪.‬‬
‫דוגמא‪:‬‬
‫‪39‬‬
s
4/4
0/4
t
1/1
1/6
5/5
2/3
0/1
5/5
3/5
2/3
2/2
εf,P = min{5, 2, 5, 4} = 2
s
4/4
2/4
t
1/1
3/6
0/1
3/5
0/3
3/5
2/3
2/2
40
5/5
‫הערות‪:‬‬
‫‪ .1‬האלגוריתם הנ"ל מתכנס לזרימה מקסימלית )שלמה( אם כל הקבולים שלמים מאחר‬
‫וכל צעד באלגוריתם מגדיל את הזרימה בלפחות אחד‪.‬‬
‫שיקול דומה מראה שהאלגוריתם מתכנס לזרימה מקסימלית אם כל הקבולים רציונליים‪.‬‬
‫אך גם במקרים אלה‪ ,‬מספר האטרציות יכול להיות מעריכי בגודל הקלט‪ ,‬למשל‪ ,‬סדרת‬
‫ההרחבות‬
‫‪2/m 1/m‬‬
‫‪1/1‬‬
‫‪, ...‬‬
‫‪1/m 1/m‬‬
‫‪,‬‬
‫‪1/m 2/m‬‬
‫‪0/m‬‬
‫‪1/m 0/m‬‬
‫‪1/1‬‬
‫‪,‬‬
‫‪1/m 1/m‬‬
‫‪0/m 0/m‬‬
‫‪0/1‬‬
‫‪t,‬‬
‫‪0/m 1/m‬‬
‫‪s‬‬
‫‪0/m 0/m‬‬
‫מגיעה לזרימה מקסימלית אחרי ‪ 2m‬צעדים‪.‬‬
‫מאידך גודל הקלט בביטים הוא )‪.O(log m‬‬
‫‪ .2‬אם הקבולים אינם רציונלים‪ ,‬האלגוריתם הנ"ל אינו בהכרח מתכנס‪.‬‬
‫אלגוריתם יעיל לבעיית הזרימה‬
‫תהא )‪ G = (V, E‬רשת זרימה עם פונקציות קבול ‪,c : E → R+‬‬
‫←‬
‫‪−‬‬
‫ותהא ‪ f‬זרימה על ‪ .G‬לכל צלע ‪ e = uv ∈ E‬נתאים שתי צלעות חדשות ‪) e = vu‬גם אם‬
‫הצלע ‪ vu‬הופיעה אף היא ב־‪.(G‬‬
‫נגדיר גרף מכוון ) ‪ Gf = (V, Ef‬כאשר‬
‫‪−‬‬
‫←{ ∪ })‪Ef = {~e ∈ E : f (e) < c(e‬‬
‫}‪e : e ∈ E , f (e) > 0‬‬
‫מסלול ‪ P s − t‬יקרא ‪f‬־לא רווי אם ‪.εf,P > 0‬‬
‫טענה‪ :‬קיים מסלול ‪f s − t‬־לא רווי ⇔ קיים ב־ ‪ Gf‬מסלול מכוון מ־‪ s‬ל־‪.t‬‬
‫הוכחה‪ :‬יהא ‪ s = v0 , v1 , . . . , vm = t‬מסלול ‪f‬־לא רווי עם צלעות ‪ e1 , . . . , em‬כאשר‬
‫‪ ei = vi−1 vi‬או ‪.ei = vi vi−1‬‬
‫נגדיר עתה צלעות ) ‪ g1 , . . . gm ∈ E(Gf‬ע"י‬
‫‬
‫‪~ei ei = vi−1 vi‬‬
‫= ‪gi‬‬
‫←‬
‫‪e−i ei = vi vi−1‬‬
‫ברור כי הצלעות ‪ g1 , . . . , gm‬הן מסלול מכוון מ־‪ s‬ל־‪ t‬ב־ ‪.Gf‬‬
‫כוון שני דומה‪.‬‬
‫אלגוריתם ‪: Edmonds-Karp‬‬
‫אתחול‪f1 = 0 :‬‬
‫אטרציה‪ :‬בהנתן ‪ fk‬בנה את הגרף המכוון ‪.Gfk‬‬
‫חפש מסלול מכוון מאורך מינימלי בין ‪ s‬ל־‪ t‬ע"י ‪.BFS‬‬
‫‪41‬‬
‫אם אין מסלול כזה‪ ,‬סיים‪ f = fk .‬היא זרימה מקסימלית ברשת‪.‬‬
‫אחרת‪ ,‬יהא ‪ g1 , . . . , gm‬מסלול מינימלי מכוון ב־ ‪ Gfk‬מ־‪ s‬ל־‪.t‬‬
‫‪−‬‬
‫← = ‪.gi‬‬
‫יהיו )‪ e1 , . . . , em ∈ E(G‬כך שלכל ‪ gi = e~i i‬או ‪e i‬‬
‫} ‪ P = {e1 , . . . , em‬הוא מסלול ‪ fk‬לא־רווי‪.‬‬
‫נגדיר זרימה חדשה ‪ fk+1‬על ‪ G‬ע"י‬
‫‪‬‬
‫} ‪e 6∈ {e1 , . . . , em‬‬
‫)‪ fk (e‬‬
‫‪fk (ei ) + εfk ,P‬‬
‫‪gi = e~i‬‬
‫= )‪fk+1 (e‬‬
‫‪‬‬
‫‪−‬‬
‫← = ‪gi‬‬
‫‪ei‬‬
‫‪fk (ei ) − εfk ,P‬‬
‫אנו נראה כי אלגוריתם ‪ EK‬מסתיים אחרי )|‪ O(|V ||E‬אטרציות‪.‬‬
‫לגרף מכוון )‪ H = (V, E‬נגדיר‬
‫‪−‬‬
‫‪d+‬‬
‫‪G (u) = |{v : uv ∈ E}| , dG (u) = |{w : wu ∈ E}| ∀u ∈ V‬‬
‫טענה‪ :‬יהיו ‪ s 6= t‬קדקדים ב־‪ H‬כך ש‪:‬‬
‫‪−‬‬
‫‪d+‬‬
‫‪G (s) − dG (s) = k > 0‬‬
‫‪−‬‬
‫‪ d+‬לכל ‪u 6= s, t‬‬
‫)‪G (u) = dG (u‬‬
‫ו־‬
‫אזי קיימים ב־‪ k H‬מסלולים מכוונים זרים בצלעות מ־‪ s‬ל־‪.t‬‬
‫הוכחה‪ :‬אנדוקציה על ‪ .k‬בלי הגבלת הכלליות ‪ H‬אינו מכיל מעגלים מכוונים‪ ,‬כי השמטת‬
‫מעגל מכוון אינה משנה את תנאי הדרגה במשפט‪.‬‬
‫‪ d+‬הרי שיש צלע‪ .E 3 v0 v1 ,‬מאחר ו־‬
‫נגדיר ‪ ,v0 = s‬מאחר ו־‪G (v0 ) ≥ k > 0‬‬
‫‪ d+ (v1 ) = d− (v1 ) ≥ 1‬הרי שיש צלע ‪ .E 3 v1 v2‬נמשיך באופן זה לבנות מסילה מכוונת‬
‫‪ Pk‬שבהכרח תגיע לקדקד ‪.t‬‬
‫‪0‬‬
‫‪d+‬‬
‫נשמיט את המסילה המכוונת ‪ Pk‬מ־‪ s‬ל־‪ .t‬הגרף החדש ) ‪ G = (V, E − P‬מקיים ‪G0 (s) −‬‬
‫‪−‬‬
‫‪−‬‬
‫‪.∀u 6= s, t d+‬‬
‫‪ dG0 (s) = k − 1‬ו )‪G0 (u) = dG0 (u‬‬
‫לכן לפי הנחת האנדוקציה מכיל ‪ k − 1‬מסלולים מכוונים‪ ,P1 , . . . , Pk−1 ,‬זרים בצלעות מ־‪s‬‬
‫ל־‪.t‬‬
‫המסילות ‪ P1 , . . . , Pk‬מקיימות את הדרוש‪.‬‬
‫‬
‫משפט ‪Edmonds- Karp‬‬
‫יהיו ‪ f1 , f2 , . . .‬הזרימות המתקבלות כך ש־ ‪ fk+1‬מתקבלת מ־ ‪ fk‬ע"י הגדלת הזרימה ‪ fk‬על‬
‫המסלול ‪ Pk‬ב־ ‪ .Gfk‬אזי‬
‫)‪|E(Pk )| ≤ |E(Pk+1 )| (i‬‬
‫‪−‬‬
‫← אזי‬
‫)‪ (ii‬אם ‪ k < l‬ו־ ‪ Pl , Pk‬מכילים צלעות נגדיות ‪e , ~e‬‬
‫|) ‪|E(Pk )| + 2 ≤ |E(Pl‬‬
‫)‪ (iii‬אלגוריתם ‪ Ek‬מסתיים אחרי ≥ )|‪ O(|V ||E‬אטרציות‪.‬‬
‫‪42‬‬
‫הוכחה‪ (i) :‬נגדיר גרף מכוון ‪ (V, E(H)) = H‬ע"י‬
‫[‬
‫‪−‬‬
‫‪−‬‬
‫‪E(H) = E(Pk ) ∪ E(Pk+1 ) −‬‬
‫→{‬
‫←‪e ,‬‬
‫}‪e‬‬
‫→‬
‫‪−‬‬
‫←‬
‫‪−‬‬
‫) ‪{ e , e }⊂E(Pk )∪E(Pk+1‬‬
‫טענה‪E(H) ⊂ E(Gfk ) :‬‬
‫הוכחה‪ :‬ברור כי ) ‪ .E(Pk ) ⊂ E(Gfk‬תהא ) ‪.g ∈ E(Pk+1 ) − E(Gfk‬‬
‫אזי או ש־ ‪ g = ~e‬כאשר ‪ e ∈ E‬ואזי )‪.fk+1 (e) < c(e) , fk (e) = c(e‬‬
‫‪−‬‬
‫← = ‪ g‬כאשר ‪ e ∈ E‬ואזי ‪.fk+1 (e) > 0 , fk (e) = 0‬‬
‫או ש־ ‪e‬‬
‫‪−‬‬
‫← ‪,‬‬
‫במקרה הראשון נובע כי ) ‪e ∈ E(Pk‬‬
‫ובמקרה השני נובע כי ) ‪.~e ∈ E(Pk‬‬
‫‪−‬‬
‫← ‪ ,E(H) 63 e,‬ולכן ‪.E(H) 63 g‬‬
‫בכל מקרה הזוג ‪e‬‬
‫‪−‬‬
‫‪+‬‬
‫‪−‬‬
‫‪ d+‬לכל ‪ u 6= s, t‬ולכן לפי טענה‬
‫הגרף ‪ H‬מקיים ‪ dH (s) − dH (s) = 2‬ו־ )‪H (u) = dH (u‬‬
‫קודמת‪ H ,‬מכיל שני מסלולים זרים בקשתות ‪ Q1 , Q2‬מ־ ‪ s‬ל־‪.t‬‬
‫‪ E(Gfk ) ⊃ Q1 , Q2‬לכן ממינימליות |) ‪ |E(Pk‬נובע כי |) ‪ i = 1, 2 |E(Pk )| ≤ |E(Qi‬ולכן‬
‫|) ‪2|E(Pk )| ≤ |E(Q1 )| + |E(Q2 )| ≤ |E(Pk )| + |E(Pk+1‬‬
‫ולכן |) ‪.|E(Pk )| ≤ |E(Pk+1‬‬
‫‪−‬‬
‫← ‪ e,‬אזי‬
‫)‪ (ii‬נשים לב כי מהוכחת )‪ (i‬נובע כי אם ‪ Pk , Pk+1‬מכילים צלעות נגדיות ‪e‬‬
‫‪2|E(Pk )| ≤ |E(Q1 )| + |E(Q2 )| ≤ |E(Pk )| + |E(Pk+1 )| − 2‬‬
‫ולכן |) ‪ .|E(Pk )| + 2 ≤ |E(Pk+1‬זה מוכיח את המקרה ‪ .l = k + 1‬המקרה הכללי מוכח‬
‫באינדוקציה על ‪.l − k‬‬
‫ובאופן דומה‪ :‬אם קיים ‪ k < i < l‬כך ש־ ‪ Pk , Pi‬מכילים צלעות נגדיות אזי לפי הנחת‬
‫האנדוקציה וסעיף )‪:(i‬‬
‫|) ‪|E(Pk )| + 2 ≤ |E(Pi )| ≤ |E(Pl‬‬
‫אחרת ‪ Pk , Pi‬אינם מכילים צלעות נגדיות ל ‪.k < i < l‬‬
‫נגדיר עתה ))‪ H = (V, E(H‬ע"י‬
‫[‬
‫‪−‬‬
‫‪E(H) = E(Pk ) ∪ E(Pl ) −‬‬
‫← ‪{e,‬‬
‫}‪e‬‬
‫←‬
‫‪−‬‬
‫) ‪{e, e }⊂E(Pk )∪E(Pl‬‬
‫ונמשיך כבסעיף )‪.(i‬‬
‫)‪ (iii‬בהנתן זרימה ‪ f‬ומסלול ‪ s − t‬לא רווי ‪ P‬כך ש‬
‫‪εf,P = max εf,P (e) > 0‬‬
‫‪e∈P‬‬
‫נאמר כי ‪ P 3 e‬היא צואר בקבוק ל־ ‪ f‬אם )‪.εf,P = εf,P (e‬‬
‫נעיין בסדרת הזרימות ‪ f1 , f2 , . . . , fm‬ובסדרת מסלולי ההרחבה ‪.P1 , P2 , . . . , Pm‬‬
‫ברור כי כל ‪ Pk‬מכיל צלע שהיא צואר בקבוק ל־ ‪.fk‬‬
‫‪43‬‬
‫→‬
‫← ‪−‬‬
‫‪−‬‬
‫תהא ‪ ,g ∈ E ∪ E‬ונניח כי ‪ g‬הוא צואר בקבוק במסילות ‪Pi1 , Pi2 , . . . , Pir‬‬
‫‪ ,i1 < · · · < ir‬אזי בהכרח קיימים‬
‫‪i1 < j1 < i2 < j2 < i3 < · · · < ir−1 < jr−1 < ir‬‬
‫כך שהצלע ההפוכה ל־‪ g‬מופיעה ב־ ‪ .1 ≤ l ≤ r − 1 Pjl‬לכן לפי )‪(ii‬‬
‫| ‪|Pil | + 4 ≤ |Pjl | + 2 ≤ |Pil+1‬‬
‫ולכן‬
‫)‪|V | − 1 ≥ |Pir | ≥ |Pi1 | + 4(r − 1‬‬
‫ולכן‬
‫‪|V | − 1‬‬
‫‪+1≥r‬‬
‫‪4‬‬
‫ולכן‬
‫‬
‫‪|V | − 1‬‬
‫)|‪+ 1 · 2|E| = O(|V ||E‬‬
‫‪4‬‬
‫‬
‫≤‪m‬‬
‫‬
‫שמושים של משפט הזרימה המקסימלית והחתך המינימלי‬
‫בעייה‪ :‬נתונות ‪ n‬קבוצות כדורגל ‪ .1, . . . , n‬קבוצות ‪ i, j‬משחקות ביניהן ‪ aij‬משחקים‪ .‬כל‬
‫קבוצה מקבלת נקודה אחת על כל ניצחון ואפס על כל הפסד‪ .‬האם יש מהלך משחקים‬
‫שבסופו כל קבוצה ‪ i‬תצבור ≥ ‪ bi‬נקודות?‬
‫פתרון‪ :‬נגדיר רשת )‪ G = (V, E‬עם‬
‫}‪V = {s} ∪ {ui }ni=1 ∪ {vij }ni6=j=1 ∪ {t‬‬
‫‪E = {sui }ni=1 ∪ {ui vij }i6=j ∪ {vij t}ij‬‬
‫וקבולים‬
‫‪c(sui ) = bi , c(ui vij ) = ∞ , c(vij t) = aij‬‬
‫קבוצה ‪ i‬תצבור ≥ ‪ bi‬נקודות לכל ‪ 1 ≤ i ≤ n‬אם ורק אם‬
‫טענה‪ :‬יש מהלך משחקים שבו ‪P‬‬
‫יש ברשת זרימה ‪ f‬שערכה ‪. aij‬‬
‫‪ij‬‬
‫הוכחה‪ :‬נניח כי יש מהלך משחקים כנ"ל ונגדיר‬
‫) ‪ = f (sui‬מספר נצחונות של קבוצה ‪,i‬‬
‫‪P‬על קבוצה ‪ ,j‬ו־ ‪.f (vij t) = aij‬‬
‫) ‪ = f (ui vij‬מספר נצחונות של קבוצה ‪i‬‬
‫ברור כי ‪ f‬היא זרימה ב־‪ G‬שערכה ‪ . aij‬הכוון ההפוך דומה‪.‬‬
‫‪ij‬‬
‫‪44‬‬
u1
b1
v12
ui
bi
∞
s
aij
uj
bn
vij
un
vn−1,n
K ⊂ [n] ‫ קיים מהלך משחקים כנ"ל אם ורק אם לכל‬:‫מסקנה‬
X
X
aij ≤
bi
(∗)

K
2
ij∈
i∈K


‫ אזי‬j ‫ ניצח את‬i ‫ את מספר המשחקים בהם‬θ(i, j)‫ נסמן ב־‬:‫ הכרחיות‬:‫הוכחה‬
X
X
aij =
[θ(i, j) + θ(j, i)] =

ij∈
K
2



{ij}∈
K
2






 X
X
 X

=
θ(i, j) ≤
bi



i∈K 
i∈K

j∈K
j 6= i
¯ ‫ יהא‬.‫ נניח כי )∗( מתקיים‬:‫מספיקות‬
‫ ברשת‬s, t ‫( חתך‬S, S)
S = {s} ∪ {ui : i ∈ I} ∪ {vrs : {r, s} ∈ P}
[n]
S¯ = {t} ∪ {ui ; [n] − I} ∪ {vrs ; {r, s} ∈
− P}
2
¯ = ∞ ‫ כלשהוא אזי‬j ‫{ עבור‬i, j} 6∈ P ‫ כך ש־‬i ∈ I ‫אם קיים‬
.c(S, S)
[n]
I¯
.P ⊃
−
‫אחרת‬
2
2
‫לכן‬
X
X
X
¯ ≥
Cap(S, S)
bi +
aij ≥
aij

 

ij
i6∈I
[n]   I¯ 

ij∈
−
2
2
‫כי‬
X

ij∈
I¯
2
aij ≤
X
i∈I¯


45
bi
‫‬
‫כיסויים וזווגים בגרפים דו־צדדיים‬
‫יהא )‪ G = (V, E‬גרף פשוט לא מכוון כלשהוא‪.‬‬
‫‪ M ⊂ E‬נקראת זווג )‪ (matching‬אם ∅ = ‪ e1 ∩ e2‬לכל ‪.e1 6= e2 ∈ M‬‬
‫‪ S ⊂ V‬קראת כסוי )‪ (cover‬אם ∅ =‪ S ∩ e 6‬לכל ‪.e ∈ E‬‬
‫נסמן‬
‫}‪ M ⊂ E‬זווג ‪ν(G) = max{|M | :‬‬
‫} ‪ S ⊂ V‬כיסוי ‪τ (G) = min{|S| :‬‬
‫ברור כי )‪ ν(G) ≤ τ (G‬אך לא תמיד יש שיויון‪ .‬למשל‬
‫‪jnk‬‬
‫= ) ‪ν(Kn‬‬
‫‪, τ (Kn ) = n − 1‬‬
‫‪2‬‬
‫משפט ‪ :K¨onig‬אם )‪ G = (V = A ∪ B, E‬דו צדדי אזי‬
‫)‪ν(G) = τ (G‬‬
‫הוכחה‪ :‬נגדיר רשת ) ‪ H = (V 0 , E 0‬על ידי‬
‫}‪V 0 = {s} ∪ V ∪ {t‬‬
‫‪E 0 = {sa}a∈A ∪ E ∪ {bt}b∈B‬‬
‫וקבולים ‪ c(e0 ) ≡ 1‬לכל ‪.e0 ∈ E 0‬‬
‫טענה‪ (i) :‬לכל זרימה שלמה ‪ f‬ב־‪ H‬מתקיים )‪.val(f ) ≤ ν(G‬‬
‫)‪ (S, S‬ב־‪ H‬מתקיים ¯‬
‫)‪ (ii‬לכל חתך ‪¯ s − t‬‬
‫)‪.τ (G) ≤ Cap(S, S‬‬
‫הוכחה‪ (i) :‬אם ‪ f‬זרימה שלמה ב־‪ H‬אזי‬
‫}‪ M = {ab ∈ E : f (ab) = 1‬הוא זווג שגודלו‬
‫= |}‪|H| = |{ab ∈ E : f (ab) = 1‬‬
‫) ‪f (ab) = f ({s} ∪ A, B ∪ {t}) = val(f‬‬
‫‪X‬‬
‫‪ab∈A×B∩E‬‬
‫לכן‬
‫)‪val(f ) ≤ ν(G‬‬
‫‪46‬‬
‫=‬
‫‪B‬‬
‫‪‬‬
‫¯‪S‬‬
‫‪t‬‬
‫)‪A‬‬
‫‪A0 B 0‬‬
‫‪‬‬
‫‪s‬‬
‫‪S‬‬
‫‪oA n‬‬
‫‪1‬‬
‫‪B1‬‬
‫‪S = {s} ∪ A0 ∪ B0‬‬
‫יהא ¯‬
‫)‪ (S, S‬חתך הנתון ע"י‬
‫‪S¯ = {t} ∪ A1 ∪ B1‬‬
‫| ‪¯ = |A1 | + e(A0 , B1 ) + |B0‬‬
‫)‪Cap(S, S‬‬
‫נבחר מכל צלע ב־) ‪ E(A0 , B1‬קדקד ותהא ‪ C‬הקבוצה המתקבלת‪ .‬ברור כי ‪A1 ∪ C ∪ B0‬‬
‫כיסוי של ‪ G‬שגודלו ¯‬
‫)‪ .Cap(S, S‬לכן‬
‫)‪¯ ≥ τ (G‬‬
‫)‪Cap(S, S‬‬
‫‬
‫תהא עתה ‪ f‬זרימה שלמה מקסימלית ויהא ¯‬
‫)‪ (S, S‬חתך מינימלי אזי‬
‫)‪¯ ≥ τ (G‬‬
‫)‪ν(G) ≥ val(f ) = Cap(S, S‬‬
‫ולפיכך )‪.ν(G) = τ (G‬‬
‫‬
‫יהא )‪ G = (A ∪ B, E‬גרף דו־צדדי‪ .‬ל־‪ I ⊂ A‬נסמן‬
‫}‪Γ(I) = {b ∈ B : ∃a ∈ A , (a, b) ∈ E‬‬
‫משפט ‪ :Hall‬אם |‪ |Γ(I)| ≥ |I‬לכל ‪ I ⊂ A‬אזי ‪ G‬מכיל זווג המכסה את כל קדקדי ‪.A‬‬
‫‪B0‬‬
‫הוכחה‪ :‬תהא ‪ S ⊂ A ∪ B‬המכסה את כל צלעות ‪.G‬‬
‫‪.A0 = A ∩ S ,B0 = B ∩ S‬‬
‫‪A1‬‬
‫‪A0‬‬
‫נסמן ‪ ,A1 = A − A0‬אזי ‪ Γ(A1 ) ⊂ B0‬ולכן‬
‫| ‪|A| − |A0 | = |A1 | ≤ |Γ(A1 )| ≤ |B0‬‬
‫ולכן |‪ .|A| ≤ |A0 | + |B0 | = |S‬לכן לפי משפט ‪ K¨onig‬יש זווג בגודל |‪.|A‬‬
‫‪47‬‬
‫‪B‬‬
‫‪A‬‬
‫‬
‫קשירות צלעית בגרפים מכוונים‬
‫יהא )‪ G = (V, E‬גרף מכוון ויהיו ‪ s, t‬קדקדים שונים ב־ ‪ .V‬נגדיר‬
‫מספר מקסימלי של מסלולים מכוונים זרים בקשתות מ־ ‪ s‬ל־ ‪λG (s, t) = t‬‬
‫מספר מינימלי של קשתות ב־‪ E‬שהשמטתן מנתקת את ‪ s‬מ־‪kG (s, t) = t‬‬
‫משפט ‪λG (s, t) = kG (s, t) :Menger‬‬
‫הוכחה‪ :‬ברור כי )‪.λG (s, t) ≤ kG (s, t‬‬
‫כוון שני‪ :‬נתייחס ל־‪ G‬כרשת כשכל הקבולים שווים ל־‪.1‬‬
‫טענה‪ (i) :‬לכל זרימה שלמה ‪ f‬ב־‪ G‬מתקיים )‪.val(f ) ≤ λG (s, t‬‬
‫)‪ (S, S‬ב־‪ G‬מתקיים )‪¯ ≥ kG (s, t‬‬
‫)‪ (ii‬לכל חתך ‪¯ s − t‬‬
‫)‪.Cap(S, S‬‬
‫הוכחה‪ (i) :‬תהא ‪ f‬זרימה שלמה ב־‪ .G‬נגדיר }‪ E 0 = {e ∈ E : f (e) = 1‬אזי הגרף‬
‫) ‪ G0 = (V, E 0‬מקיים )‪ d+ (u) = d− (u‬לכל ‪ u 6= s, t‬ו־) ‪.d+ (s) − d− (s) = val(f‬‬
‫לכן‪ ,‬לפי טענה שהוכחנו בשעור הקודם‪ G ,‬מכיל ) ‪ val(f‬מסלולים זרים בקשתות מ־‪ s‬ל־‪,t‬‬
‫ולכן ) ‪.λG (s, t) ≥ val(f‬‬
‫)‪ (ii‬יהא ¯‬
‫)‪ (S, S‬חתך ‪ s − t‬ב־‪ .G‬אזי ברור כי ‪ S × S¯ ∩ E‬היא קבוצת צלעות הפוגשת כל‬
‫מסלול מכוון מ־‪ s‬ל־‪.t‬‬
‫לכן‬
‫¯‬
‫)‪kG (s, t) ≤ |S × S¯ ∩ E| = Cap(S, S‬‬
‫תהא עתה ‪ f‬זרימה שלמה מקסימלית ¯‬
‫ו־)‪ (S, S‬חתך מינימלי אזי‬
‫) ‪¯ = val(f‬‬
‫)‪val(f ) ≤ λG (s, t) ≤ kG (s, t) ≤ Cap(S, S‬‬
‫ולכן‬
‫)‪λG (s, t) = kG (s, t‬‬
‫‬
‫צירקולציות‬
‫יהא )‪ G = (V, E‬גרף מכוון ופונקציות ‪ α, β : E → R‬כך שלכל ‪e ∈ E‬‬
‫)‪α(e) ≤ β(e‬‬
‫צירקולציה ב־‪ G‬היא העתקה ‪ g : E → R‬המקיימת‬
‫)‪ g + (u) = g − (u) (i‬לכל ‪u ∈ V‬‬
‫‪48‬‬
‫)‪α(e) ≤ g(e) ≤ β(e) (ii‬‬
‫נגדיר רשת חדשה ) ‪H = (V 0 , E 0‬‬
‫‪V 0 = {s, t} ∪ V‬‬
‫} ‪E 0 = E ∪ {su : u ∈ V } ∪ {ut : u ∈ V‬‬
‫עם קבולים‬
‫‪‬‬
‫‪ β(e) − α(e) e = uv ∈ E‬‬
‫)‪α(V, u‬‬
‫‪e = su‬‬
‫= )‪c(e‬‬
‫‪‬‬
‫) ‪α(u, V‬‬
‫‪e = ut‬‬
‫‪P‬‬
‫‪P‬‬
‫= ) ‪α(u, V‬‬
‫= )‪α(uv) , α(V, u‬‬
‫כאשר כמקודם )‪α(vu‬‬
‫‪v∈V‬‬
‫‪v∈V‬‬
‫טענה‪ :‬קיימת צירקולציה ב־‪ G‬אם ורק אם קיימת זרימה ב־‪ H‬שערכה ) ‪.α(V, V‬‬
‫הוכחה‪ :‬תהא ‪ g : E → R‬צירקולציה‪ .‬נגדיר ‪ f : E 0 → R‬על ידי‬
‫‪‬‬
‫‪ g(e) − α(e) e = uv ∈ E‬‬
‫)‪α(V, u‬‬
‫)‪e = (su‬‬
‫= )‪f (e‬‬
‫‪‬‬
‫) ‪α(u, V‬‬
‫)‪e = (ut‬‬
‫אזי לכל ‪u 6= s, t‬‬
‫)‪f + (u) = [g + (u) − α+ (u)] + α+ (u) = g + (u‬‬
‫)‪f − (u) = [g − (u) − α− (u)] + α− (u) = g − (u‬‬
‫לכן ‪ f‬זרימה וערכה הוא‬
‫) ‪val(f ) = f (s, V ) = α(V, V‬‬
‫להיפך‪ ,‬נניח ‪ f‬זרימה ב־‪ H‬שערכה הוא ) ‪.α(V, V‬‬
‫אזי )‪ f (su) = α(V, u‬ו־) ‪ f (ut) = α(u, V‬לכל ‪.u ∈ V‬‬
‫)‪.g(uv) = f (uv) + α(uv‬‬
‫נגדיר לכל ‪uv ∈ E‬‬
‫ברור כי )‪ α(e) ≤ g(e) ≤ β(e‬לכל ‪.e ∈ E‬‬
‫)‪g + (u) = f (u, V ) + α(u, V ) = f + (u) = f − (u) = f (V, u) + α(V, u) = g − (u‬‬
‫‬
‫הערה‪ :‬אלגוריתם ‪ EK‬והטענה דלעיל נותנים אלגוריתם יעיל למציאת צירקולציה ב־‪ G‬אם‬
‫יש כזו‪.‬‬
‫משפט )‪ :(Hoffman‬קיימת צירקולציה ב־‪ ⇔ G‬לכל חתך ¯‬
‫)‪(S, S‬‬
‫‪¯ ≤ β(S,‬‬
‫)‪¯ S‬‬
‫)‪α(S, S‬‬
‫הוכחה‪ :‬אם ‪ f‬צירקולציה ב־‪ G‬אזי לכל חתך ¯‬
‫)‪(S, S‬‬
‫)‪¯ ≤ f (S, S‬‬
‫‪¯ = f (S,‬‬
‫‪¯ S) ≤ β(S,‬‬
‫)‪¯ S‬‬
‫)‪α(S, S‬‬
‫‪49‬‬
¯ ‫ לכל חתך‬α(S, S)
¯ ≤ β(S,
¯ S) ‫ לפי הטענה די להראות כי אם‬:‫כוון שני‬
‫ אזי יש‬G ‫( ב־‬S, S)
.α(V, V ) ‫ זרימה שערכה‬H‫ב־‬
¯
‫( מתקיים‬s ∪ S, t ∪ S)
H‫( ב־‬s, t) ‫ די להראות כי לכל חתך‬MCMF ‫לפי משפט‬
‫ ואכן‬Cap(s ∪ S, S¯ ∪ t) ≥ α(v, V )
¯ + β(S, S)
¯ − α(S, S)
¯ + α(S, V )
Cap(s ∪ S, S¯ ∪ t) = α(V, S)
¯ − α(S,
¯ S) + α(S,
¯ S) − α(S, S)
¯ + α(S, V )
= α(V, V ) − α(V, S) + β(S, S)
¯
¯
¯
¯
≥ α(V, V ) − α(S, S) − α(S, S) + α(S, S) − α(S, S) + α(S, S) + α(S, S)
= α(V, V )
s
S¯
S
50
t
‫אלגוריתם אריתמטיים והצפנה צבורית‬
‫תזכורת מאריתמטיקה‪:‬‬
‫‪ = Z‬חוג השלמים‪ .‬מסמנים ‪ a|b‬אם ‪ a‬מחלק את ‪ ,b‬דהיינו אם קיים ‪ q ∈ Z‬כך ש־ ‪.qa = b‬‬
‫חלוק עם שארית‪ :‬ל־‪ a, b ∈ Z‬ו־‪ a > 0‬קיימת הצגה יחידה ‪ b = qa + r‬כאשר ‪q ∈ Z‬‬
‫‪ q, r .0 ≤ r < a‬נתונים על ידי‬
‫ ‬
‫ ‬
‫‪b‬‬
‫‪b‬‬
‫‪, r =b−‬‬
‫‪·a‬‬
‫=‪q‬‬
‫‪a‬‬
‫‪a‬‬
‫המחלק המשותף המקסימלי של ‪a, b‬‬
‫}‪qcd(a, b) = max{d > 0 : d|a, b‬‬
‫טענה‪ :‬אם ‪ b = qa + r‬אזי )‪gcd(a, b) = gcd(r, a‬‬
‫דוגמא‪:‬‬
‫‪gcd(57, 72) = gcd(15, 57) = gcd(12, 15) = gcd(3, 12) = gcd(0, 3) = 3‬‬
‫אלגוריתם אוקלידס למציאת ‪gcd‬‬
‫יהיו ‪.(a, b) 6= (0, 0) b ≥ a ≥ 0‬‬
‫נגדיר ‪ .c1 = b , c2 = a‬נניח שהגדרנו ‪.k ≥ 2 c1 , . . . , ck‬‬
‫אם ‪ ck = 0‬אזי ‪ .gcd(a, b) = ck−1‬אחרת נחלק עם שארית ‪< ak‬‬
‫‪ ,qk ck + ck+1‬ונקבל על ידי זה את ‪.ck+1‬‬
‫‪ck−1 = 0 ≤ ak+1‬‬
‫סבוכיות אלגוריתם אוקלידס‬
‫∞} ‪ {fk‬סדרת פיבונצ'י‪:‬‬
‫תהא ‪k=0‬‬
‫‪k≥2‬‬
‫תזכורת‪:‬‬
‫‪f0 = 0 , f1 = 1 , fk = fk−1 + fk−2‬‬
‫‪‬‬
‫‪√ !k‬‬
‫‪1− 5 ‬‬
‫‪2‬‬
‫‪√ !k‬‬
‫‪1  1+ 5‬‬
‫√ = ‪fk‬‬
‫‪−‬‬
‫‪2‬‬
‫‪5‬‬
‫‪‬‬
‫נסמן ב־ )‪ E(a, b‬את מספר האטרציות )חלוקות עם שארית( שמבצע אלגוריתם אוקלידס‬
‫על הזוג )‪.(a, b‬‬
‫טענה‪ :‬לכל ‪k ≥ 0‬‬
‫‪E(fk , fk+1 ) = k‬‬
‫הוכחה‪ :‬אינדוקציה על ‪ k = 0 :k‬ברור‪ .‬יהא ‪ k > 0‬אזי‬
‫‪E(fk , fk+1 ) = 1 + E(fk+1 − fk , fk ) = 1 + E(fk−1 , fk ) = 1 + (k − 1) = k‬‬
‫‪51‬‬
‫‬
‫טענה‪ :‬יהא ‪ .k ≥ 1‬אם ‪ fk ≥ b‬או ‪ fk−1 ≥ a‬אזי ‪.E(a, b) ≤ k‬‬
‫הוכחה‪ :‬אינדוקציה על ‪ :k‬המקרה ‪ k = 1‬ברור‪ .‬נניח ‪.k ≥ 2‬‬
‫נחלק עם שארית ‪0 ≤ r < a b = qa + r‬‬
‫אם ‪ a ≤ fk−1‬אזי‬
‫אינדוקציה‬
‫↓‬
‫)‪E(a, b) = 1 + E(r, a‬‬
‫≤‬
‫‪1 + (k − 1) = k‬‬
‫אחרת ‪ a ≤ fk−1 , fk ≥ b‬ואזי‬
‫‪r ≤ b − a ≤ fk − fk−1 = fk−2‬‬
‫ושוב לפי הנחת האנדוקציה‬
‫‪E(a, b) = 1 + E(r, a) ≤ 1 + (k − 1) = k‬‬
‫‬
‫טענה‪ :‬לכל ‪ (0, 0) 6= (a, b) ∈ Z2‬קיימים ‪ x, y ∈ Z‬כך ש־‬
‫‪gcd(a, b) = x · a + y · b‬‬
‫הוכחה‪ :‬בלי הגבלת הכלליות ‪ .b ≥ a ≥ 0‬נוכיח את הטענה באינדוקציה על ‪ .a‬אם ‪a = 0‬‬
‫אזי ‪ .gcd(0, b) = b = 0 · a + 1 · b‬‬
‫נניח ‪ .a > 0‬נחלק עם שארית ‪.0 ≤ r < a b = ab · a + r‬‬
‫לפי הנחת האינדוקציה קיימים ‪ x0 , y 0 ∈ Z‬כך ש‬
‫‪gcd(r, a) = x0 · r + y 0 · a‬‬
‫ואזי‬
‫‬
‫ ‬
‫‪b‬‬
‫‪0‬‬
‫‪gcd(a, b) = gcd(r, a) = x · r + y · a = x b −‬‬
‫‪·a +y ·a‬‬
‫‪a‬‬
‫‬
‫ ‬
‫‪b‬‬
‫‪y 0 − x0‬‬
‫‪· a + x0 · b‬‬
‫‪a‬‬
‫‬
‫ ‬
‫‬
‫‪b‬‬
‫‪ ,(x, y) = y 0 − x0‬אזי ‪.gcd(a, b) = x · a + y · b‬‬
‫נסמן ‪, x0‬‬
‫‪a‬‬
‫‪0‬‬
‫‪0‬‬
‫‪52‬‬
‫‪0‬‬
‫דוגמא‪(a, b) = (21, 111) :‬‬
‫‪y‬‬
‫‪x‬‬
‫‪b‬‬
‫‪a‬‬
‫‪b‬‬
‫‪a‬‬
‫‪−3‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1‬‬
‫‪16‬‬
‫‪−3‬‬
‫‪1‬‬
‫‪0‬‬
‫‪5‬‬
‫‪3‬‬
‫‪2‬‬
‫‪−‬‬
‫‪111‬‬
‫‪21‬‬
‫‪6‬‬
‫‪3‬‬
‫‪21‬‬
‫‪6‬‬
‫‪3‬‬
‫‪0‬‬
‫יהא }‪ Zn = Z/nZ = {0, 1, . . . , n − 1‬חוג השאריות מודולו ‪,n‬‬
‫ותהא }‪ Z∗n = {a ∈ Zn : gcd(a, n) = 1‬החבורה הכפלית של האיברים ההפיכים ב־ ‪.Zn‬‬
‫חישוב ההפכי ב־ ‪ Z∗n‬מתבצע באופן הבא‪ :‬יהא ‪ a ∈ Z∗n‬אזי קיימים ‪ (x, y) ∈ Z2‬כך ש־‬
‫‪ x · a + y · n = gcd(a, n) = 1‬ולכן )‪.a−1 ≡ x(mod n‬‬
‫משפט השארית הסיני‬
‫יהיו ‪ n1 , . . . , nk‬זרים בזוגות אזי ההעתקה‬
‫‪F : Zn1 ...nk → Zn1 ⊕ · · · ⊕ Znk‬‬
‫הנתונה ע"י‬
‫)) ‪F (x) = (x(mod n1 ), . . . , x(mod nk‬‬
‫היא איזימורפיזם של חוגים‪.‬‬
‫הוכחה‪ :‬ברור כי ‪ F‬היא הומומורפיזם של חוגים‪.‬‬
‫ההעתקה ‪ F‬חח"ע‪ :‬אם )‪ F (x) = F (y‬אזי ) ‪ x(mod ni ) = y(mod ni‬כלומר ‪ni |y − x‬‬
‫לכל ‪ 1 ≤ i ≤ k‬ולכן ‪ ,n1 · · · nk |y − x‬כלומר ) ‪.x ≡ y(mod n1 · · · nk‬‬
‫העובדה כי ההעתקה ‪ F‬היא על נובעת מחח"ע ‪ F‬ומכך ש ־‬
‫| ‪|Zn1 ···nk | = n1 · · · nk = |Zn1 × · · · × Zn1‬‬
‫גרסא אלגוריתמית למשפט השאריות הסיני‪.‬‬
‫כמקודם יהיו ‪ n1 , . . . , nk‬זרים בזוגות לכל ‪1 ≤ i ≤ k‬‬
‫‪nj ∈ Z∗ni‬‬
‫‪Y‬‬
‫ולכן קיים ‪αi ∈ Z∗ni‬‬
‫‪j6=i‬‬
‫כך ש־‬
‫‪‬‬
‫‪‬‬
‫‪Y‬‬
‫) ‪ nj  αi ≡ 1(mod ni‬‬
‫‪j6=i‬‬
‫‪ .1 ≤ i ≤ k ai ∈ Z‬אזי‬
‫טענה‪ :‬יהיו ‪ni‬‬
‫‪‬‬
‫‪k‬‬
‫‪X‬‬
‫‪Y‬‬
‫= ‪ x‬מקיים ) `‪ x ≡ a` (mod n‬לכל ‪.1 ≤ ` ≤ k‬‬
‫‪ai  nj  αi‬‬
‫‪j6=i‬‬
‫‪i−1‬‬
‫הוכחה‪:‬‬
‫!‬
‫) `‪αi (mod n‬‬
‫‪nj‬‬
‫‪Q‬‬
‫‪j6=i‬‬
‫) `‪nj α` (mod n` ) = a` (mod n‬‬
‫‪ai‬‬
‫‪Q‬‬
‫‪k‬‬
‫‪P‬‬
‫‪i=1‬‬
‫‪j6=i‬‬
‫‪53‬‬
‫=‬
‫`‪= a‬‬
‫) `‪x(mod n‬‬
‫דוגמא‪(n1 , n2 , n3 ) = (5, 6, 7) :‬‬
‫‪α1 = (n2 n3 )−1 (mod n1 ) = 42−1 (mod 5) = 3‬‬
‫‪α2 = (n1 n3 )−1 (mod n2 ) = 35−1 (mod 6) = 5‬‬
‫‪α3 = (n1 n2 )−1 (mod n3 ) = 30−1 (mod 7) = 4‬‬
‫לכן‬
‫‪= 42 · 3a1 + 35 · 5a2 + 30 · 4a3‬‬
‫‪= 126a1 + 175a2 + 120a3‬‬
‫‪x‬‬
‫מקיים ‪ x(mod ni ) = ai‬לכל ‪.1 ≤ i ≤ 3‬‬
‫טענה‪ :‬אם ‪ n1 , . . . , nk‬זרים בזוגות אזי ‪ F‬היא איזומורפיזם של חבורות אבליות‬
‫‪F : Z∗n1 ,...,nk → Z∗n1 × · · · × Z∗nk‬‬
‫הוכחה‪ :‬אם ‪ x ∈ Z∗n1 ···nk‬אזי ‪ x(mod ni ) ∈ Z∗ni‬לכל ‪1 ≤ i ≤ k‬‬
‫ולכן ‪.F (x) ∈ Z∗n1 × · · · × Z∗nk‬‬
‫כמוכן‪ ,‬אם ‪ (a1 , . . . , ak ) ∈ Z∗n1 ×· · ·×Z∗nk‬ו־ ‪ x ∈ Zn1 ,...,nk‬מקיים ) ‪F (x) = (a1 , . . . , ak‬‬
‫אזי ‪ gcd(x, ni ) = 1‬לכל ‪ 1 ≤ i ≤ k‬ולכן ‪ ,gcd(x, n1 · · · nk ) = 1‬כלומר ‪.x ∈ Z∗n1 ···nk‬‬
‫מספר האיברים ב־ ‪ Z∗n‬מסומן ב )‪ ϕ(n‬ונקרא פונקציית אוילר של ‪.n‬‬
‫‪αk‬‬
‫‪1‬‬
‫‪ n = pα‬כאשר ‪ pi‬ראשוניים שונים ו־ ‪ αi ≥ 1‬אזי‬
‫טענה‪ :‬אם ‪1 · · · pk‬‬
‫‬
‫‪k‬‬
‫ ‪k‬‬
‫‪Y‬‬
‫‪X‬‬
‫‬
‫‪1‬‬
‫‪αi‬‬
‫‪αi −1‬‬
‫= )‪ϕ(n‬‬
‫‪pi − pi‬‬
‫‪=n‬‬
‫‪1−‬‬
‫‪pi‬‬
‫‪i=1‬‬
‫‪i=1‬‬
‫הוכחה‪ :‬נובע מהכפליות‬
‫‬
‫ ‬
‫‬
‫‬
‫ ‬
‫‬
‫‪αk‬‬
‫‪1‬‬
‫‪ϕ(n) = Z∗pα1 ···pαk = Z∗pα1 × · · · × Z∗pαk = ϕ(pα‬‬
‫) ‪1 ) · · · ϕ(pk‬‬
‫‪1‬‬
‫‪k‬‬
‫‪k‬‬
‫‪αi‬‬
‫‪αi −1‬‬
‫‪i‬‬
‫‪.ϕ(pα‬‬
‫ומכך ש־‬
‫‪i ) = pi − pi‬‬
‫המשפט הקטן של פרמה‪:‬‬
‫אם ‪ gcd(a, n) = 1‬אזי )‪.aϕ(n) ≡ 1(mod n‬‬
‫הוכחה‪ a ∈ Z∗n :‬לכן ב־ ‪:Z∗n‬‬
‫‪=1‬‬
‫∗‪|Z‬‬
‫|‪n‬‬
‫‪=a‬‬
‫)‪ϕ(n‬‬
‫‪a‬‬
‫סבוכיות של פעולות אריתמטיות ב ־ ‪Zn‬‬
‫טענה‪ :‬הסבוכיות של פעולות אריטמטיות ב־ ‪ Zn‬חסומה כלהלן‪:‬‬
‫פעולה‬
‫חבור‬
‫כפל‬
‫חלוק עם שארית‬
‫העלאה בחזקה‬
‫‪54‬‬
‫סבוכיות‬
‫)‪O(log n‬‬
‫)‪O(log2 n‬‬
‫)‪O(log2 n‬‬
‫)‪O(log3 n‬‬
‫‪1‬‬
‫הוכחה‪ :‬החסמים לגבי חבור‪ ,‬כפל וחלוק עם שארית נובעים מידית מהאלגוריתמים הסטנדרטים‬
‫לפעולות אלה‪ .‬נתאר עתה אלגוריתם יעיל להעלאה בחזקה‪.‬‬
‫יהא ‪ ,0 ≤ b ≤ n‬ויהא ‪.a ∈ Zn‬‬
‫‪t‬‬
‫‪P‬‬
‫= ‪.t ≤ log n − 1 ,bi ∈ {0, 1} ,b‬‬
‫נכתוב ‪bi z i‬‬
‫‪i=0‬‬
‫נגדיר ברקורסיה סדרה ‪ c0 , . . . , ct ∈ Zn‬כדלקמן‪:‬‬
‫לכל ‪1 ≤ k ≤ t‬‬
‫‪c0 = abt ,‬‬
‫‪ck ≡n c2k−1 · abt−k‬‬
‫קל לבדוק כי )‪ .ab ≡ ct (mod n‬מאחר וחישוב ‪ ck‬מתוך ‪ ck−1‬מבוצע ע"י שלושה כפלים‪,‬‬
‫סיבוכיותו היא )‪ O(log2 n‬ולכן הסבוכיות הכוללת הוא‬
‫)‪t · O(log2 n) = O(log3 n‬‬
‫אלגוריתמים הסתברותיים‬
‫עד כה עסקנו באלגוריתמים דטרמיניסטיים‪ ,‬כאלה שפלט האלגוריתם תלוי אך ורק בקלט‪,‬‬
‫ושתי הרצות שונות של אותו אלגוריתם על אותו קלט ייצרו אותו פלט‪ .‬כמו שנראה‬
‫בהמשך‪ ,‬ישנם מצבים בהם כדאי לאפשר לאלגוריתם להטיל מטבעות במהלך הריצה‪ ,‬בתנאי‬
‫שההסתברות לפלט מוטעה תהיה קטנה למדי‪ .‬ננסח את הדברים בדרך )סמי־(פורמלית‪.‬‬
‫תהא ∗}‪ {0, 1‬קבוצת כל המחרוזות הסופיות של ‪ 0‬ו־‪ .1‬ל־ ∗}‪x = (x1 , . . . , xn ) ∈ {0, 1‬‬
‫נסמן ‪ .|x| = n‬שפה היא תת קבוצה ∗}‪.L ⊂ {0, 1‬‬
‫כל בעיית הכרעה אפשר לקודד כשפה ∗}‪.L ⊂ {0, 1‬‬
‫דוגמאות‪:‬‬
‫}‪ G‬גרף דו־צדדי ‪L = {G :‬‬
‫}‪ x‬ראשוני ‪L = {X ∈ N :‬‬
‫אלגוריתם )דטרמיניסטי( המכריע שייכות לשפה ‪ L‬הוא אלגוריתם ‪ A‬הפועל על מחרוזות‬
‫סופיות ומייצר פלט ב־ }‪ {0, 1‬כך ש־‬
‫‪{x : A(x) = 1} = L‬‬
‫אלגוריתם הסתברותי ‪ε‬־טוב לשפה ‪ L‬הוא אלגוריתם ‪ B‬המקבל כקלט ∗}‪ x ∈ {0, 1‬ומשתנה‬
‫מקרי ‪) w‬המייצג מספר הטלות מטבע( כך ש ־‬
‫‪P r [B(w, x) = 0 | x ∈ L] = 0‬‬
‫וגם‬
‫‪P r [B(w, x) = 1 | x 6∈ L] < ε‬‬
‫כלומר‪ ,‬אם הפלט של ‪ B‬הוא ‪ 0‬אזי בבטחון ‪,x 6∈ L‬‬
‫מאידך אם ‪ x ∈ L‬אזי ‪ B(w, x) = 1‬בהסתברות ‪.1 − ε‬‬
‫דוגמא )מלאכותית במקצת(‪:‬‬
‫נתון קלט ‪ x = (x1 , . . . , xn ) ∈ {0, 1}n‬ונתון כי מתקיימים אחד משני התנאים הבאים‪:‬‬
‫‪x = (0, . . . , 0) .I‬‬
‫‪55‬‬
‫או‬
‫‪.II‬‬
‫‪n‬‬
‫‪2‬‬
‫= |}‪|{i : xi = 0‬‬
‫בעייה‪ :‬קבע האם ‪ x‬מקיים ‪ I‬או ‪.II‬‬
‫אלגוריתם דטרמיניסטי לבעייה‪ :‬בדוק את ‪ 1 ≤ i ≤ n2 + 1 xi‬בזה אחר זה‪.‬‬
‫אם אחד מהם הוא ‪ 1‬אזי ‪ x‬מקיים ‪ .II‬אחרת ‪ x‬מקיים ‪.I‬‬
‫אלגוריתם זה יבצע במקרה הרע ביותר ‪ n2 + 1‬בדיקות‪.‬‬
‫נתאר עתה אלגוריתם הסתברותי לבעייה המבצע הרבה פחות בדיקות‪ ,‬ויחד עם זאת טועה‬
‫בהסתברות נמוכה‪ .‬יהא ‪.ε > 0‬‬
‫אלגורתם ‪ :B‬יהא ‪ .s = dlog2 1ε e‬ל ‪ k = 1‬עד ‪ k = s‬בצע‪:‬‬
‫בחר ‪ 1 ≤ i ≤ n‬באופן מקרי‪ .‬אם ‪ xi = 1‬קבע ‪ B(x) = II‬וסיים‪.‬‬
‫אם ‪ xi = 0‬עבור ל־ ‪ k‬הבא‪ .‬אם ב־‪ s‬ההגרלות קבלנו ‪ xi = 0‬נקבע ‪.B(x) = I‬‬
‫ ‪ x] = 0‬מקיים ‪P r [B(x) = II | I‬‬
‫‪s‬‬
‫‪ x] = 21 < ε‬מקיים ‪P r [B(x) = I | II‬‬
‫מספר הבדיקות שבצענו הוא ‪.s = dlog2 1ε e‬‬
‫לדוגמא‪ ,‬אם אנו מוכנים לקבל תשובה מוטעית בהסתברות של‬
‫בדיקות במקום ‪. n2 + 1‬‬
‫‪−50‬‬
‫‪ ,2‬די להסתפק ב־ ‪50‬‬
‫מציאת ראשוניים גדולים‬
‫משפט המספרים הראשוניים ‪(Hadamard, de la Vallee-Poussin) PNT‬‬
‫נסמן ב־|}‪ p ≤ x‬ראשוני ‪π(x) = |{p :‬‬
‫אזי‬
‫‪x‬‬
‫∼ )‪π(x‬‬
‫‪ln x‬‬
‫משפט המספרים הראשוניים אומר כי הצפיפות של המספרים הראשוניים עד ‪ x‬היא בערך‬
‫‪ , ln1x‬ולכן אם נבדוק נניח ‪ 10 ln x‬מספרים החל מ־‪ x‬הרי שסביר שביניהם נמצא מספר‬
‫ראשוני‪.‬‬
‫ראשוני‪.‬‬
‫הוא‬
‫‪n‬‬
‫נתון‬
‫מספר‬
‫האם‬
‫לקבוע‬
‫כיצד‬
‫היא‬
‫המרכזית‬
‫הבעיה‬
‫√‬
‫√ היא לבדוק האם ‪ n‬מתחלק ב־‪ k‬עבור ‪ k < n‬כלשהוא‪ .‬ברור‬
‫דרך פשוטה לעשות זאת‬
‫עם זאת שחפוש על ‪ n‬מספרים כאשר ‪ n = 10200‬אינו אפשרי‪ .‬אנו נתאר אלגוריתם‬
‫הסתברותי ‪ε‬־טוב לבדיקת ראשונות עם זמן ריצה )‪.O(log 13 log3 n‬‬
‫עדים לפריקות‬
‫יהא ‪ n > 1‬איזוגי‪ ,‬ונכתוב ‪n − 1 = 2t u‬‬
‫נגדיר‬
‫‪.2 6 |u‬‬
‫})‪W1 (n) = {a ∈ Z∗n : an−1 6≡ 1(mod n‬‬
‫‪i−1‬‬
‫‪i‬‬
‫})‪W2 (n) = {a ∈ Z∗n : ∃1 ≤ i ≤ t a2 u 6≡ ±1(mod n) , a2 u ≡ 1(mod n‬‬
‫טענה‪ n ⇐ W1 (n) ∪ W2 (n) 6= ∅ :‬פריק‪.‬‬
‫הוכחה‪ :‬אם )‪ a ∈ W1 (n‬אזי )‪ an−1 6≡ 1(mod n‬ולכן לפי המשפט הקטן של פרמה ‪ n‬פריק‪.‬‬
‫‪56‬‬
‫‪i−1‬‬
‫אם )‪ a ∈ W2 (n‬אזי ‪ λ = a2 u 6≡n ±1‬ומקיים )‪.λ2 ≡ 1(mod n‬‬
‫כלומר למשוואה ‪ z 2 − 1 = 0‬יש לפחות שלושה שורשים ב־ ‪ .±1, λ :Zn‬לכן ‪ Zn‬אינו שדה‬
‫ולכן ‪ n‬פריק‪.‬‬
‫הערה‪ :‬מספר פריק ‪ n‬עבורו ∅ = )‪ W1 (n‬נקרא מספר ‪.Carmichael‬‬
‫למשל ‪ n = 3 · 11 · 17 = 561‬הוא מספר כזה‪.‬‬
‫ידוע כי יש אינסוף מספרי קרמייקל‪.‬‬
‫)‪ϕ(n‬‬
‫טענה‪ :‬אם ∅ =‪ W1 (n) 6‬אזי‬
‫‪2‬‬
‫הוכחה‪ G1 = Z∗n − W1 (n) 6= Z∗n :‬היא תת חבורה של‬
‫)‪.W1 (n) ≥ ϕ(n‬‬
‫‪2‬‬
‫≥ |)‪|W1 (n‬‬
‫‪ ,Z∗n‬ולכן‬
‫)‪ϕ(n‬‬
‫‪2‬‬
‫)‪ϕ(n‬‬
‫‪2‬‬
‫≤ | ‪ |G1‬ולכן‬
‫טענה‪ :‬אם ‪ n‬פריק ו־∅ = )‪) W1 (n‬כלומר ‪ n‬מספר כרמייקל( אזי‬
‫הוכחה‪ :‬ראשית נשים לב כי ‪ n 6= pl‬כאשר ‪ p‬ראשוני ו־‪.l ≥ 2‬‬
‫‪l−1‬‬
‫ואכן‪ ,‬אם ‪ n = pl‬כנ"ל אזי ידוע כי ‪ Z∗n‬ציקלית מסדר )‪.ϕ(n) = p (p − 1‬‬
‫‪l‬‬
‫‪l−1‬‬
‫יהא ‪ α‬יוצר של ‪ Z∗n‬אזי ) ‪ .αp −1 6≡ 1(mod pl‬כי הסדר של ‪ α‬הוא )‪p (p − 1‬‬
‫‪.pl−1 (p − 1) 6 |pl − 1‬‬
‫נכתוב‪ ,‬על כן‪ n = n1 n2 ,‬כאשר ‪.n1 , n2 > 1 ,gcd(n1 , n2 ) = 1‬‬
‫‪j‬‬
‫יהא ‪ 0 ≤ j ≤ t‬המקסימלי כך שקיים ‪ α ∈ Z∗n‬המקיים )‪.α2 u ≡ −1(n‬‬
‫)קיים ‪ j‬כזה כי )‪.((−1)u ≡ −1(n‬‬
‫נגדיר‬
‫‪j‬‬
‫})‪G2 = {x ∈ Z∗n : x2 u ≡ ±1(mod n‬‬
‫≥ |)‪.|W2 (n‬‬
‫טענה‪Z∗n − G2 ⊂ W2 (n) :‬‬
‫‪ .x‬יהא ‪ i‬מינימלי כך ש ־ )‪≡ 1(n‬‬
‫הוכחה‪ :‬יהא ‪ .x ∈ Z∗n − G2‬אזי )‪6≡ ±1(n‬‬
‫‪i−1‬‬
‫‪t‬‬
‫)קיים כזה כי )‪ .(x2 u = xn−1 ≡ 1(n‬אזי )‪x2 u 6≡ 1(n‬‬
‫‪j‬‬
‫‪i−1‬‬
‫מאידך אם )‪ x2 u ≡ −1(n‬אזי ‪ i − 1 ≤ j‬ולכן )‪ .x2 u ≡ ±1(n‬סתירה‪.‬‬
‫‪i−1‬‬
‫לכן )‪.x2 u ≡ ±1(n‬‬
‫‪2j u‬‬
‫∗‬
‫< ‪G2‬‬
‫טענה‪6= Zn :‬‬
‫∗‬
‫הוכחה‪ :‬יהא ‪ x ∈ Zn‬כך ש‪:‬‬
‫) ‪x ≡ α(n1‬‬
‫) ‪x ≡ 1(n2‬‬
‫אזי‬
‫‪≡n1 −1‬‬
‫‪u‬‬
‫‪j‬‬
‫‬
‫‪j‬‬
‫‪x2 u ≡n1 α2‬‬
‫‪j‬‬
‫‪x2 u ≡n2 1‬‬
‫‪j‬‬
‫‪.x2‬‬
‫ולכן )‪6≡ ±1(n‬‬
‫‪u‬‬
‫)‪ϕ(n‬‬
‫מסקנה‪:‬‬
‫‪2‬‬
‫≤ | ‪ |G2‬ולכן‬
‫)‪ϕ(n‬‬
‫‪2‬‬
‫≥ |)‪.|W2 (n‬‬
‫האלגוריתם ההסתברותי של מילר־רבין לבדיקת ראשוניות‬
‫יהא ‪ .ε > 0‬נתאר אלגוריתם ‪ε‬־טוב לבדיקת ראשוניות של ‪ n > 1‬איזוגי‪.‬‬
‫‪57‬‬
‫‪2i u‬‬
‫ו‬
‫‪x‬‬
‫נציג ‪ n − 1 = 2t u‬כאשר ‪ .2 6 |u‬יהא ‪.s = dlog2 1ε e‬‬
‫עבור ‪ 1 ≤ j ≤ s‬נבצע את התהליך הבא‪ :‬נגריל ‪ 1 < aj < n‬מקרי‪.‬‬
‫‪ .I‬אם ‪ gcd(aj , n) > 1‬הכרז ‪ n‬פריק‪ ,‬סיים‪.‬‬
‫‪= an−1‬‬
‫אחרת‪ ,‬חשב את הסדרה‬
‫‪j‬‬
‫‪u‬‬
‫‪t‬‬
‫‪2‬‬
‫‪.auj , a2u‬‬
‫‪j , . . . , aj‬‬
‫‪ an−1‬הכרז ‪ n‬פריק‪ ,‬סיים‪.‬‬
‫‪ .II‬אם )‪6≡ ±1(n‬‬
‫‪j‬‬
‫‪ .III‬אחרת‪ ,‬יהא ‪ i‬המינימלי כך ש־ )‪≡ 1(n‬‬
‫אם )‪6≡ ±1(n‬‬
‫‪u‬‬
‫‪u‬‬
‫‪i‬‬
‫‪.a2j‬‬
‫‪i−1‬‬
‫‪ a2j‬הכרז ‪ n‬פריק‪ ,‬סיים‪.‬‬
‫‪ .IV‬אם בכל ‪ s‬האיטרציות ‪ n‬לא הוכרז פריק‪ ,‬הכרז ‪ n‬ראשוני‪.‬‬
‫נתוח האלגוריתם‪ :‬אם ‪ n‬הוכרז כפריק בשלב ‪ , I‬אזי ‪ gcd(a, n) > 1‬ו־‪ n‬אכן פריק‪ .‬אם‬
‫‪ n‬הוכרז כפריק בשלב ‪ II‬אזי )‪ a ∈ W1 (n‬ובפרט ∅ =‪ W1 (n) 6‬ולכן ‪ n‬פריק‪ .‬אם ‪ n‬הוכרז‬
‫כפריק בשלב ‪ III‬אזי )‪ a ∈ W2 (n‬ובפרט ∅ =‪ W2 (n) 6‬ולכן ‪ n‬פריק‪.‬‬
‫מסקנה‪ :‬אם האלגוריתם הכריז על ‪ n‬כפריק‪ ,‬אזי ‪ n‬אכן פריק‪.‬‬
‫נדון כעת במקרה ש־‪ n‬הוכרז כראשוני בשלב ‪ .IV‬אם ‪ n‬אכן ראשוני אזי ההכרזה נכונה‪.‬‬
‫יתכן‪ ,‬עם זאת‪ ,‬ש־‪ n‬אינו ראשוני‪.‬‬
‫נעריך עתה את ההסתברות המותנה‬
‫]‪ n‬פריק | ‪ n‬הוכרז ראשוני[ ‪P r‬‬
‫נפריד לשני מקרים‪:‬‬
‫)‪ .W1 (n) 6= ∅ (i‬מכך שהכרזנו על ‪ n‬כראשוני נובע כי כל ‪ a1 , . . . , as‬שבחרנו מקיימים‬
‫)‪ .ai ∈ Z∗n − W1 (n‬לכן במקרה זה‬
‫∗ ‬
‫ ‪s‬‬
‫‪s‬‬
‫|)‪|Zn − W1 (n‬‬
‫|)‪|W1 (n‬‬
‫≤ ]‪ n‬פריק | ‪ n‬הוכרז ראשוני[ ‪P r‬‬
‫‪= 1−‬‬
‫)‪ϕ(n‬‬
‫)‪ϕ(n‬‬
‫‪ s‬‬
‫‪1‬‬
‫‪≤ε‬‬
‫‪2‬‬
‫≤‬
‫)‪ .W1 (n) = ∅ (ii‬מכך שהכרזנו על ‪ n‬כראשוני נובע כי כל ‪ a1 , . . . , as‬שבחרנו מקיימים‬
‫)‪ .ai ∈ Z∗n − W2 (n‬ולכן‬
‫ ‪s‬‬
‫‪s‬‬
‫∗ ‬
‫|)‪|W2 (n‬‬
‫|)‪|Zn − W2 (n‬‬
‫‪≤ 1−‬‬
‫≤ ]‪ n‬פריק | ‪ n‬הוכרז ראשוני[ ‪P r‬‬
‫)‪ϕ(n‬‬
‫)‪ϕ(n‬‬
‫‪ s‬‬
‫‪1‬‬
‫‪≤ε‬‬
‫‪2‬‬
‫‪58‬‬
‫≤‬
‫לכן בכל מקרה‬
‫‪ n] ≤ ε‬פריק | ‪ n‬הוכרז ראשוני[ ‪P r‬‬
‫כלומר האלגוריתם הוא ‪ε‬־טוב‪.‬‬
‫סבוכיות אלגורתם מילר־רבין‬
‫סבוכיות חשוב הסדרה‬
‫‪t‬‬
‫‪auj , . . . , a2j u‬‬
‫‪3‬‬
‫היא )‪O(log n‬‬
‫‪1‬‬
‫ולכן סבוכיות האלגוריתם היא )‪O(s log n) = O(log · log3 n‬‬
‫‪ε‬‬
‫‪3‬‬
‫הצפנה ציבורית בשיטת ‪RSA‬‬
‫בעיית ההצפנה‬
‫נניח כי ‪ Alice‬ו־ ‪ Bob‬רוצים לשלוח ביניהם הודעות מוצפנות כך שצד שלישי המצותת להן‬
‫לא יוכל לפענח את תוכנן‪ .‬כיצד יוכלו לעשות זאת?‬
‫שיטת ההצפנה הקלאסית‬
‫מניחים כי כל הודעה מורכבת מ־‪ n‬אותיות לועזיות ושכל אות מיוצגת ע"י ‪ ,j‬כאשר‬
‫‪ Alice .0 ≤ j ≤ 25‬ו־ ‪ Bob‬נפגשים מראש ומחליטים על פונקצית הצפנה סודית ‪ E‬ופונקצית‬
‫פענוח )סודית גם כן( ‪ .D = E −1‬לכל הודעה אפשרית ‪ M‬מתקיים ‪.D(E(M )) = M‬‬
‫נביא כמה דוגמאות לצפנים )נניח שההודעה היא ) ‪:(M = (x1 , . . . , xn‬‬
‫‪ .1‬צופן המיוחס ליוליוס קיסר‪:‬‬
‫)‪E(x1 , . . . , xn ) = ((x1 + 3)mod 26, . . . , (xn + 3)mod 26‬‬
‫פונקצית הפענוח במקרה זה היא‪:‬‬
‫)‪D(x1 , . . . , xn ) = ((x1 − 3)mod 26, . . . , (xn − 3)mod 26‬‬
‫‪ .2‬צופן מהסוג המתואר בספרי מתח נושנים‪:‬‬
‫תהי ‪ zi‬האות הראשונה בעמוד ‪ i‬של הספר "אנה קרנינה" )נניח שבידי ‪ Alice‬ו־ ‪Bob‬‬
‫אותה מהדורה(‪ .‬נגדיר‪:‬‬
‫)‪E(x1 , . . . , xn ) = ((x1 + zi )mod 26, . . . , (xn + zi )mod 26‬‬
‫פונקצית הפענוח היא‪:‬‬
‫)‪D(x1 , . . . , xn ) = ((x1 − zi )mod 26, . . . , (xn − zi )mod 26‬‬
‫‪ .3‬צופן אקראי‪:‬‬
‫בפגישתם ‪ Alice‬ו־ ‪ Bob‬מגרילים סדרה "מקרית" ) ‪ (z1 , . . . , zn‬ומגדירים את פונקציות‬
‫ההצפנה והפענוח כמו בדוגמא הקודמת‪ .‬אם הסדרה ) ‪ (z1 , . . . , zn‬היא אכן "מקרית"‪,‬‬
‫שיטת הצפנה זו היא בטוחה לחלוטין )להודעה בודדת באורך ‪.(n‬‬
‫‪59‬‬
‫בשיטת ההצפנה הקלאסית ישנן מספר בעיות‪:‬‬
‫)א( קשה לייצר סדרות שדומות למקריות‪.‬‬
‫)ב( השיטה מחייבת תיאום מראש בין ‪ Alice‬ו־ ‪.Bob‬‬
‫שיטת ההצפנה הציבורית‬
‫כעת נניח ש ־ ‪ Alice‬מעוניינת לקבל הודעות מוצפנות מציבור גדול של משתמשים מבלי‬
‫להיפגש איתם מראש‪ .‬נסמן את מרחב ההודעות האפשריות ב־ ‪.M‬‬
‫הרעיון הוא פשוט‪ Alice :‬תבחר פונקצית חח"ע ועל ‪ E : M → M‬ותפרסם ברבים )למשל‪,‬‬
‫במדריך הדומה למדריך טלפונים( את האלגוריתם לחישוב הפונקציה ‪ .E‬פונקצית הפענוח‬
‫תיקרא‪ ,‬כמקודם ‪ D‬ותקיים‪:‬‬
‫‪∀M ∈ M : D(E(M )) = M‬‬
‫לכאורה‪ ,‬נוצרת בעיה‪ :‬אם הפונקציה ‪ E‬ידועה לכל‪ ,‬אזי כל מצותת יוכל לחשב את הפונקציה‬
‫ההופכית ‪ D = E −1‬ולפענח את התקשורת המוצפנת ע"י כך שיעבור על מרחב ההודעות‬
‫האפשריות ‪ M‬וימצא את ) ‪ E(M‬לכל הודעה ‪ .M ∈ M‬ברם‪ ,‬אם המרחב ‪ M‬הוא מספיק‬
‫גדול )נניח מסדר גודל של ‪ (10700‬שיטה זו למציאת ‪ D‬אינה מציאותית‪.‬‬
‫ננסח‪ ,‬אפוא‪ ,‬את הדרישות מפונקצית הצפנה טובה ‪ E‬עבור שיטת ההצפנה הציבורית‪:‬‬
‫‪ E .1‬ניתנת לחישוב מהיר על כל קלט ‪.M ∈ M‬‬
‫‪ Alice .2‬יכולה לחשב את ‪ D‬במהירות על כל ‪.M ∈ M‬‬
‫‪ .3‬למרות ש־ ‪ E‬נתונה‪ ,‬איש מלבד ‪ Alice‬אינו יכול לחשב את ‪ D‬בזמן סביר‪.‬‬
‫פונקציה כזו נקראת ‪) trapdoor function‬מונח זה נטבע ע"י ‪ Diffie‬ו־ ‪ Hellman‬בשנת‬
‫‪.(1976‬‬
‫שיטת ‪RSA‬‬
‫בשנת ‪ 1977‬המציאו ‪ Shamir ,Rivest‬ו־ ‪ Adleman‬את אלגוריתם ‪ RSA‬שרבים משערים‬
‫כי הוא מממש ‪ .trapdoor function‬נתאר כעת אלגוריתם הצפנה פופולרי זה‪:‬‬
‫‪ Alice‬מוצאת )למשל בשיטת מילר־רבין( שני מספרים ראשוניים ‪ p, q‬גדולים )נניח מסדר‬
‫גודל של ‪ (10700‬ומחשבת את ‪ .n = pq‬עתה ‪ Alice‬בוחרת מספר ‪) e‬די גדול( שמקיים‬
‫‪ .(e, (p − 1)(q − 1)) = 1‬מרחב ההודעות מוגדר להיות ‪.M = Z∗n‬‬
‫‪ Alice‬מפרסמת את הזוג )‪ (n, e‬בפומבי ומגדירה את פונקצית ההצפנה ‪ E : M → M‬ע"י‪:‬‬
‫)‪∀x ∈ M : E(x) = xe (mod n‬‬
‫לאחר מכן ‪ Alice‬מחשבת בעזרת אלגוריתם אוקלידיס את ההופכי ל־‪e‬‬
‫מודולו )‪ ,(p − 1)(q − 1‬כלומר מוצאת מספר ‪ d‬המקיים‬
‫)‪de ≡ mod (p − 1)(q − 1‬‬
‫הפונקציה ההופכית ל־‪ E‬נתונה ע"י‪:‬‬
‫)‪∀y ∈ M : D(y) ≡ y d (mod n‬‬
‫‪60‬‬
‫נוודא שהפונקציה ‪ D‬אכן הופכית ל־‪:E‬‬
‫‪∀x ∈ M : D(E(x)) = (xe )d mod n = x1+λ(p−1)(q−1) mod n‬‬
‫לפי הנוסחה שהוכחנו לפונקצית אוילר‪ ,‬מתקיים‪:‬‬
‫)‪φ(n) = φ(pq) = (p − 1)(q − 1‬‬
‫ולכן‪ ,‬לפי המשפט הקטן של פרמה‪:‬‬
‫)‪x1+φ(n) (mod n) ≡ x(mod n‬‬
‫לפיכך‪:‬‬
‫‪D(E(x)) = x‬‬
‫הערה‪ :‬מאחר והזוג )‪ (n, e‬ידוע ברבים הרי שע"י פירוק ‪ n‬לגורמים ראשוניים ‪ p, q‬אפשר‬
‫לחשב את ‪ d‬ואת פונקצית הפענוח ‪ .D‬החסינות של שיטת ‪ RSA‬מבוססת על ההשערה‬
‫)שטרם הוכחה( כי פירוק מספר לגורמיו היא בעייה חישובית קשה‪.‬‬
‫‪61‬‬
‫מבוא לסבוכיות של חשובים‬
‫בעיות אופטימיזציה ובעיות הכרעה‬
‫הבעיות האלגוריתמיות בהן עסקנו עד כה הן בדרך כלל בעיות אופטימיזציה‪ ,‬למשל מציאת‬
‫העץ הפורש המינימלי‪ ,‬מציאת המסלול הקצר ביותר בין זוג קדקדים בגרף‪ ,‬מציאת הזרימה‬
‫המקסימלי ברשת וכיו"ב‪.‬‬
‫בעיות הכרעה‪ ,‬הינן‪ ,‬מאידך‪ ,‬בעיות שהתשובה עליהן היא כן או לא‪.‬‬
‫למשל‪ ,‬בהנתן גרף ממושקל ‪ G‬ומספר ‪ ,k‬הכרע האם הגרף מכיל עץ פורש שמשקלו ≥ ‪.k‬‬
‫בדיון בנושא סבוכיות‪ ,‬מתייחסים בד"כ לבעיות הכרעה בלבד‪.‬‬
‫הסיבה היא שאם נתונה בעיית אופטימיזציה ‪ ,P‬ואם ‪ Q‬בעיית ההכרעה הנגזרת ממנה‪ ,‬אזי‬
‫אם יש ל־‪ Q‬אלגוריתם פולונומיאלי‪ ,‬אזי גם ל־ ‪ P‬יש אלגוריתם פולינומיאלי ־ יתכן עם מעריך‬
‫חזקה גדול יותר‪.‬‬
‫דוגמא‪ :‬תהא ‪ P‬בעיית האופטימיזציה הבאה‪ :‬בהנתן גרף )‪ G = (V, E‬מצא ‪ S ⊂ V‬כיסוי‬
‫צלעות מינימלי בגודלו )‪.S = τ (G‬‬
‫תהא ‪ Q‬בעיית ההכרעה המתאימה‪ :‬בהנתן זוג )‪ k) (G, k‬טבעי( קבע האם ‪.τ (G) ≤ k‬‬
‫נסמן ב־ )‪ f (n‬את סיבוכיות ‪ P‬על גרף עם ‪ n‬קדקדים‪ ,‬ונסמן ב־)‪ g(n, k‬את סבוכיות ‪ Q‬על‬
‫גרף עם ‪ n‬קדקדים ו־ ‪1 ≤ k ≤ n‬‬
‫טענה‪ :‬אם ) ‪ g(n, k) ≤ O(nc‬לכל ‪ 0 ≤ k ≤ n‬אזי ) ‪.f (n) ≤ O(nc+2‬‬
‫הוכחה‪ :‬יהא ‪ B‬אלגוריתם לבעייה ‪ Q‬מסבוכיות ‪.g‬‬
‫נתאר אלגוריתם ‪ A‬לבעייה ‪ :P‬יהא )‪V = {v1 , . . . , vn } G = (V, E‬‬
‫‪A(G):‬‬
‫‪k=0‬‬
‫‪while B(G, k) = False‬‬
‫‪do k ← k + 1‬‬
‫)* לאחר ‪ while‬זה מתקיים ‪(* τ (G) = k‬‬
‫‪i=1‬‬
‫‪while B(G − v1 , k − 1) = False‬‬
‫‪do i ← i + 1‬‬
‫)* לאחר ‪ while‬זה מתקיים ‪(* τ (G − vi ) ≤ k − 1‬‬
‫} ‪A(G) = A(G − vi ) ∪ {vi‬‬
‫נתוח סבוכיות‪ :‬נניח כי ‪ ,g(n, k) ≤ αnc‬נראה באנדוקציה כי ‪.f (n) ≤ 2αnc+2‬‬
‫ואכן מהאלגוריתם נובע כי‬
‫)‪g(n, k) + ng(n − 1, k − 1) + f (n − 1‬‬
‫‪n‬‬
‫‪P‬‬
‫≤ )‪f (n‬‬
‫‪k=0‬‬
‫) ‪≤ n · αnc + nαnc + 2α(n − 1)c+2 = 2α(nc+1 + (n − 1)c+1‬‬
‫‪≤ 2αnc+2‬‬
‫‬
‫‪62‬‬
‫שפות‬
‫נסמן ב־ ∗}‪ {0, 1‬את אוסף המחרוזות הסופיות של אפסים ואחדים‪.‬‬
‫ל־ ∗}‪ x = (x1 , . . . , xn ) ∈ {0, 1‬נסמן ‪.|x| = n‬‬
‫שפה היא תת קבוצה ∗}‪ .L ⊂ {0, 1‬בעיית ההכרעה הקשורה לשפה ‪ L‬הינה בהנתן ∈ ‪x‬‬
‫∗}‪ {0, 1‬האם ‪ x ∈ L‬או ‪.x 6∈ L‬‬
‫אלגוריתם }‪ A : {0, 1}∗ → {0, 1‬הינו אלגוריתם הכרעה ל־‪ L‬אם‬
‫}‪L = {x ∈ {0, 1}∗ : A(x) = 1‬‬
‫כל בעיות ההכרעה ניתנות לנסוח בעזרת שפות‪ ,‬ע"י קדוד מתאים וסטנדרטי של הקלט הנתון‬
‫)גרף‪ ,‬רשת וכיו"ב( על וקטור ב־ ∗}‪.{0, 1‬‬
‫המחלקה ‪P‬‬
‫שפה ‪ L‬תקרא פולינומיאלית אם קיים לה אלגוריתם הכרעה ‪ ,A‬וקבוע ‪ c > 0‬כך שלכל‬
‫∗}‪ A(x) ,x ∈ {0, 1‬מחושב בזמן ) ‪.O(|x|)c‬‬
‫אוסף כל השפות הפולינומיאליות יסומן ב־ ‪.P‬‬
‫אנו מכירים דוגמאות רבות לשפות ב־ ‪ ,P‬למשל‪:‬‬
‫)‪ (i‬שפת הגרפים בדו־צדדיים‬
‫)‪ (ii‬שפת הגרפים הדו־צדדיים בעלי זווג מושלם‬
‫)‪ (iii‬שפת הגרפים הממושקלים בעלי עץ פורש שמשקלו ≥ ‪10‬‬
‫)‪ (iv‬שפת הגרפים המכילים קליק בגודל ≤ ‪10‬‬
‫השפות נמצאות ב־ ‪ P‬נחשבות ל"טובות" מבחינה חשובית‪.‬‬
‫ישנן בעיות שידוע שאינן ב־ ‪ ,P‬למשל האם במשחק דמקה על לוח ‪ n × n‬יש אסטרטגית‬
‫נצחון ללבן‪.‬‬
‫המחלקה ‪N P‬‬
‫יש שפות רבות ‪ L‬שעבורן אם ‪ x ∈ L‬אזי אורקל יכול להוכיח לנו בזמן פולינומי שאכן‬
‫‪ .x ∈ L‬נסמן אוסף שפות זה ע"י ‪.(Nondeterministic Polynomial) N P‬‬
‫דוגמאות‪:‬‬
‫)‪ G} (i‬גרף ‪COV ER = {(G, k) : τ (G) ≤ k , k ∈ N ,‬‬
‫אם ‪ (G, k) ∈ COV ER‬אזי אורקל יכול לספק לנו קבוצה ‪ S ⊂ V‬ואנו נבדוק בזמן‬
‫פולינומי כי ‪ |S| ≤ k‬וכי ‪ S‬קבוצה מכסה של ‪.G‬‬
‫)‪ (ii‬מעגל המילטוני הוא מעגל פשוט העובר דרך כל קדקדי ‪.G‬‬
‫}‪ G‬גרף המילטוני ‪HAM = {G :‬‬
‫אם ‪ G ∈ HAM‬אזי אורקל לכול לספק לנו סדור של הקדקדים ואנו נוכל לבדוק‬
‫בזמן לינארי ב־‪ n‬שהסדור מגדיר מעגל המילטוני‪.‬‬
‫הגדרה פורמלית של ‪N P‬‬
‫‪63‬‬
‫‪ L ∈ N P‬אם קיים אלגוריתם }‪ A : {0, 1}∗ × {0, 1}∗ → {0, 1‬וקבוע ‪ c > 0‬כך ש־‬
‫)‪ A(x, y‬מחושב בזמן ) ‪ O ((|x| + |y|)c‬וכך ש־‬
‫}‪L = {x ∈ {0, 1}∗ : ∃y ∈ {0, 1}∗ , |y| ≤ O(nc ) , A(x, y) = 1‬‬
‫טענה‪P ⊂ N P :‬‬
‫הוכחה‪ :‬תהא ‪ ,L ∈ P‬ויהא }‪ B : {0, 1}∗ → {0, 1‬אלגוריתם הכרעה ל־‪ L‬כך ש־ )‪B(x‬‬
‫מחושב בזמן ) ‪ .O(|x|c‬נגדיר }‪ A : {0, 1}∗ × {0, 1}∗ → {0, 1‬ע"י )‪ .A(x, y) = B(x‬אזי‬
‫)‪ A(x, y‬מחושב בזמן ) ‪ O(|x|c‬וברור כי‬
‫}) ‪L = {x : B(x) = 1} = {x : ∃y A(x, y) = 1 |y| = O(|x|c‬‬
‫‬
‫אנו נשווה בין סיבוכיות של בעיות שונות בעזרת המושג של רדוקציה פולינומיאלית‪.‬‬
‫הגדרה‪ :‬נאמר כי השפה ‪ L1‬ניתנת לרדוקציה פולינומיאלית לשפה ‪,L2‬‬
‫ובסימון ‪ ,L1 ≤P L2‬אם קיים אלגוריתם ∗}‪ f : {0, 1}∗ → {0, 1‬וקיים קבוע ‪ c > 0‬כך‬
‫שמתקיימים התנאים הבאים‪:‬‬
‫‪ f (x) .1‬מחושב בזמן ) ‪.O(|x|c‬‬
‫‪f (x) ∈ L2 ⇔ x ∈ L1 .2‬‬
‫דוגמא‪ :‬מספר הצביעה )‪ χ(G‬של גרף ‪ G‬הוא ה־‪ k‬המינימלי כך שקיימת צביעה‬
‫]‪ ϕ : V → [k‬המקיימת ‪.ϕ(u) 6= ϕ(v) ⇐ {u, v} ∈ E‬‬
‫עבור ‪ i‬קבוע נסמן ב־ )‪ COL(k‬את משפחת הגרפים המקיימים ‪ .χ(G) ≤ k‬למשל )‪COL(2‬‬
‫היא משפחת הגרפים הדו־צדדיים ולכן ‪.COL(2) ∈ P‬‬
‫טענה‪ :‬לכל ‪ k‬קבוע‪.COL(k) ≤P COL(k + 1) ,‬‬
‫הוכחה‪ :‬לגרף )‪ G = (V, E‬נגדיר ) ‪ f (G) = (V 0 , E 0‬כאשר }‪ w) V 0 = V ∪ {w‬קדקד חדש(‬
‫ו } ‪.E 0 = E ∪ {{v, w} : v ∈ V‬‬
‫ברור כי )‪ ,χ(f (G)) = 1 + χ(G‬ולכן‬
‫)‪f (G) ∈ COL(k + 1) ⇔ G ∈ COL(k‬‬
‫טענה‪:‬‬
‫)‪ (i‬אם ‪ L1 ≤P L2 ,L2 ≤P L3‬אזי ‪.L1 ≤P L3‬‬
‫)‪ (ii‬אם ‪ L1 ≤P L2‬ו־ ‪ L2 ∈ P‬אזי ‪.L1 ∈ P‬‬
‫הוכחה‪ (i) :‬ברור‪.‬‬
‫)‪ (ii‬יהא ‪ A2‬אלגוריתם הכרעה ל־ ‪ L2‬כך ש־ )‪ A2 (x‬מחושב בזמן ) ‪ .O(|x|c2‬תהא‬
‫∗}‪ f : {0, 1}∗ → {0, 1‬רדוקציה פולינומיאלית של ‪ L1‬ל־ ‪ L2‬כך ש )‪ f (x‬מחושבת בזמן‬
‫) ‪.O(|x|c‬‬
‫‪cc1‬‬
‫אזי ))‪ A1 (x) = A2 (f (x‬הוא אלגוריתם הכרעה ל־ ‪ ,L1‬ו־ ‪ A1‬מחושב בזמן ) |‪.O(|x‬‬
‫‪64‬‬
‫‬
‫הגדרה‪ :‬השפה ‪ L‬נקראת ‪N P‬־קשה )‪ (NP-Hard‬אם ‪ L0 ≤P L‬לכל ‪.L0 ∈ N P‬‬
‫‪ L‬נקרא ‪N P‬־שלמה )‪ NP-Complete‬או בקיצור ‪ (NPC‬אם ‪ L ∈ N P‬ו־‪ L‬היא ‪N P‬־קשה‪.‬‬
‫השערה‪.P 6= N P :‬‬
‫הערה חשובה‪ :‬אם עבור בעיה כלשהיא ‪ L ∈ N P C‬מתקיים ‪ L ∈ P‬אזי מהטענה למעלה‬
‫נובע כי ‪ .P = N P‬לכן אם אנו מראים עבור בעייה מסויימת ‪ L‬שהיא ב־‪ N P C‬אזי‪ ,‬בכפוף‬
‫להשערה ‪ ,P 6= N P‬נובע כי אין לה אלגוריתם הכרעה פולינומיאלי‪.‬‬
‫נוסחא בוליאנית ) ‪ φ(x1 , . . . , xn‬נקראית ספיקה אם יש הצבה ∈ ) ‪x = (x1 , . . . , xn‬‬
‫‪ (T, F )n‬כך ש ־ ‪.φ(x) = T‬‬
‫דוגמא‪ (x7 ∨ ¬x2 ) ∧ (x1 ∨ x3 ) :‬ספיקה‪ x1 ∧ ¬x1 .‬אינה ספיקה‪.‬‬
‫נסמן ב־ ‪ SAT‬את אוסף הנוסחאות הספיקות‪.‬‬
‫משפט ‪.SAT ∈ N P C :Cook‬‬
‫בעזרת משפט ‪ Cook‬והטכניקה של רדוקציה פולינומיאלית‪ ,‬ניתן להראות כי בעיות טבעיות‬
‫רבות נמצאות ב־‪ N P C‬ולכן‪ ,‬בכפוף להשערה ‪ ,P 6= N P‬אינן ניתנות להכרעה בזמן‬
‫פולינומיאלי‪.‬‬
‫כהדגמה לשיטה זו נראה כי הבעיות הבאות ב־ ‪:N P C‬‬
‫‪ .1‬נוסחא בוליאנית ‪ φ‬היא ב‪ conjuctive normal form‬אם ‪ φ‬היא ‪ AND‬של ‪OR‬־ים‬
‫באורך שלוש של משתנים או שלילותיהם‪ ,‬למשל‬
‫) ‪φ = (x1 ∨ ¬x2 ∨ x4 ) ∧ (x3 ∨ ¬x1 ∨ x7‬‬
‫נסמן ב־ ‪ 3CN F‬את אוסף הנוסחאות הנ"ל שהן ספיקות‪.‬‬
‫‪ .2‬נסמן ב־ )‪ w(G‬את גודל הקליק המרבי בגרף ‪.G‬‬
‫נסמן ב־ ‪ CLIQU E‬את אוסף הזוגות )‪ (G, k‬כך ש־ ‪.w(G) ≥ k‬‬
‫‪ .3‬נסמן ב־ ‪ COV ER‬את אוסף הזוגות )‪ (G, k‬כך ש ־ ‪.τ (G) ≤ k‬‬
‫‪ .4‬נסמן ב־ ‪ DHAM‬את אוסף הגרפים המכוונים ‪ G‬בעלי מעגל המילטוני מכוון‪.‬‬
‫קל לבדוק כי ‪3CN F, CLIQU E, COV ER, HAM, DHAM, COL(3) ∈ N P‬‬
‫טענה‪SAT ≤P 3CN F ≤P CLIQU E ≤P COV ER ≤P DHAM :‬‬
‫)‪3CN F ≤P COL(3‬‬
‫מסקנה‪ :‬כל הבעיות המופיעות בטענה הקודמת הן ב־ ‪.N P C‬‬
‫‪65‬‬