25חזרה לקראת המבחן: תת-גרף מקסימלי חסר מעגלים, כיסוי בהיפרגרף 3-אחיד, חתך מכוון ואי-קירוב של Bin-Packing

פתרון מלא של ארבעה תרגילים מתרגיל בית 3 — שלושה אלגוריתמי קירוב (½ לתת-גרף חסר מעגלים, 3 לכיסוי בהיפרגרף 3-אחיד, ¼ לחתך מקסימלי בגרף מכוון), רדוקציה $\mathrm{VC}\le_p\mathrm{3H\text{-}VC}$, והוכחה שקיום אלגוריתם קירוב ביחס $1.49$ ל-$\mathrm{BIN\text{-}PACKING}$ גורר $\mathrm{P}=\mathrm{NP}$.

ביטחון: high1 הקלטות8 עמודי סיכוםexam-reviewapproximation-algorithmsacyclic-subgraphhypergraph-vertex-coverdirected-max-cutbin-packing

נשען על: שיעור 10, שיעור 12, שיעור 13, שיעור 14

עמודי הסיכום בכתב יד

פתיחת עמוד 1 בגודל מלא

סיבוכיות שיעור 25.pdf

עמוד 1 מתוך 8 בסיכום הכתב יד

בקצרה

  • זהו שיעור חזרה: ארבעה תרגילים מתרגיל בית 3, כל אחד נפתר על הלוח מקצה לקצה. אין כאן תיאוריה חדשה — יש כאן את התבניות שבהן הקורס בודק את החומר.
  • שלושת הדברים שכל אלגוריתם קירוב חייב חוזרים בכל תרגיל ומודגשים שוב ושוב: (1) זמן ריצה פולינומי, (2) הפלט הוא פתרון אפשרי, (3) יחס הקירוב. הפריט (2) הוא זה שנשכח הכי הרבה.
  • תרגיל 3 — פירוק קשתות גרף מכוון לפי סדר האינדקסים לשתי קבוצות חסרות מעגלים, ובחירת הגדולה מביניהן: אלגוריתם קירוב ביחס 12\tfrac12 לבעיית תת-הגרף המקסימלי חסר המעגלים.
  • תרגיל 4 — הכללה של הכיסוי בקודקודים להיפרגרפים 3-אחידים: (א) VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC}, ולכן 3H-VC\mathrm{3H\text{-}VC} היא NP-קשה; (ב) אותו אלגוריתם חמדני של שיעור 13, עם 33 במקום 22 — אלגוריתם קירוב ביחס 33.
  • תרגיל 5 — חתך מקסימלי בגרף מכוון: מוחקים כיוונים, מריצים את אלגוריתם ה-12\tfrac12 ל-MAXCUT\mathrm{MAXCUT}, ואז בוחרים בין UU ל-Uˉ\bar U. יחס 14\tfrac14. זהו התרגיל שרוב הכיתה טעתה בו — בהגשה הוחזר ניתוח בתוחלת, וזה אינו אלגוריתם קירוב.
  • תרגיל 7 — אם קיים אלגוריתם קירוב ביחס 1.491.49 ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} אז P=NP\mathrm{P}=\mathrm{NP}. אותה תבנית בדיוק כמו אי-הקירוב של TSP\mathrm{TSP} משיעור 13: מניחים אלגוריתם קירוב, בונים ממנו אלגוריתם הכרעה לבעיה NP-קשה, ומסיקים.
  • הסף 1.491.49 אינו שרירותי: כל α<32\alpha<\tfrac32 עובד, ובדיוק 32\tfrac32 כבר לא — כי מספר התאים הוא מספר שלם.

רקע ותלויות

הקובץ הזה אינו מוכיח כמעט שום דבר מאפס; הוא מרכיב תוצאות קיימות. להלן מה שצריך להיות בידיים, במלואו.

1. הגדרת אלגוריתם קירוב (שיעור 13, הגדרה 3). לבעיית מינימיזציה ועבור α≥1\alpha\ge 1: אלגוריתם שרץ בזמן פולינומי ב-∣I∣|I|, מחזיר פתרון אפשרי x∈XIx\in X_I, ומקיים OPT(I)  ≤  v(x)  ≤  α⋅OPT(I).\mathrm{OPT}(I)\;\le\;v(x)\;\le\;\alpha\cdot\mathrm{OPT}(I). לבעיית מקסימיזציה ועבור 0<α≤10<\alpha\le 1: אלגוריתם פולינומי המחזיר פתרון אפשרי ומקיים α⋅OPT(I)  ≤  v(x)  ≤  OPT(I).\alpha\cdot\mathrm{OPT}(I)\;\le\;v(x)\;\le\;\mathrm{OPT}(I). בשני המקרים אחד משני אי-השוויונות טריוויאלי (הוא נובע מהפיזביליות של הפלט), וכל העבודה היא בשני.

2. הכיסוי בקודקודים (שיעור 10, הגדרה 1 ומשפט 2). U⊆VU\subseteq V היא כיסוי בקודקודים של G=(V,E)G=(V,E) אם ∀e∈E: e∩U≠∅\forall e\in E:\ e\cap U\ne\emptyset, והשפה היא VC={⟨G,k⟩∣∃ U⊆V vertex cover, ∣U∣≤k}.\mathrm{VC}=\{\langle G,k\rangle \mid \exists\,U\subseteq V \text{ vertex cover},\ |U|\le k\}. VC\mathrm{VC} היא NP-שלמה (שיעור 10, משפט 2, דרך IS≤pVC\mathrm{IS}\le_p\mathrm{VC}).

3. אלגוריתם ה-22-קירוב ל-VC\mathrm{VC} (שיעור 13, משפט 1). כל עוד יש קשת e=xye=xy בגרף — מכניסים את שני קצותיה ל-CC, מוסיפים את ee ל-FF, ומוחקים את x,yx,y ואת כל הקשתות הנוגעות בהם. הניתוח: FF היא קבוצת קשתות זרות בזוגות, ולכן ∣F∣≤∣Copt∣|F|\le|C_{\mathrm{opt}}|; וכן ∣C∣=2∣F∣|C|=2|F|; ומכאן ∣C∣≤2∣Copt∣|C|\le 2|C_{\mathrm{opt}}|. תרגיל 4(ב) כאן הוא בדיוק ההכללה של האלגוריתם הזה.

4. אלגוריתם ה-12\tfrac12-קירוב ל-MAXCUT\mathrm{MAXCUT} (שיעור 13, משפט 3; ובגרסה חמדנית שיעור 14, משפט 1). לשני האלגוריתמים אותה הבטחה: הם רצים בזמן פולינומי, מחזירים U⊆VU\subseteq V, וגודל החתך המושרה מקיים ∣F∣  ≥  12∣E∣  ≥  12 OPT.|F|\;\ge\;\tfrac12|E| \;\ge\;\tfrac12\,\mathrm{OPT}. ההוכחה של שיעור 13 מסתמכת על cut(v)+other(v)=deg⁡(v)\mathrm{cut}(v)+\mathrm{other}(v)=\deg(v) ועל ∑vdeg⁡(v)=2∣E∣\sum_v \deg(v)=2|E| — שני הדברים נכונים גם במולטיגרף, ולכן האלגוריתם תקף גם על גרפים עם קשתות מקבילות. זה יהיה קריטי בתרגיל 5.

5. PARTITION\mathrm{PARTITION} ו-BIN-PACKING\mathrm{BIN\text{-}PACKING} (שיעור 12). PARTITION\mathrm{PARTITION} שואלת אם ניתן לפצל a1,…,ana_1,\dots,a_n לשני חלקים שווי-סכום; היא NP-שלמה (משפט 2 שם). BIN-PACKING\mathrm{BIN\text{-}PACKING} מקבלת a1,…,an∈(0,1]a_1,\dots,a_n\in(0,1] ומספר kk, ושואלת אם ניתן לארוז אותם ב-kk תאים בעלי קיבולת 11; היא NP-שלמה (משפט 4 שם), ונשארת NP-קשה גם כאשר k=2k=2 קבוע (משפט 5 שם).

6. תבנית אי-הקירוב (שיעור 13, משפט 4). ההוכחה ש"קירוב בכל יחס קבוע ל-TSP\mathrm{TSP} הכללית גורר P=NP\mathrm{P}=\mathrm{NP}" היא בדיוק התבנית של תרגיל 7: מניחים אלגוריתם קירוב, קוראים לו כתת-שגרה, ומתרגמים את ערך הפלט לתשובת כן/לא לבעיה NP-קשה. שימו לב שהאובייקט המתקבל אינו רדוקציית מיפוי אלא אלגוריתם הכרעה.

7. הטריק של "החלפת קודקוד חדש בשכן" (שיעור 19, משפט 4). ברדוקציה VC≤pDS\mathrm{VC}\le_p\mathrm{DS} הוספנו לכל קשת xyxy קודקוד חדש vxyv_{xy}, ובכיוון ההפוך היינו צריכים להחליף כל קודקוד חדש בקבוצה בקודקוד ישן. תרגיל 4(א) משתמש באותו טריק בדיוק — המרצה קישר בין השניים ב-[00:34:33].

8. כיוון הרדוקציה — בעברית. A≤pBA\le_p B פירושו: קיימת פונקציה ff הניתנת לחישוב בזמן פולינומי כך ש-x∈A  ⟺  f(x)∈Bx\in A \iff f(x)\in B. במילים: BB היא הבעיה הקשה לפחות כמו AA — אלגוריתם יעיל ל-BB היה נותן אלגוריתם יעיל ל-AA. בקובץ הזה נוכיח VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC}, כלומר 3H-VC\mathrm{3H\text{-}VC} היא הקשה מבין השתיים.

הגדרות

הגדרה 1: תת-גרף חסר מעגלים ובעיית האופטימיזציה שלו

יהי G=(V,E)G=(V,E) גרף מכוון. תת-קבוצת קשתות E′⊆EE'\subseteq E נקראת חסרת מעגלים אם הגרף G′=(V,E′)G'=(V,E') אינו מכיל מעגל מכוון.

קלט: גרף מכוון G=(V,E)G=(V,E). פתרונות אפשריים: כל E′⊆EE'\subseteq E שעבורה (V,E′)(V,E') חסר מעגלים. ערך: ∣E′∣|E'|. מטרה: מקסימיזציה.

אינטואיציה. מבקשים "לשבור" את כל המעגלים של הגרף בזריקת מספר מינימלי של קשתות — או, שקול, לשמור מספר מקסימלי של קשתות. הקבוצה הריקה היא תמיד פתרון אפשרי (גרף בלי קשתות בוודאי חסר מעגלים), ולכן שאלת המקסימום היא השאלה המעניינת.

מופע. על V={1,2,3}V=\{1,2,3\} עם E={(1,2),(2,3),(3,1)}E=\{(1,2),(2,3),(3,1)\} — מעגל מכוון יחיד — כל תת-קבוצה של שתי קשתות היא פתרון אפשרי, ו-EE עצמה אינה. לכן OPT=2\mathrm{OPT}=2.

אי-מופע. E′=EE'=E בדוגמה שלמעלה אינו פתרון אפשרי, אף שהוא הגדול ביותר. זו בדיוק הנקודה שבה נופלים: פתרון גדול שאינו פיזבילי אינו פתרון.

הגדרה 2: היפרגרף 3-אחיד וכיסוי קודקודים בו

היפרגרף 3-אחיד הוא זוג H=(V,E)H=(V,E) שבו VV קבוצת קודקודים ו-EE הוא אוסף של תת-קבוצות של VV בגודל 33 כל אחת. כל תת-קבוצה כזו נקראת היפר-קשת.

כיסוי קודקודים של HH הוא קבוצה S⊆VS\subseteq V המקיימת ∀e∈E:e∩S≠∅.\forall e\in E:\quad e\cap S\ne\emptyset .

השפה: 3H-VC={⟨H,k⟩  |  H a 3-uniform hypergraph, k∈N,∃ S⊆V a vertex cover of H, ∣S∣≤k}\mathrm{3H\text{-}VC}=\left\{\langle H,k\rangle \;\middle|\; \begin{array}{l} H \text{ a 3-uniform hypergraph},\ k\in\mathbb{N},\\ \exists\,S\subseteq V \text{ a vertex cover of } H,\ |S|\le k\end{array}\right\}

אינטואיציה. זו הכללה מדויקת של VC\mathrm{VC}: גרף רגיל הוא היפרגרף 22-אחיד, כי כל קשת לא מכוונת היא בדיוק קבוצה בגודל 22 של קודקודים ([00:12:40]). ההגדרה של הכיסוי לא השתנתה כלל — אותה שורה e∩S≠∅e\cap S\ne\emptyset מילה במילה. באופן כללי יותר: יש לנו אוסף תת-קבוצות, ומחפשים קבוצת איברים ה"נוגעת" בכל אחת מהן.

מופע. V={1,2,3,4,5,6}V=\{1,2,3,4,5,6\}, E={{1,2,3},{3,4,5},{4,5,6}}E=\{\{1,2,3\},\{3,4,5\},\{4,5,6\}\}. אז S={3,4}S=\{3,4\} הוא כיסוי בגודל 22: 33 בשתי ההיפר-קשתות הראשונות, 44 בשתי האחרונות.

אי-מופע. S′={1}S'=\{1\} אינו כיסוי של אותו HH: {3,4,5}∩S′=∅\{3,4,5\}\cap S'=\emptyset.

הערה על "בגודל kk" מול "בגודל לכל היותר kk" ([00:40:50]–[00:41:23]). ניסוח התרגיל אומר "קיים ב-HH כיסוי קודקודים בגודל kk". שתי הצורות שקולות כאן, כי על-קבוצה של כיסוי היא כיסוי — אם יש כיסוי בגודל j≤k≤∣V∣j\le k\le|V| אפשר תמיד להשלים אותו לגודל kk בדיוק בהוספת קודקודים שרירותיים. המרצה הדגיש שזה נכון ב-VC\mathrm{VC}, ב-IS\mathrm{IS} וב-CLIQUE\mathrm{CLIQUE} (שם מורידים איברים במקום להוסיף), אבל לא ב-MAXCUT\mathrm{MAXCUT}: שם אני בוחר קודקודים כדי לקבל קשתות, ובמספר הקשתות אין לי שליטה מדויקת. הקובץ הזה כותב את השפה עם ≤k\le k; כל ההוכחות עוברות מילה במילה גם עם "בדיוק kk".

הגדרה 3: החתך המושרה בגרף מכוון

יהי G=(V,E)G=(V,E) גרף פשוט מכוון ותהי U⊆VU\subseteq V, ונסמן Uˉ=V∖U\bar U=V\setminus U. החתך המושרה על ידי UU הוא δ(U)  =  { (u,v)∈E  ∣  u∈U, v∈Uˉ },\delta(U)\;=\;\{\,(u,v)\in E \;\mid\; u\in U,\ v\in\bar U\,\}, כלומר קבוצת הקשתות שזנבן ב-UU וראשן ב-Uˉ\bar U.

קלט: גרף פשוט מכוון G=(V,E)G=(V,E). פתרונות אפשריים: כל U⊆VU\subseteq V. ערך: ∣δ(U)∣|\delta(U)|. מטרה: מקסימיזציה.

אינטואיציה — ההבדל מהמקרה הלא מכוון. בגרף לא מכוון UU ו-Uˉ\bar U מגדירות אותו חתך. כאן זה נשבר לחלוטין: δ(U)\delta(U) סופרת רק את הקשתות שיוצאות מ-UU, ו-δ(Uˉ)\delta(\bar U) רק את אלה שנכנסות אליה. הא-סימטריה הזו היא כל מה שמייחד את התרגיל, והיא גם המקור לפקטור 12\tfrac12 הנוסף שיעלה לנו במעבר מ-12\tfrac12 ל-14\tfrac14.

מופע. V={a,b}V=\{a,b\}, E={(a,b)}E=\{(a,b)\}. אז δ({a})={(a,b)}\delta(\{a\})=\{(a,b)\} בגודל 11, ואילו δ({b})=∅\delta(\{b\})=\emptyset בגודל 00. שתי הקבוצות המשלימות זו את זו, ושני החתכים שונים לגמרי — הנה ההבדל בשורה אחת.

אי-מופע. U=∅U=\emptyset נותנת δ(∅)=∅\delta(\emptyset)=\emptyset — פתרון אפשרי לגמרי, פשוט גרוע. כמו ב-MAXCUT\mathrm{MAXCUT}, כל תת-קבוצת קודקודים היא פיזבילית, ולכן כל העבודה בתרגיל 5 היא ביחס הקירוב.

הגדרה 4: גרסת האופטימיזציה של BIN-PACKING\mathrm{BIN\text{-}PACKING}

קלט: b1,…,bn∈(0,1]b_1,\dots,b_n\in(0,1]. פתרונות אפשריים: כל פונקציה f:{1,…,n}→{1,…,m}f:\{1,\dots,n\}\to\{1,\dots,m\} (הקצאת פריטים לתאים) המקיימת ∑i: f(i)=ℓbi≤1\sum_{i:\,f(i)=\ell} b_i\le 1 לכל ℓ\ell. ערך: מספר התאים בשימוש. מטרה: מינימיזציה.

אינטואיציה. לכל תא קיבולת 11; רוצים להשתמש במספר קטן ככל האפשר. שימו לב שהערך הוא מספר שלם — עובדה שנראית טריוויאלית וששוברת את כל התרגיל השביעי לטובתנו.

מופע. (13,13,13,12,12)\left(\tfrac13,\tfrac13,\tfrac13,\tfrac12,\tfrac12\right) נארז בשני תאים: שלושת השלישים בתא אחד, שני החצאים בשני.

אי-מופע. (34,34,34)\left(\tfrac34,\tfrac34,\tfrac34\right) אינו נארז בשני תאים — לפי שובך היונים תא אחד יקבל שניים מהם, וסכומם 32>1\tfrac32>1.

משפטים והוכחות

בשיעור חזרה, החלק הזה קצר בכוונה: הוא מחזיק רק את התוצאות שהתרגילים נשענים עליהן, ומצביע אחורה על השיעור שבו הן הוכחו. הפתרונות המלאים הם בסעיף הבא, שהוא לב הקובץ.

משפט 1: VC\mathrm{VC} היא NP-שלמה

טענה. VC\mathrm{VC} היא NP-שלמה.

מקור. שיעור 10, משפט 2: IS≤pVC\mathrm{IS}\le_p\mathrm{VC} דרך ההבחנה ש-UU היא כיסוי בקודקודים אם ורק אם V∖UV\setminus U בלתי תלויה, ובצירוף VC∈NP\mathrm{VC}\in\mathrm{NP}. אנחנו נשתמש רק ב-NP-קושי, בתרגיל 4(א). ■\blacksquare

משפט 2: PARTITION\mathrm{PARTITION} היא NP-שלמה, וכך גם BIN-PACKING\mathrm{BIN\text{-}PACKING} עם k=2k=2 קבוע

טענה. PARTITION\mathrm{PARTITION} NP-שלמה, ובעיית האריזה בשני תאים בעלי קיבולת 11 (בלי ש-kk הוא חלק מהקלט) היא NP-קשה.

מקור. שיעור 12, משפט 2 (SUBSET-SUM≤pPARTITION\mathrm{SUBSET\text{-}SUM}\le_p\mathrm{PARTITION}) ומשפט 5. הרדוקציה של משפט 4 שם שולחת את כל הקלטים לתת-המרחב שבו k=2k=2, ולכן אותה רדוקציה עצמה מוכיחה את NP-הקושי של הגרסה עם kk קבוע. אנחנו נשתמש בשתיהן בתרגיל 7 — ב-PARTITION\mathrm{PARTITION} בפתרון הכתוב, ובגרסה עם k=2k=2 בקיצור-הדרך שהמרצה הציע. ■\blacksquare

משפט 3: קיים אלגוריתם קירוב פולינומי ביחס 12\tfrac12 ל-MAXCUT\mathrm{MAXCUT}, גם במולטיגרפים

טענה. קיים אלגוריתם פולינומי המקבל גרף לא מכוון G^=(V,E^)\hat G=(V,\hat E) — אפשר עם קשתות מקבילות — ומחזיר U⊆VU\subseteq V שהחתך המושרה על ידה מקיים ∣(U,Uˉ)∣≥12∣E^∣|(U,\bar U)|\ge\tfrac12|\hat E|.

מקור והוכחה. שיעור 13, משפט 3 (חיפוש מקומי), או שיעור 14, משפט 1 (חמדני חד-מעברי). שניהם משיגים את אותה הבטחה. המרצה ציין את שניהם במפורש ב-[01:39:58] ואמר ש"האלגוריתם שראינו בשיעור" בפתרון מתייחס לכל אחד מהם.

הערה: למה זה עובד גם עם קשתות מקבילות ([01:27:23]). ההוכחה של שיעור 13 בנויה משלוש טענות: cut(v)+other(v)=deg⁡(v)\mathrm{cut}(v)+\mathrm{other}(v)=\deg(v), אופטימליות מקומית cut(v)≥other(v)\mathrm{cut}(v)\ge\mathrm{other}(v), וספירה כפולה ∑vcut(v)=2∣F∣\sum_{v}\mathrm{cut}(v)=2|F|. אף אחת מהשלוש אינה מניחה שהגרף פשוט — כולן ספירות של מופעי קשתות. לכן ההבטחה ∣(U,Uˉ)∣≥12∣E^∣|(U,\bar U)|\ge\tfrac12|\hat E| תקפה כשסופרים כל קשת מקבילה בנפרד. תרגיל 5 חייב את התכונה הזו. ■\blacksquare

משפט 4: VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC}, ולכן 3H-VC\mathrm{3H\text{-}VC} היא NP-קשה

זהו תרגיל 4(א). הניסוח והוכחתו המלאה נמצאים בדוגמאות ותרגילים, סעיף "תרגיל 4(א)", כי שם מקומו: זו שאלת תרגיל בית שנפתרה על הלוח.

משפט 5: ההשלמה — 3H-VC∈NP\mathrm{3H\text{-}VC}\in\mathrm{NP}

טענה. 3H-VC∈NP\mathrm{3H\text{-}VC}\in\mathrm{NP}, ולכן יחד עם משפט 4 היא NP-שלמה.

הוכחה. התרגיל ביקש רק NP-קושי, וההשלמה קלה. ה-certificate הוא הקבוצה S⊆VS\subseteq V עצמה; אורכה לכל היותר ∣V∣|V| שמות קודקודים ולכן פולינומי בגודל הקלט. המאמת בודק שני דברים: ש-∣S∣≤k|S|\le k, ושלכל e∈Ee\in E מתקיים e∩S≠∅e\cap S\ne\emptyset. הבדיקה השנייה היא מעבר יחיד על EE, ולכל היפר-קשת בדיקה של שלושה קודקודים מול SS — סך הכול O(∣E∣⋅∣S∣)O(|E|\cdot|S|), פולינומי. לפי ההגדרה של NP\mathrm{NP} דרך מאמת (שיעור 6), 3H-VC∈NP\mathrm{3H\text{-}VC}\in\mathrm{NP}. ■\blacksquare

הערה: ההשלמה הזו לא נאמרה בהרצאה — התרגיל ביקש NP-קושי בלבד. היא נוספה כאן כי במבחן ניסוח מסוג "הוכיחו כי הבעיה NP-שלמה" הוא נפוץ לפחות כמו "NP-קשה", וההבדל הוא בדיוק השורה הזו.

דוגמאות ותרגילים מהשיעור

זהו לב הקובץ. ארבעת התרגילים לפי מספורם במקור.


תרגיל 3: תת-גרף מקסימלי חסר מעגלים

הניסוח (כפי שנמסר)

(א) יהי G=(V,E)G=(V,E) גרף מכוון עבורו V={1,2,…,n}V=\{1,2,\dots,n\}. נסמן ב-E1E_1 את קבוצת הקשתות ב-GG אשר מכוונות ממספר טבעי למספר טבעי גדול ממנו, כלומר E1={(i,j)∈E∣i<j},E_1=\{(i,j)\in E \mid i<j\}, ונסמן ב-G1=(V,E1)G_1=(V,E_1) את תת-הגרף המתאים של GG. נסמן ב-E2E_2 את קבוצת הקשתות ב-GG אשר מכוונות ממספר טבעי למספר טבעי קטן ממנו, כלומר E2={(i,j)∈E∣i>j},E_2=\{(i,j)\in E \mid i>j\}, ונסמן ב-G2=(V,E2)G_2=(V,E_2) את תת-הגרף המתאים של GG. הראו שהגרפים G1,G2G_1,G_2 חסרי מעגלים (מכוונים).

(ב) נגדיר את בעיית האופטימיזציה הבאה:

קלט: גרף מכוון G=(V,E)G=(V,E). מטרה: למצוא קבוצת קשתות E′⊆EE'\subseteq E גדולה ככל האפשר, כך שהגרף G′=(V,E′)G'=(V,E') חסר מעגלים.

הציעו אלגוריתם עם זמן ריצה פולינומי אשר משיג יחס קירוב 12\tfrac12 לבעיה. היעזרו בסעיף הקודם.

פתרון (א)

הערה מתודית ([00:01:34]). סעיף (א) הוא טענה קומבינטורית, לא אלגוריתמית. אנחנו לא מציעים אלגוריתם למצוא את E1E_1 — אנחנו מגדירים אותה ומוכיחים עליה תכונה. ההבחנה הזו חשובה, ובסעיף (ב) נעבור בדיוק לצד השני.

נוכיח ש-G1G_1 חסר מעגלים; ההוכחה ל-G2G_2 סימטרית.

נניח בשלילה שקיים ב-G1G_1 מעגל מכוון v1→v2→⋯→vk→v1,k≥2,v_1\to v_2\to\cdots\to v_k\to v_1,\qquad k\ge 2, כלומר (v1,v2),(v2,v3),…,(vk−1,vk),(vk,v1)∈E1(v_1,v_2),(v_2,v_3),\dots,(v_{k-1},v_k),(v_k,v_1)\in E_1.

לפי הגדרת E1E_1, כל קשת (i,j)∈E1(i,j)\in E_1 מקיימת i<ji<j. נפעיל זאת על כל קשתות המעגל בזו אחר זו: v1<v2<v3<⋯<vk.v_1<v_2<v_3<\cdots<v_k . מהקשת האחרונה (vk,v1)∈E1(v_k,v_1)\in E_1 נקבל גם vk<v1v_k<v_1. משרשור שני הדברים: v1<v2<⋯<vk<v1,v_1<v_2<\cdots<v_k<v_1, ומיחס הסדר החזק על הטבעיים נובע v1<v1v_1<v_1 — סתירה.

לכן ב-G1G_1 אין מעגל מכוון. באופן סימטרי, כל קשת ב-E2E_2 מקיימת i>ji>j, מעגל היה נותן v1>v2>⋯>vk>v1v_1>v_2>\cdots>v_k>v_1 ולכן v1>v1v_1>v_1, סתירה; ולכן גם G2G_2 חסר מעגלים. ■\blacksquare

על המקרה k=1k=1 (לולאה עצמית) ([00:03:21]). המרצה הזכיר את הקונבנציה: אם לא נאמר אחרת, הגרף פשוט; "מכוון" אינו מבטל את "פשוט". לכן אין לולאות (i,i)(i,i). אבל למעשה אין בכך צורך: לולאה (i,i)(i,i) אינה מקיימת i<ii<i ואינה מקיימת i>ii>i, ולכן אינה שייכת לא ל-E1E_1 ולא ל-E2E_2. הטענה נכונה גם אם מרשים לולאות ב-GG.

הבחנה שנשתמש בה בסעיף (ב). בגרף פשוט מכוון כל קשת (i,j)(i,j) מקיימת i≠ji\ne j, ולכן בדיוק אחד משני התנאים i<ji<j, i>ji>j מתקיים. מכאן E=E1 ∪˙ E2,E=E_1\,\dot\cup\,E_2,

ולכן

∣E1∣+∣E2∣=∣E∣.|E_1|+|E_2|=|E| .

פתרון (ב) — האלגוריתם

קלט: גרף מכוון G=(V,E)G=(V,E) כאשר V={1,2,…,n}V=\{1,2,\dots,n\}.

  1. E1←∅E_1\leftarrow\emptyset, E2←∅E_2\leftarrow\emptyset.
  2. לכל קשת e=(i,j)∈Ee=(i,j)\in E:
    • אם i<ji<j — הכנס את ee ל-E1E_1;
    • אחרת — הכנס את ee ל-E2E_2.
  3. אם ∣E1∣≥∣E2∣|E_1|\ge|E_2| — החזר את E1E_1; אחרת — החזר את E2E_2.

שלושה דברים צריך להוכיח, תמיד ([00:04:56]–[00:06:00]): זמן ריצה פולינומי, פיזביליות הפלט, ויחס הקירוב.

(1) ניתוח זמן ריצה

שלב 1 לוקח זמן קבוע. מספר האיטרציות של הלולאה בשלב 2 הוא בדיוק ∣E∣|E|, ובכל איטרציה מבצעים השוואה יחידה בין שני מספרים והוספה לקבוצה — זמן קבוע. שלב 3 הוא השוואה יחידה בין שני גדלים שנצברו תוך כדי. סך הכול O(∣E∣)=O(∣G∣)O(|E|)=O(|G|), פולינומי בגודל הקלט. ■\blacksquare

(2) פיזביליות

נסמן ב-E′E' את הקבוצה שהאלגוריתם מחזיר. לפי שלב 3, E′∈{E1,E2}E'\in\{E_1,E_2\}, ולפי בניית שלב 2 אלה בדיוק הקבוצות מסעיף (א). לפי סעיף (א) שני הגרפים (V,E1)(V,E_1) ו-(V,E2)(V,E_2) חסרי מעגלים, ולכן בכל מקרה (V,E′)(V,E') חסר מעגלים — כלומר E′E' הוא פתרון אפשרי לבעיה. ■\blacksquare

זה השלב שנשכח ([00:04:24]). התשובה הראשונה בכיתה לשאלה "מה הקבוצה שאני מחזיר צריכה לקיים?" הייתה "לפחות חצי". המרצה עצר: קודם כול היא צריכה להיות פתרון אפשרי, ואת זה צריך גם להוכיח.

(3) יחס הקירוב

יהי G=(V,E)G=(V,E) ונסמן ב-E^\hat E פתרון אופטימלי לבעיה על GG, כלומר קבוצת קשתות חסרת מעגלים בגודל מקסימלי.

לפי ההבחנה בסוף סעיף (א), ∣E1∣+∣E2∣=∣E∣|E_1|+|E_2|=|E|. שני מספרים אי-שליליים שסכומם ∣E∣|E| — לפחות אחד מהם גדול או שווה למחצית הסכום: ∣E1∣≥12∣E∣|E_1|\ge\tfrac12|E|

או

∣E2∣≥12∣E∣.|E_2|\ge\tfrac12|E| . האלגוריתם מחזיר את הגדולה מבין השתיים, ולכן בכל מקרה ∣E′∣=max⁡{∣E1∣,∣E2∣}  ≥  12∣E∣.|E'|=\max\{|E_1|,|E_2|\}\;\ge\;\tfrac12|E| .

מצד שני, E^⊆E\hat E\subseteq E ולכן ∣E^∣≤∣E∣|\hat E|\le|E| — זהו החסם העליון על האופטימום, ובבעיית מקסימיזציה זה בדיוק מה שדרוש. משרשור: ∣E′∣  ≥  12∣E∣  ≥  12∣E^∣.|E'|\;\ge\;\tfrac12|E|\;\ge\;\tfrac12|\hat E| . ומן הצד השני ∣E′∣≤∣E^∣|E'|\le|\hat E|, כי E′E' הוא פתרון אפשרי ו-E^\hat E אופטימלי. יחד: 12∣E^∣  ≤  ∣E′∣  ≤  ∣E^∣,\tfrac12|\hat E|\;\le\;|E'|\;\le\;|\hat E| , ולפי הגדרה 3(ב) של שיעור 13 זהו אלגוריתם קירוב ביחס 12\tfrac12 לבעיית תת-הגרף המקסימלי חסר המעגלים. ■\blacksquare

הכלי החוזר ([00:09:44]). "יש לי שני מספרים, לפחות אחד מהם גדול-שווה לחצי מהסכום — תמיד." המרצה הוסיף מיד אזהרה: הטענה המקבילה למכפלה אינה נכונה — אי אפשר להסיק שאחד משני מספרים גדול מהשורש של המכפלה בלי הנחת אי-שליליות. הטענה הנכונה, זו שאנחנו כן משתמשים בה, נשענת על כך ששני הגדלים אי-שליליים.


תרגיל 4(א): 3H-VC\mathrm{3H\text{-}VC} היא NP-קשה

הניסוח (כפי שנמסר)

היפרגרף 3-אחיד הוא זוג H=(V,E)H=(V,E) כאשר VV קבוצת קודקודים ו-EE אוסף של תת-קבוצות של VV בגודל 33 כל אחת. כל תת-קבוצה כזו נקראת היפר-קשת (בעצם ניתן לחשוב על גרף רגיל כעל היפרגרף 2-אחיד, כיוון שכל קשת היא קבוצת קודקודים בגודל 22). כיסוי קודקודים של היפרגרף HH הוא קבוצה S⊆VS\subseteq V המקיימת שבכל היפר-קשת ב-EE יש קודקוד ששייך ל-SS, כלומר לכל e∈Ee\in E מתקיים e∩S≠∅e\cap S\ne\emptyset.

(א) תהא 3H-VC\mathrm{3H\text{-}VC} שפת כל הזוגות ⟨H,k⟩\langle H,k\rangle של היפרגרף 3-אחיד HH ומספר טבעי kk עבורם קיים ב-HH כיסוי קודקודים בגודל kk. הוכיחו כי הבעיה 3H-VC\mathrm{3H\text{-}VC} היא NP-קשה.

הרעיון, ולמה דווקא מ-VC\mathrm{VC}

נראה VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC} — כלומר, 3H-VC\mathrm{3H\text{-}VC} היא הבעיה הקשה מבין השתיים. הבחירה ב-VC\mathrm{VC} כבעיית המקור אינה מקרית: היא ה"בעיה הקרובה" ([00:14:49]) — ההגדרה של כיסוי קודקודים בהיפרגרף היא מילה במילה ההגדרה מ-VC\mathrm{VC}. המרצה הציג את זה כשיטת עבודה: הניחוש הראשון הוא תמיד הבעיה הדומה ביותר; אם היא לא עובדת, אז מתחילים לחשוב על אחרות.

הקושי הטכני היחיד: הפלט חייב להיות היפרגרף 3-אחיד, וקשתות של גרף רגיל הן בגודל 22. צריך "לנפח" כל קשת לגודל 33 מבלי לשנות את התשובה — ולכן מוסיפים לכל קשת קודקוד חדש משלה.

הרדוקציה (האלגוריתם RR)

קלט: גרף לא מכוון G=(V,E)G=(V,E) ומספר k∈Nk\in\mathbb{N}.

  1. V^←V\hat V\leftarrow V, E^←∅\hat E\leftarrow\emptyset.
  2. לכל e∈Ee\in E:
    • 2.1 צור קודקוד חדש vev_e (חדש, כלומר ve∉Vv_e\notin V ושונה מכל קודקוד שנוצר קודם);
    • 2.2 הוסף את vev_e ל-V^\hat V;
    • 2.3 הוסף את e∪{ve}e\cup\{v_e\} ל-E^\hat E.
  3. החזר את H=(V^,E^)H=(\hat V,\hat E) ואת אותו kk.

הפלט הוא אינסטנס חוקי. לכל e={x,y}∈Ee=\{x,y\}\in E מתקיים x≠yx\ne y (הגרף פשוט) ו-ve∉Vv_e\notin V, ולכן ∣e∪{ve}∣=3|e\cup\{v_e\}|=3 בדיוק. כל איברי E^\hat E הם תת-קבוצות של V^\hat V בגודל 33, כלומר HH הוא היפרגרף 3-אחיד. הפלט הוא זוג ⟨\langleהיפרגרף 3-אחיד, מספר טבעי⟩\rangle — בדיוק סוג הקלט של 3H-VC\mathrm{3H\text{-}VC}. ([00:15:53]: "שימו לב שאנחנו צריכים להחזיר היפרגרף — 3-אחיד".)

ניתוח זמן ריצה

יהי G=(V,E)G=(V,E) ויהי k∈Nk\in\mathbb{N}. שלב 1 לוקח זמן קבוע — הוא רק מסמן שמות ואינו מעתיק שום דבר. מספר האיטרציות בלולאה הוא בדיוק ∣E∣|E|, ובכל איטרציה מייצרים שם חדש, מוסיפים אותו לקבוצת קודקודים ומוסיפים קבוצה בת שלושה איברים לקבוצת ההיפר-קשתות — זמן קבוע (או O(log⁡)O(\log) בייצוג סביר של שמות). שלב 3 הוא כתיבת הפלט. סך הכול O(∣G∣)O(|G|), פולינומי בגודל הקלט.

גם גודל הפלט פולינומי: ∣V^∣=∣V∣+∣E∣|\hat V|=|V|+|E| ו-∣E^∣=∣E∣|\hat E|=|E|. זה נחוץ — אחרת לא היה אפשר לכתוב את הפלט בזמן פולינומי מלכתחילה.

ניתוח נכונות, כיוון ראשון: ⟨G,k⟩∈VC⇒⟨H,k⟩∈3H-VC\langle G,k\rangle\in\mathrm{VC}\Rightarrow\langle H,k\rangle\in\mathrm{3H\text{-}VC}

נניח ⟨G,k⟩∈VC\langle G,k\rangle\in\mathrm{VC}. אז קיימת U⊆VU\subseteq V כיסוי בקודקודים של GG עם ∣U∣≤k|U|\le k.

נתבונן באותה UU בדיוק. שני דברים אנחנו מקבלים מיד, ואסור לדלג עליהם ([00:26:27]):

  • U⊆V⊆V^U\subseteq V\subseteq\hat V, ולכן UU היא בכלל קבוצת קודקודים חוקית של HH — רק בזכות זה יש בכלל משמעות לשאלה אם היא כיסוי של HH;
  • ∣U∣≤k|U|\le k לא השתנה.

תהא e^∈E^\hat e\in\hat E היפר-קשת. לפי בניית שלב 2, קיימת קשת e∈Ee\in E כך ש-e^=e∪{ve}\hat e=e\cup\{v_e\} — זהו הקישור שלנו חזרה לגרף המקורי, ובלעדיו אין הוכחה ([00:28:39]: "אי אפשר להגיד 'נסמן' על משהו שאני לא יודע שהוא קיים"). מכיוון ש-UU כיסוי בקודקודים של GG ו-e∈Ee\in E, מתקיים e∩U≠∅e\cap U\ne\emptyset. ומכיוון ש-e⊆e^e\subseteq\hat e, נובע e^∩U  ⊇  e∩U  ≠  ∅.\hat e\cap U\;\supseteq\;e\cap U\;\ne\;\emptyset .

מכיוון ש-e^\hat e הייתה שרירותית, UU היא כיסוי קודקודים של HH בגודל ≤k\le k, ולכן ⟨H,k⟩∈3H-VC\langle H,k\rangle\in\mathrm{3H\text{-}VC}. ■\blacksquare

ניתוח נכונות, כיוון שני: ⟨H,k⟩∈3H-VC⇒⟨G,k⟩∈VC\langle H,k\rangle\in\mathrm{3H\text{-}VC}\Rightarrow\langle G,k\rangle\in\mathrm{VC}

נניח ⟨H,k⟩∈3H-VC\langle H,k\rangle\in\mathrm{3H\text{-}VC}. אז קיימת U^⊆V^\hat U\subseteq\hat V כיסוי קודקודים של HH עם ∣U^∣≤k|\hat U|\le k.

כאן נופלת ההוכחה הנאיבית ([00:31:54]–[00:34:33]). אי אפשר לקחת את U^\hat U כמות שהיא. U^\hat U מוכלת ב-V^\hat V, ו-V^\hat V מכילה קודקודים שאינם ב-VV; ייתכן ש-U^\hat U מכילה כאלה, ואז היא אינה תת-קבוצה של VV — ולשאלה "האם U^\hat U כיסוי בקודקודים של GG" אין אפילו משמעות. שימו לב לא-סימטריה מול הכיוון הראשון: שם קיבלנו קבוצה ב-VV, וקבוצה ב-VV היא אוטומטית קבוצה ב-V^\hat V; כאן הכיוון הפוך והוא נשבר.

נבנה קבוצה U⊆VU\subseteq V באופן הבא:

לכל v∈U^v\in\hat U:

  • אם v∈Vv\in V — הכנס את vv ל-UU;
  • אחרת, מהבנייה קיימת קשת xy∈Exy\in E כך ש-v=vxyv=v_{xy} — הכנס את xx ל-UU.

הערה על "xx" ([00:47:21]–[00:49:30]). הקשת xyxy היא קבוצה, ולכאורה אין בה "ראשון". אבל הקלט מגיע בסופו של דבר כמחרוזת, ובמחרוזת יש סדר; מה שלא מובטח לנו הוא איזה סדר. לכן "הקצה הראשון שמופיע בייצוג" הוא ביטוי חוקי לגמרי. בכל מקרה — הבחירה שרירותית והוכחה עוברת גם עם yy.

הערה: אין צורך לנתח את זמן הריצה של הבנייה הזו ([00:36:39]). היא אינה חלק מהרדוקציה; היא חלק מההוכחה. התיאור הוא אלגוריתמי רק כדי לבטא את הקבוצה בנוחות.

מיד מתקבלים שני דברים. ראשית, U⊆VU\subseteq V מהבנייה — כל איבר שהוכנס הוא או v∈Vv\in V או קצה של קשת ב-EE. שנית, ∣U∣  ≤  ∣U^∣  ≤  k.|U|\;\le\;|\hat U|\;\le\;k .

למה רק ≤\le ולא == ([00:39:16]–[00:40:20]). ההעתקה U^→U\hat U\to U אינה בהכרח חד-חד-ערכית. אם למשל xyxy ו-xwxw הן שתי קשתות ב-EE ושני הקודקודים vxy,vxwv_{xy},v_{xw} שייכים ל-U^\hat U, שניהם מתורגמים ל-xx ונספרים פעם אחת. וכן ייתכן ש-xx עצמו כבר היה ב-U^\hat U וגם vxyv_{xy} היה בה. אנחנו קיבלנו את U^\hat U "מהשמיים" ואיננו רשאים להניח עליה מינימליות. אבל ≤k\le k מספיק לנו לגמרי, כי בכיסוי בקודקודים תמיד אפשר להשלים כלפי מעלה.

נראה ש-UU כיסוי בקודקודים של GG. תהא e∈Ee\in E. אז קיימים x,y∈Vx,y\in V עם e={x,y}e=\{x,y\}, ומהבנייה {x,y,vxy}∈E^.\{x,y,v_{xy}\}\in\hat E . מכיוון ש-U^\hat U כיסוי קודקודים של HH, מתקיים {x,y,vxy}∩U^  ≠  ∅.\{x,y,v_{xy}\}\cap\hat U\;\ne\;\emptyset . נחלק לשני מקרים משלימים:

מקרה 1: x∈U^x\in\hat U או y∈U^y\in\hat U. אז לפחות אחד מהם ב-VV ושייך ל-U^\hat U, ולכן לפי הכלל הראשון של הבנייה הוא הוכנס ל-UU. כלומר x∈Ux\in U או y∈Uy\in U, ולכן e∩U≠∅e\cap U\ne\emptyset.

מקרה 2: x∉U^x\notin\hat U וגם y∉U^y\notin\hat U. מכיוון שהחיתוך אינו ריק, בהכרח vxy∈U^v_{xy}\in\hat U. vxy∉Vv_{xy}\notin V, ולכן לפי הכלל השני של הבנייה הוכנס xx ל-UU. לכן x∈Ux\in U ומכאן שוב e∩U≠∅e\cap U\ne\emptyset.

בשני המקרים e∩U≠∅e\cap U\ne\emptyset. מכיוון ש-ee הייתה שרירותית, UU היא כיסוי בקודקודים של GG בגודל ≤k\le k, ולכן ⟨G,k⟩∈VC\langle G,k\rangle\in\mathrm{VC}. ■\blacksquare

מסקנה

RR היא רדוקציה בזמן פולינומי מ-VC\mathrm{VC} ל-3H-VC\mathrm{3H\text{-}VC}, כלומר VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC}. מכיוון ש-VC\mathrm{VC} היא NP-קשה (משפט 1, שיעור 10), גם 3H-VC\mathrm{3H\text{-}VC} היא NP-קשה. ■\blacksquare

הערת כתיבה שהמרצה עצר עליה ([00:45:09]–[00:46:14]). המקרה השני נכתב בדיוק כשלילה של הראשון: "x∉U^x\notin\hat U וגם y∉U^y\notin\hat U", ולא "נניח vxy∈U^v_{xy}\in\hat U". שני הניסוחים נכונים כאן ואף אחד מהם אינו שגיאה — אבל כהרגל עבודה עדיף תמיד לחלק לשני מקרים משלימים ("עצים בינריים של מקרים"), כי אחרת קל לפספס מקרה שלישי שלא חשבתם עליו. זה עניין של הימנעות מטעויות, לא של סגנון.


תרגיל 4(ב): אלגוריתם קירוב ביחס 33 לכיסוי המינימלי בהיפרגרף 3-אחיד

הניסוח (כפי שנמסר)

(ב) נסתכל על בעיית המינימיזציה שבה הקלט הוא היפרגרף 3-אחיד HH והמטרה היא למצוא כיסוי קודקודים ב-HH קטן ככל האפשר. הוכיחו כי קיים אלגוריתם עם זמן ריצה פולינומי לבעיה אשר משיג יחס קירוב 33.

הרעיון

זהו בדיוק אלגוריתם ה-22-קירוב ל-VC\mathrm{VC} משיעור 13 (משפט 1), עם 33 במקום 22. הרעיון שלו לא השתנה כהוא זה: אוספים היפר-קשתות זרות בזוגות, משלמים על כל אחת את כל שלושת קודקודיה, ומשתמשים בקבוצת ההיפר-קשתות שנאספו כחסם תחתון על האופטימום. המרצה אמר את זה במפורש ([00:52:49]): "ראינו אלגוריתם קירוב ביחס 22 ל-VC\mathrm{VC}, אז כבר עשינו את רוב העבודה."

האלגוריתם

קלט: היפרגרף 3-אחיד H=(V,E)H=(V,E).

  1. אתחל C←∅C\leftarrow\emptyset, F←∅F\leftarrow\emptyset.
  2. כל עוד יש ב-HH היפר-קשת e={x,y,z}∈Ee=\{x,y,z\}\in E:
    • 2.1 הוסף ל-CC את x,y,zx,y,z; הוסף ל-FF את ee;
    • 2.2 מחק מ-HH את x,y,zx,y,z ואת כל ההיפר-קשתות המחוברות אליהן.
  3. החזר את CC.

הערה: FF היא "משתנה רפאים" ([00:53:50], [00:56:27]). האלגוריתם אינו זקוק ל-FF כדי לרוץ, והיא אינה משפיעה על הפלט. היא קיימת אך ורק לצורך הניתוח. המרצה ציין שברוב הספרים אין מסמנים אותה בתוך תיאור האלגוריתם אלא רק בהוכחה — שתי הדרכים תקינות.

הערה: למה מוחקים את הקודקודים ולא רק את ההיפר-קשתות ([00:57:33]). אפשר היה לכתוב "מחק את כל ההיפר-קשתות המחוברות ל-x,y,zx,y,z" ולהשאיר קודקודים מבודדים; זה שקול לחלוטין. מחיקת הקודקודים נבחרה כי היא הופכת את הזרות בזוגות של FF לגלויה לעין, וזרות זו היא לב הניתוח.

(1) ניתוח זמן ריצה

יהי H=(V,E)H=(V,E) ונריץ עליו את האלגוריתם. שלב 1 לוקח זמן קבוע.

מספר האיטרציות. בכל איטרציה נמחקת לפחות היפר-קשת אחת מהגרף — לכל הפחות ee עצמה, שהרי כל שלושת קודקודיה נמחקים. מספר ההיפר-קשתות לעולם אינו גדל, ולכן מספר האיטרציות הוא O(∣E∣)O(|E|).

עלות איטרציה בודדת. מציאת היפר-קשת ומחיקת שלושה קודקודים וכל ההיפר-קשתות הנוגעות בהם דורשות מעבר על כל הקודקודים ועל כל ההיפר-קשתות — O(∣V∣⋅∣E∣)O(|V|\cdot|E|) בחסם גס.

סך הכול O(∣H∣2)O(|H|^2), פולינומי בגודל הקלט. ■\blacksquare

הערה ([01:00:46]–[01:01:20]). אפשר לנתח הדוק בהרבה: כל היפר-קשת "נוגעים" בה לכל היותר פעם אחת לאורך כל הריצה, ולכן אפשר לסכום את העלויות לאורך האיטרציות במקום להכפיל. המרצה העדיף במכוון את החסם הגס: "כל מה שמעניין אותי זה שזה פולינומי." סטודנט גם הצביע על כך שהניתוח O(∣V∣⋅∣E∣)O(|V|\cdot|E|) לאיטרציה הוא רופף כי אפשר לעבור רק על שכני x,y,zx,y,z — המרצה אישר שגם זה נכון וגם זה מספיק.

(2) פיזביליות

יהי H=(V,E)H=(V,E), ונסמן ב-CC את הפלט. ראשית, C⊆VC\subseteq V — כל מה שהוכנס ל-CC הוא קודקוד של היפר-קשת קיימת.

תהא e∈Ee\in E היפר-קשת של הקלט המקורי. האלגוריתם עוצר רק כאשר אין יותר היפר-קשתות ב-HH, ולכן במהלך הריצה ee נמחקה. זו נקודת המוצא של כל הטיעון.

מתי נמחקת היפר-קשת? רק בשלב 2.2, וזה קורה בדיוק כאשר אחד מקודקודיה נמחק מהגרף. וקודקוד נמחק אך ורק בשלב 2.2, ובאותו רגע (שלב 2.1 של אותה איטרציה) הוא הוכנס ל-CC. לכן קיים u∈eu\in e עם u∈Cu\in C, כלומר e∩C  ≠  ∅.e\cap C\;\ne\;\emptyset .

מכיוון ש-ee הייתה שרירותית, CC היא כיסוי קודקודים של HH, ובפרט פתרון אפשרי לבעיה. ■\blacksquare

הערה: אין צורך בחלוקה למקרים ([01:06:11]–[01:07:13]). בכיתה הוצע לחלק ל"או ש-ee היא זו שנבחרה, או שנמחקה בגלל שכנה". המרצה הראה שזה מיותר: בשני המקרים הסיבה למחיקה זהה — אחד מקודקודי ee נכנס ל-CC. חלוקה למקרים שאינה נדרשת אינה שגיאה, אבל הטיעון האחיד קצר ובטוח יותר.

(3) יחס הקירוב

נסמן ב-CoptC_{\mathrm{opt}} כיסוי קודקודים מינימלי של HH, וב-FF את קבוצת ההיפר-קשתות שהאלגוריתם צבר.

שלב א: FF זרה בזוגות. יהיו e,e^∈Fe,\hat e\in F שונות, ונניח בלי הגבלת הכלליות ש-ee נבחרה קודם. באיטרציה שבה נבחרה ee נמחקו כל שלושת קודקודיה מהגרף יחד עם כל ההיפר-קשתות הנוגעות בהם. לכן e^\hat e, שנבחרה מאוחר יותר ולכן הייתה עדיין בגרף, אינה מכילה אף אחד מקודקודי ee; כלומר e∩e^=∅e\cap\hat e=\emptyset.

שלב ב: התאמה חד-חד-ערכית מ-FF ל-CoptC_{\mathrm{opt}}. תהא e∈Fe\in F. מכיוון ש-F⊆EF\subseteq E ומכיוון ש-CoptC_{\mathrm{opt}} הוא כיסוי קודקודים של HH, מתקיים e∩Copt≠∅e\cap C_{\mathrm{opt}}\ne\emptyset, כלומר קיים x∈Coptx\in C_{\mathrm{opt}} עם x∈ex\in e. נגדיר φ:F→Copt,φ(e)=some x∈e∩Copt\varphi:F\to C_{\mathrm{opt}},\qquad \varphi(e)=\text{some } x\in e\cap C_{\mathrm{opt}} (אם יש כמה — בוחרים אחד שרירותית). φ\varphi מוגדרת היטב בדיוק בזכות היות CoptC_{\mathrm{opt}} כיסוי.

φ\varphi חד-חד-ערכית: אם e≠e^e\ne\hat e ב-FF, אז לפי שלב א הן זרות; φ(e)∈e\varphi(e)\in e ו-φ(e^)∈e^\varphi(\hat e)\in\hat e, ולכן בהכרח φ(e)≠φ(e^)\varphi(e)\ne\varphi(\hat e).

קיום פונקציה חד-חד-ערכית מ-FF ל-CoptC_{\mathrm{opt}} נותן ∣F∣  ≤  ∣Copt∣.|F|\;\le\;|C_{\mathrm{opt}}| .

שלב ג: הקשר בין ∣C∣|C| ל-∣F∣|F|. בכל איטרציה מוסיפים ל-FF היפר-קשת אחת, ול-CC בדיוק שלושה קודקודים — והם חדשים, כי מיד לאחר מכן הם נמחקים מהגרף ולא יופיעו שוב באף היפר-קשת שתיבחר. לכן ∣C∣  =  3∣F∣.|C|\;=\;3|F| .

החיבור. מצד אחד CC הוא כיסוי (טענה 2) ו-CoptC_{\mathrm{opt}} מינימלי, ולכן ∣Copt∣≤∣C∣|C_{\mathrm{opt}}|\le|C|. מצד שני ∣C∣  =  3∣F∣  ≤  3∣Copt∣.|C|\;=\;3|F|\;\le\;3|C_{\mathrm{opt}}| . יחד: ∣Copt∣  ≤  ∣C∣  ≤  3∣Copt∣,|C_{\mathrm{opt}}|\;\le\;|C|\;\le\;3|C_{\mathrm{opt}}| , ולפי הגדרה 3(א) של שיעור 13 זהו אלגוריתם קירוב ביחס 33 לבעיית הכיסוי המינימלי בהיפרגרף 3-אחיד. ■\blacksquare

מאיפה בא ה-33. בדיוק מ-∣C∣=3∣F∣|C|=3|F|, כלומר מכך שהיפר-קשת מכילה שלושה קודקודים ואנחנו משלמים על כולם. באותה הוכחה בדיוק, על היפרגרף rr-אחיד, מתקבל יחס קירוב rr; המקרה r=2r=2 הוא ה-22-קירוב ל-VC\mathrm{VC} משיעור 13.

הערה: מהות מול ערך ([01:07:46]–[01:09:23]). שאלה שעלתה: האם צריך להוכיח שהפלט הוא "פתרון" מעבר לכך שהוא כיסוי? התשובה של המרצה: בכל בעיית אופטימיזציה יש מהות (מה הופך אובייקט לפתרון אפשרי) ויש ערך (מה שממקסמים או ממזערים). מזהים את הערך בקלות — הוא הדבר שעליו עושים מקסימום/מינימום; כל השאר הוא מהות. כאן הערך הוא הגודל, והמהות היא "להיות כיסוי קודקודים". ב-MAXCUT\mathrm{MAXCUT} הערך הוא גודל החתך והמהות היא רק "להיות קבוצת קודקודים", ולכן שם כל קבוצה פיזבילית — וזה בדיוק מקור הבלבול.


תרגיל 5: חתך מקסימלי בגרף מכוון — קירוב 14\tfrac14

הניסוח (כפי שנמסר)

עבור קבוצת קודקודים U⊆VU\subseteq V בגרף מכוון G=(V,E)G=(V,E), החתך המושרה על ידי UU, שיסומן δ(U)\delta(U), הוא קבוצת כל הקשתות בגרף היוצאות מ-UU, כלומר הזנב שלהן ב-UU והראש שלהן ב-Uˉ\bar U. שימו לב שבניגוד לגרף לא מכוון, החתכים המושרים על ידי UU ו-Uˉ\bar U אינם בהכרח שווים. נגדיר בעיית מקסימיזציה באופן הבא:

קלט: גרף פשוט מכוון G=(V,E)G=(V,E). מטרה: למצוא בגרף GG קבוצת קודקודים U⊆VU\subseteq V עבורה הגודל של δ(U)\delta(U) מקסימלי.

הוכיחו כי קיים אלגוריתם עם זמן ריצה פולינומי לבעיה אשר משיג יחס קירוב 14\tfrac14.

הטעות שרוב הכיתה עשתה — ולמה היא טעות

[01:19:25]–[01:21:00]. הפתרון שהוגש על ידי הרוב המוחלט היה: "לכל קודקוד באופן בלתי תלוי, בהסתברות 12\tfrac12, נכניס אותו ל-UU", ואז חישוב E[∣δ(U)∣]=14∣E∣\mathbb{E}[|\delta(U)|]=\tfrac14|E|. זה אינו אלגוריתם קירוב. אלגוריתם קירוב חייב להבטיח את היחס בכל ריצה אפשרית; הניתוח ההסתברותי מבטיח אותו רק בתוחלת, והאלגוריתם אינו דטרמיניסטי. נכון שראינו איך לדה-רנדם ניתוח כזה בשיטת התוחלות המותנות (שיעור 20, משפט 7) — אבל אז צריך לכתוב את זה. המרצה הוסיף כלל אצבע: הדבר הראשון שבודקים במדעי המחשב הוא טיפוס; ודאו שמה שאתם מחזירים הוא מהטיפוס שהתבקשתם להחזיר.

החישוב עצמו, לצורך הבנת המספרים: קשת מכוונת (u,v)(u,v) שייכת ל-δ(U)\delta(U) אם ורק אם u∈Uu\in U וגם v∉Uv\notin U, ובניסוי האחיד זה קורה בהסתברות 12⋅12=14\tfrac12\cdot\tfrac12=\tfrac14. לפי לינאריות התוחלת E[∣δ(U)∣]=14∣E∣\mathbb{E}[|\delta(U)|]=\tfrac14|E|. זו טענה נכונה ומעניינת (השוו לשיעור 19, משפט 1, שם המקרה הלא מכוון נותן 12∣E∣\tfrac12|E|) — היא פשוט אינה עונה על השאלה שנשאלה.

הצעה נוספת שנפסלה ([01:23:38]–[01:25:13]). סטודנט הציע גרסה חמדנית: להכניס כל קודקוד לצד שמגדיל את "החתך" הכי הרבה. בגרף מכוון יש עכשיו ארבעה סוגי קשתות (U→UU\to U, U→UˉU\to\bar U, Uˉ→U\bar U\to U, Uˉ→Uˉ\bar U\to\bar U), ולכן "החתך" אינו מוגדר היטב: איזה חתך מגדילים? יש שתי דרכים לתקן — או למקסם את סכום שני החתכים המכוונים, או להתעלם לגמרי מהכיוונים ולספור קשתות ללא כיוון. הכוונה של הסטודנט הייתה נכונה, אבל המרצה עמד על כך שבכתיבה חייבים לומר איזו: "אני לא חי אצלכם בראש."

האלגוריתם

קלט: גרף מכוון G=(V,E)G=(V,E).

  1. נסמן ב-G^=(V,E^)\hat G=(V,\hat E) את הגרף הלא מכוון המתקבל מ-GG על ידי מחיקת כיווני הקשתות (שומרים כל קשת בנפרד — ראו ההערה מיד).
  2. נריץ את אלגוריתם הקירוב ביחס 12\tfrac12 שראינו בשיעור לבעיית MAXCUT\mathrm{MAXCUT} על G^\hat G; נסמן ב-UU את פלט האלגוריתם.
  3. אם ∣δ(U)∣≥∣δ(Uˉ)∣|\delta(U)|\ge|\delta(\bar U)| ב-GG — החזר את UU; אחרת — החזר את Uˉ\bar U.

הערה קריטית: G^\hat G הוא מולטיגרף ([01:27:23]). GG פשוט מכוון, ולכן ייתכן שגם (u,v)∈E(u,v)\in E וגם (v,u)∈E(v,u)\in E. אחרי מחיקת הכיוונים אלה שתי קשתות מקבילות בין uu ל-vv, ואנחנו שומרים את שתיהן. זה אינו פרט טכני: אנחנו זקוקים לכך ש-∣E^∣=∣E∣|\hat E|=|E| בדיוק. אילו היינו ממזגים קשתות מקבילות, ההבטחה ∣(U,Uˉ)∣≥12∣E^∣|(U,\bar U)|\ge\tfrac12|\hat E| הייתה מדברת על מספר קטן יותר, והחסם הסופי 14∣E∣\tfrac14|E| היה נשבר. לפי משפט 3 לעיל, אלגוריתם ה-12\tfrac12-קירוב אכן עובד על מולטיגרפים.

(1) ניתוח זמן ריצה

שלב 1 הוא מעבר יחיד על EE שבו מוחקים את הכיוון מכל קשת: O(∣E∣)O(|E|).

שלב 2 רץ בזמן פולינומי בגודל G^\hat G, כי אלגוריתם הקירוב שראינו בשיעור הוא פולינומי (שיעור 13, משפט 3 — O(∣G∣2)O(|G|^2)). מכיוון ש-∣G^∣=O(∣G∣)|\hat G|=O(|G|), זהו זמן פולינומי ב-∣G∣|G|.

שלב 3 דורש חישוב של ∣δ(U)∣|\delta(U)| ושל ∣δ(Uˉ)∣|\delta(\bar U)|: מעבר יחיד על EE שבו לכל קשת (u,v)(u,v) בודקים לאיזה צד שייכים uu ו-vv ומגדילים את המונה המתאים — O(∣E∣)O(|E|), ליניארי.

סך הכול פולינומי בגודל הקלט. ■\blacksquare

[01:38:51]: את חשבון שלב 3 סטודנט הוא שהעיר שחסר, והמרצה אישר: "אתה צודק, צריך להוסיף את זה — להגיד שזה קורה בזמן ליניארי." הסיכום הכתוב מדלג על השלב הזה; כאן הוא נכתב במפורש.

(2) פיזביליות

הפלט הוא UU או Uˉ\bar U, ושתיהן תת-קבוצות של VV. מכיוון שכל תת-קבוצה של VV היא פתרון אפשרי לבעיה (הגדרה 3), הפלט אפשרי תמיד. ■\blacksquare

שימו לב שקבוצת הקודקודים לא השתנתה בשלב 1 — G^\hat G מוגדר על אותה VV — ולכן הפלט של אלגוריתם ה-MAXCUT\mathrm{MAXCUT} הוא קבוצת קודקודים חוקית גם ב-GG, ואפשר לחזור איתה לגרף המכוון ([01:27:57]).

(3) יחס הקירוב

יהי G=(V,E)G=(V,E) גרף מכוון, ויהי G^=(V,E^)\hat G=(V,\hat E) הגרף הלא מכוון (המולטיגרף) המתקבל ממנו במחיקת הכיוונים, כך ש-∣E^∣=∣E∣|\hat E|=|E|.

נסמן ב-UU את פלט אלגוריתם ה-MAXCUT\mathrm{MAXCUT} על G^\hat G, וב-(U,Uˉ)(U,\bar U) את החתך המושרה על ידי UU ב-G^\hat G (כלומר, כל הקשתות הלא מכוונות שקצה אחד שלהן ב-UU והשני ב-Uˉ\bar U). נסמן ב-δ(U),δ(Uˉ)\delta(U),\delta(\bar U) את שני החתכים המכוונים ב-GG.

שלב א — ההבטחה של אלגוריתם ה-MAXCUT\mathrm{MAXCUT}. לפי משפט 3, ∣(U,Uˉ)∣  ≥  12∣E^∣  =  12∣E∣.|(U,\bar U)|\;\ge\;\tfrac12|\hat E|\;=\;\tfrac12|E| .

שלב ב — הזהות המרכזית. תהי e^∈(U,Uˉ)\hat e\in(U,\bar U) קשת בחתך הלא מכוון, ותהי (u,v)∈E(u,v)\in E הקשת המכוונת שממנה היא נוצרה. שני קצותיה נמצאים בצדדים מנוגדים, ולכן בדיוק אחת משתי האפשרויות מתקיימת: או ש-u∈Uu\in U ו-v∈Uˉv\in\bar U, ואז (u,v)∈δ(U)(u,v)\in\delta(U); או ש-u∈Uˉu\in\bar U ו-v∈Uv\in U, ואז (u,v)∈δ(Uˉ)(u,v)\in\delta(\bar U). ולהפך, כל קשת ב-δ(U)\delta(U) או ב-δ(Uˉ)\delta(\bar U) מניבה קשת בחתך הלא מכוון. שתי הקבוצות δ(U),δ(Uˉ)\delta(U),\delta(\bar U) זרות. לכן ∣δ(U)∣+∣δ(Uˉ)∣  =  ∣(U,Uˉ)∣.|\delta(U)|+|\delta(\bar U)|\;=\;|(U,\bar U)| .

זהו בדיוק מה ש"נשבר" במעבר מגרף לא מכוון למכוון: החתך הלא מכוון מתפצל לשני חתכים מכוונים, ואנחנו מקבלים רק את אחד מהם.

שלב ג — בחירת הצד הטוב. שני מספרים אי-שליליים שסכומם ∣(U,Uˉ)∣|(U,\bar U)|; לפחות אחד מהם גדול-שווה למחצית הסכום: ∣δ(U)∣≥12∣(U,Uˉ)∣|\delta(U)|\ge\tfrac12|(U,\bar U)|

או

∣δ(Uˉ)∣≥12∣(U,Uˉ)∣.|\delta(\bar U)|\ge\tfrac12|(U,\bar U)| . שלב 3 של האלגוריתם בוחר בדיוק את הגדול מבין השניים. נסמן ב-U~\tilde U את הפלט; אז U~⊆V\tilde U\subseteq V ולכן פתרון אפשרי, ומתקיים ∣δ(U~)∣  ≥  12∣(U,Uˉ)∣  ≥  12⋅12∣E∣  =  14∣E∣.|\delta(\tilde U)|\;\ge\;\tfrac12|(U,\bar U)|\;\ge\;\tfrac12\cdot\tfrac12|E|\;=\;\tfrac14|E| .

שלב ד — השוואה לאופטימום. נסמן ב-UoptU_{\mathrm{opt}} פתרון אופטימלי. מכיוון ש-δ(Uopt)⊆E\delta(U_{\mathrm{opt}})\subseteq E, מתקיים ∣δ(Uopt)∣≤∣E∣|\delta(U_{\mathrm{opt}})|\le|E|. לכן ∣δ(U~)∣  ≥  14∣E∣  ≥  14∣δ(Uopt)∣,|\delta(\tilde U)|\;\ge\;\tfrac14|E|\;\ge\;\tfrac14|\delta(U_{\mathrm{opt}})| , ומצד שני ∣δ(U~)∣≤∣δ(Uopt)∣|\delta(\tilde U)|\le|\delta(U_{\mathrm{opt}})| כי U~\tilde U פתרון אפשרי ו-UoptU_{\mathrm{opt}} אופטימלי. יחד: 14∣δ(Uopt)∣  ≤  ∣δ(U~)∣  ≤  ∣δ(Uopt)∣,\tfrac14|\delta(U_{\mathrm{opt}})|\;\le\;|\delta(\tilde U)|\;\le\;|\delta(U_{\mathrm{opt}})| , כלומר אלגוריתם קירוב ביחס 14\tfrac14. ■\blacksquare

הרעיון בשורה אחת ([01:37:47]): לקחת אלגוריתם שאני כבר מכיר, ולעשות עליו עוד שלב אחד. כל אחד משני השלבים "עולה" פקטור 12\tfrac12, וסך הכול 14\tfrac14.

דוגמה מספרית קטנה

V={1,2,3,4}V=\{1,2,3,4\} ו-E={(1,3),(3,1),(2,4),(4,2)}E=\{(1,3),(3,1),(2,4),(4,2)\} — שני זוגות אנטי-מקבילים. אז ∣E∣=4|E|=4 ו-G^\hat G הוא מולטיגרף עם ארבע קשתות: שתיים בין 11 ל-33 ושתיים בין 22 ל-44.

נניח שאלגוריתם ה-MAXCUT\mathrm{MAXCUT} החזיר U={1,2}U=\{1,2\}. אז החתך הלא מכוון מכיל את כל ארבע הקשתות, ∣(U,Uˉ)∣=4≥12⋅4|(U,\bar U)|=4\ge\tfrac12\cdot 4 — ההבטחה מתקיימת. בגרף המכוון: δ({1,2})={(1,3),(2,4)},δ({3,4})={(3,1),(4,2)},\delta(\{1,2\})=\{(1,3),(2,4)\},\qquad \delta(\{3,4\})=\{(3,1),(4,2)\}, כלומר 2+2=4=∣(U,Uˉ)∣2+2=4=|(U,\bar U)| — הזהות של שלב ב. שלב 3 מחזיר UU (שוויון), והתוצאה ∣δ(U)∣=2≥14⋅4=1|\delta(U)|=2\ge\tfrac14\cdot 4=1.

ואילו אילו מיזגנו קשתות מקבילות היינו מקבלים E^\hat E בגודל 22, ההבטחה הייתה נותנת רק ∣(U,Uˉ)∣≥1|(U,\bar U)|\ge 1, ומכאן רק ∣δ(U~)∣≥12|\delta(\tilde U)|\ge\tfrac12 — חסם חסר תועלת. זו בדיוק הסיבה לשמור על הקשתות המקבילות.


תרגיל 7: קירוב 1.491.49 ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} גורר P=NP\mathrm{P}=\mathrm{NP}

הניסוח (כפי שנמסר)

הוכיחו כי אם קיים אלגוריתם קירוב עם יחס קירוב 1.491.49 לבעיית BIN-PACKING\mathrm{BIN\text{-}PACKING} אז P=NP\mathrm{P}=\mathrm{NP}.

איך מגיעים לרעיון

[01:43:22]–[01:43:52]. השאלה מהכיתה הייתה "איך אני אמור בכלל לזהות מה לעשות כאן?". התשובה של המרצה: ראינו משהו דומה — אי-הקירוב של בעיית הסוכן הנוסע (שיעור 13, משפט 4). התבנית: מניחים שקיים אלגוריתם קירוב, ומראים שבעזרתו אפשר להכריע בעיה NP-קשה בזמן פולינומי; מכאן P=NP\mathrm{P}=\mathrm{NP}.

[01:59:22] — שיטת החיפוש הממצה. "עוברים על כל מה שאני יודע על הבעיה ובודקים מה יעזור." מה אנחנו יודעים על BIN-PACKING\mathrm{BIN\text{-}PACKING}? (א) את הגדרתה; (ב) שקיים לה אלגוריתם קירוב ביחס 22 (First-Fit, שיעור 14) — לא יעזור, כי זו תוצאה חיובית ואנחנו מחפשים תוצאת קושי; (ג) את הרדוקציה PARTITION≤pBIN-PACKING\mathrm{PARTITION}\le_p\mathrm{BIN\text{-}PACKING} (שיעור 12). זהו — הרשימה קצרה, ולכן החיפוש הממצה יעיל כאן. (ג) הוא הכיוון.

[01:57:46] — קיצור-דרך שהמרצה הציע. אפשר לעצור צעד אחד קודם: שיעור 12, משפט 5, כבר קבע ש-BIN-PACKING\mathrm{BIN\text{-}PACKING} עם k=2k=2 קבוע היא NP-קשה. אפשר להכריע ישירות את הבעיה הזו — האלגוריתם מקבל b1,…,bn∈(0,1]b_1,\dots,b_n\in(0,1], מריץ את אלגוריתם הקירוב ומקבל אם ורק אם התוצאה 22 — ולא לחזור כל הדרך אחורה ל-PARTITION\mathrm{PARTITION}. הפתרון הכתוב בסיכום עושה את המסלול המלא, וכך גם הקובץ הזה.

[01:46:36] — "נניח", לא "נניח בשלילה". השאלה מנוסחת כ"אם... אז...". אין כאן שום דבר שמוביל לסתירה; מניחים את המקדמה ומוכיחים את המסקנה.

האלגוריתם המכריע את PARTITION\mathrm{PARTITION}

נניח שקיים אלגוריתם קירוב AA ביחס 1.491.49 לבעיית BIN-PACKING\mathrm{BIN\text{-}PACKING}. נתבונן באלגוריתם הבא:

קלט: a1,…,an∈Na_1,\dots,a_n\in\mathbb{N}.

  1. נסמן S=∑i=1naiS=\sum_{i=1}^{n}a_i.
  2. אם SS אי-זוגי, או קיים 1≤i≤n1\le i\le n כך ש-ai>S2a_i>\dfrac{S}{2} — דחה.
  3. לכל 1≤i≤n1\le i\le n נסמן bi=2aiSb_i=\dfrac{2a_i}{S}.
  4. הרץ את AA על b1,…,bnb_1,\dots,b_n. אם מספר התאים בפלט שווה 22 — קבל; אחרת — דחה.

למה שלב 2 נחוץ

זו הייתה שאלת הכיתה המרכזית ([01:53:33]–[01:55:04]), והתשובה מלמדת עיקרון כללי.

החלק "SS אי-זוגי": אם SS אי-זוגי אז S/2S/2 אינו שלם, ואף סכום חלקי של שלמים אינו יכול להשתוות לו — הקלט ודאי אינו ב-PARTITION\mathrm{PARTITION}, ולכן דחייה נכונה.

החלק "ai>S/2a_i>S/2": שתי סיבות, ושתיהן הכרחיות.

  • נכונות: אם ai>S/2a_i>S/2 אז כל צד המכיל את aia_i עובר את המחצית, ולכן הקלט ודאי אינו ב-PARTITION\mathrm{PARTITION} — דחייה נכונה.
  • חוקיות הקלט ל-AA: הקלט של BIN-PACKING\mathrm{BIN\text{-}PACKING} חייב להיות ב-(0,1](0,1]. מתקיים bi=2ai/S≤1b_i=2a_i/S\le 1 אם ורק אם ai≤S/2a_i\le S/2. ללא הבדיקה היינו שולחים ל-AA קלט לא חוקי, ואז אין לנו שום הבטחה על מה שיחזור.

הדוגמה הקונקרטית מהלוח ([01:54:03]): (a1,a2,a3)=(1,1,3)(a_1,a_2,a_3)=(1,1,3). אז S=5S=5 ו-b3=2⋅35=65>1b_3=\dfrac{2\cdot 3}{5}=\dfrac65>1 — מחוץ לתחום. ואכן (1,1,3)∉PARTITION(1,1,3)\notin\mathrm{PARTITION}.

העיקרון הכללי ([01:55:04]): "כשאתם שולחים משהו לאלגוריתם, ודאו שזה קלט חוקי לאלגוריתם. האלגוריתם אינו אמור לוודא את זה."

הערה (לא נאמרה בהרצאה): בקורס N\mathbb{N} הוא קבוצת הטבעיים החיוביים, ולכן ai≥1a_i\ge 1 ובפרט bi>0b_i>0; זה מה שמבטיח bi∈(0,1]b_i\in(0,1] ולא רק bi≤1b_i\le 1.

(1) ניתוח זמן ריצה

יהיו a1,…,an∈Na_1,\dots,a_n\in\mathbb{N}.

  • שלבים 1–2 דורשים O(n)O(n) צעדים: n−1n-1 חיבורים של מספרים באורך לכל היותר אורך הקלט, בדיקת זוגיות אחת ו-nn השוואות.
  • שלב 3 דורש O(n)O(n) צעדים. כל bib_i הוא רציונלי המיוצג כזוג שלמים — מונה 2ai2a_i ומכנה SS — ואורך כל אחד מהם פולינומי באורך הקלט.
  • שלב 4 מתבצע בזמן פולינומי בגודל הקלט מההנחה: אלגוריתם קירוב הוא מעצם הגדרתו אלגוריתם פולינומי.

סך הכול זמן ריצה פולינומי בגודל הקלט. ■\blacksquare

הערה חשובה על "גודל הקלט" ([02:02:32]–[02:03:37]). שאלה מהכיתה: כשמדובר במספרים, האם אין בעיה של ייצוג לוגריתמי? התשובה: כאן אנחנו נשארים בתוך עולם המספרים לכל אורך הדרך — הקלט מספרים, הפלט של שלב 3 מספרים — ולכן "פולינומי בגודל הקלט" מתגלגל ישירות. הזהירות נדרשת במעברים בין סוגי אובייקטים: אילו היינו בונים גרף עם SS קודקודים, גודלו היה מעריכי באורך הייצוג של SS. וכן ([02:03:37]) המעבר בין בסיס 1010 לבסיס 22 אינו מהותי — הוא משנה את האורך בפקטור קבוע log⁡10/log⁡2\log 10/\log 2.

(2) ניתוח נכונות, כיוון ראשון: אם (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION} אז האלגוריתם מקבל

נניח (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}. אז קיימת I⊆[n]I\subseteq[n] כך ש ∑i∈Iai  =  S2  =  ∑i∉Iai.\sum_{i\in I}a_i\;=\;\frac{S}{2}\;=\;\sum_{i\notin I}a_i .

שלב 2 אינו דוחה. מכיוון ש-S/2=∑i∈IaiS/2=\sum_{i\in I}a_i הוא סכום של שלמים, SS זוגי. וכן לכל i∈[n]i\in[n] מתקיים ai≤S/2a_i\le S/2, שכן aia_i נמצא באחד משני הצדדים והוא לכל היותר סכום כל אותו צד (כל האיברים חיוביים).

הפלט של שלב 3 חוקי. לכל ii מתקיים 0<bi=2ai/S≤10<b_i=2a_i/S\le 1, כלומר bi∈(0,1]b_i\in(0,1]. וכן ∑i=1nbi=2S∑i=1nai=2SS=2.\sum_{i=1}^{n}b_i=\frac{2}{S}\sum_{i=1}^n a_i=\frac{2S}{S}=2 .

האופטימום הוא בדיוק 22.

  • חסם עליון OPT≤2\mathrm{OPT}\le 2: נכניס לתא הראשון את הפריטים שאינדקסם ב-II ולשני את השאר. אז ∑i∈Ibi=2S⋅S2=1≤1,∑i∉Ibi=1≤1,\sum_{i\in I}b_i=\frac{2}{S}\cdot\frac{S}{2}=1\le 1,\qquad \sum_{i\notin I}b_i=1\le 1 , כלומר זו אריזה חוקית בשני תאים.
  • חסם תחתון OPT≥2\mathrm{OPT}\ge 2: סכום כל הפריטים הוא 2>12>1, ולכן תא יחיד אינו יכול להכיל את כולם.

לכן OPT(b1,…,bn)=2\mathrm{OPT}(b_1,\dots,b_n)=2.

מה AA מחזיר. AA הוא אלגוריתם קירוב ביחס 1.491.49 לבעיית מינימיזציה, ולכן הפלט שלו הוא אריזה אפשרית שמספר התאים בה, נסמנו ALG\mathrm{ALG}, מקיים OPT  ≤  ALG  ≤  1.49⋅OPT  =  1.49⋅2  =  2.98.\mathrm{OPT}\;\le\;\mathrm{ALG}\;\le\;1.49\cdot\mathrm{OPT}\;=\;1.49\cdot 2\;=\;2.98 . כלומר 2≤ALG≤2.982\le\mathrm{ALG}\le 2.98. אבל ALG\mathrm{ALG} הוא מספר שלם, ולכן בהכרח ALG=2\mathrm{ALG}=2.

לכן שלב 4 מקבל. ■\blacksquare

[01:49:52]: סטודנטית העירה שגם ALG=1\mathrm{ALG}=1 בלתי אפשרי — נכון, וזה בדיוק החסם התחתון OPT≥2\mathrm{OPT}\ge 2 שכתבנו. לכן התנאי "שווה 22" ו"קטן-שווה 22" שקולים כאן.

[01:48:48] — דיוק בניסוח. אילו היה אלגוריתם הקירוב מחזיר רק את הערך ולא אריזה, הניסוח המדויק של שלב 4 היה "אם המספר שחזר קטן מ-33". לפי ההגדרה שלנו אלגוריתם קירוב תמיד מחזיר פתרון אפשרי, ולכן שתי הגרסאות תקינות. אבל שווה לזכור שאפשר להגדיר אלגוריתם קירוב שמחזיר רק ערך.

(3) ניתוח נכונות, כיוון שני: אם האלגוריתם מקבל אז (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}

הסיכום הכתוב מסתפק כאן ב"(כך גם ההיפך)". המרצה השאיר את הכיוון לבית ואמר ב-[02:10:30] שהניסוח הנוח ביותר הוא דווקא הקונטרפוזיטיבי: "אם האלגוריתם קיבל, אז לא יכול להיות שזה קרה ולא יכול להיות שזה קרה" — כלומר להסיק מקבלה, במקום להתחיל מ"לא בפרטישן" ולפצל למקרים. כך נכתב כאן.

נניח שהאלגוריתם קיבל.

מסקנה א. שלב 2 לא דחה, ולכן SS זוגי ולכל ii מתקיים ai≤S/2a_i\le S/2. מכאן שכל bi∈(0,1]b_i\in(0,1] ושהקלט ל-AA חוקי, וכן ∑i=1nbi=2\sum_{i=1}^n b_i=2 כמו קודם.

מסקנה ב. שלב 4 קיבל, ולכן AA החזיר אריזה אפשרית של b1,…,bnb_1,\dots,b_n בשני תאים בדיוק. כלומר קיימת f:[n]→{1,2}f:[n]\to\{1,2\} עם ∑i: f(i)=1bi≤1,∑i: f(i)=2bi≤1.\sum_{i:\,f(i)=1}b_i\le 1,\qquad \sum_{i:\,f(i)=2}b_i\le 1 .

מסקנה ג — אין מרווח. סכום שני האגפים השמאליים הוא ∑i=1nbi=2\sum_{i=1}^n b_i=2. אילו אחד מהם היה קטן ממש מ-11, הסכום היה קטן ממש מ-22 — סתירה. לכן ∑i: f(i)=1bi  =  1  =  ∑i: f(i)=2bi.\sum_{i:\,f(i)=1}b_i\;=\;1\;=\;\sum_{i:\,f(i)=2}b_i .

זו בדיוק ה"צמידות המוחלטת" שהיא מנוע הרדוקציה של שיעור 12: מחלקים ב-S/2S/2 כדי שהסכום הכולל יהיה 22 בדיוק, ואז אריזה בשני תאים אפשרית אם ורק אם החלוקה היא 11 ו-11 במדויק.

מסקנה ד — חזרה ל-aia_i. נסמן I=f−1(1)I=f^{-1}(1). אז 1=∑i∈Ibi=2S∑i∈Iai⟹∑i∈Iai=S2,1=\sum_{i\in I}b_i=\frac{2}{S}\sum_{i\in I}a_i \quad\Longrightarrow\quad \sum_{i\in I}a_i=\frac{S}{2}, ובאופן זהה ∑i∉Iai=S/2\sum_{i\notin I}a_i=S/2. לכן (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}. ■\blacksquare

בשילוב שני הכיוונים: האלגוריתם מקבל את (a1,…,an)(a_1,\dots,a_n) אם ורק אם (a1,…,an)∈PARTITION(a_1,\dots,a_n)\in\mathrm{PARTITION}.

מסקנה

האלגוריתם שבנינו מכריע את PARTITION\mathrm{PARTITION} בזמן פולינומי, ולכן PARTITION∈P\mathrm{PARTITION}\in\mathrm{P}. לפי משפט 2 (שיעור 12), PARTITION\mathrm{PARTITION} היא NP-קשה, ולכן לכל L∈NPL\in\mathrm{NP} מתקיים L≤pPARTITIONL\le_p\mathrm{PARTITION}; הרכבת הרדוקציה הפולינומית עם האלגוריתם הפולינומי נותנת L∈PL\in\mathrm{P}. לכן NP⊆P\mathrm{NP}\subseteq\mathrm{P}, ויחד עם ההכלה הטריוויאלית P⊆NP\mathrm{P}\subseteq\mathrm{NP}: P=NP.■\mathrm{P}=\mathrm{NP}. \qquad\blacksquare

למה דווקא 1.491.49, ומה קורה ב-1.51.5

זו השאלה שסטודנטית הצביעה עליה כקושי האמיתי של התרגיל ([01:57:13]): "מה שהיה קשה זה להגיע מזה ש-1.491.49 יכול להכריע חלוקה לשני תאים."

ההוכחה השתמשה ב-1.491.49 רק בשורה אחת: ALG≤1.49⋅2=2.98<3\mathrm{ALG}\le 1.49\cdot 2=2.98<3. מכיוון ש-ALG\mathrm{ALG} שלם, זה כופה ALG≤2\mathrm{ALG}\le 2. לכן:

  • כל α<32\alpha<\tfrac32 עובד באותה הוכחה מילה במילה, כי 2α<32\alpha<3.
  • α=32\alpha=\tfrac32 בדיוק אינו עובד: אז ALG≤3\mathrm{ALG}\le 3, והאלגוריתם רשאי להחזיר 33 תאים גם על קלט שאפשר לארוז בשניים — ואיננו יכולים להסיק דבר.

זהו הסף החד המוכר: אלא אם P=NP\mathrm{P}=\mathrm{NP}, אין לבעיית BIN-PACKING\mathrm{BIN\text{-}PACKING} אלגוריתם קירוב ביחס 32−ε\tfrac32-\varepsilon לשום ε>0\varepsilon>0. שימו לב שאין בכך סתירה לאלגוריתם ה-22-קירוב First-Fit של שיעור 14 — 2>322>\tfrac32.


הערות מהשיעור

  • [00:01:34] טענה קומבינטורית מול טענה אלגוריתמית. סעיף (א) של תרגיל 3 מגדיר קבוצה ומוכיח עליה תכונה; אין בו אלגוריתם. סעיף (ב) הוא שאלה אלגוריתמית. ההבחנה הזו חוזרת בכל הקורס.

  • [00:03:21] קונבנציית "גרף פשוט". אם לא נאמר אחרת — הגרף פשוט. "מכוון" אינו מבטל את "פשוט"; גרף מכוון פשוט הוא עדיין בלי לולאות ובלי קשתות כפולות באותו כיוון.

  • [00:04:56]–[00:06:00] שלושת הדברים. על כל אלגוריתם קירוב צריך להוכיח: זמן ריצה פולינומי, שהפלט הוא פתרון אפשרי, ויחס הקירוב. "השאלה הזו לא מאוד קשה, אבל לכתוב אותה צריך להקפיד על הכול. לא לדלג."

  • [00:08:07]–[00:09:12] מה מותר בהוכחה ומה מותר לאלגוריתם. בשלב ההוכחה יש לי גישה חופשית לפתרון אופטימלי: "נסמן E^\hat E פתרון אופטימלי" הוא ביטוי חוקי, כי פתרון אופטימלי תמיד קיים בבעיות שאנחנו לומדים. לאלגוריתם אין גישה כזו — מציאת אופטימום היא בדיוק הבעיה הקשה. אותו הבדל בדיוק כמו בין "נניח x∈Lx\in L, אז קיים certificate" לבין "האלגוריתם ימצא certificate".

  • [00:09:44]–[00:10:16] הכלי של "לפחות אחד מהשניים". שני מספרים אי-שליליים — אחד מהם לפחות חצי מהסכום. תמיד. האנלוגיה למכפלה (אחד מהם לפחות שורש המכפלה) אינה נכונה ללא הנחות. השתמשנו בכלי הזה פעמיים בקובץ: בתרגיל 3 ובתרגיל 5.

  • [00:14:49] בחירת בעיית המקור לרדוקציה. "אני עושה רדוקציה מ-VC\mathrm{VC} כי זו בעיה קרובה. אם זה לא עובד אולי אתחיל לחשוב על דברים אחרים, אבל זה הניחוש הראשון שלי."

  • [00:18:02] למה מוסיפים סימונים לאלגוריתם. אפשר היה לכתוב "נוסיף את הקודקוד לגרף ונוסיף אותו לקשת" בלי לתת לו שם. זה תיאור מדויק ואפשר להריץ אותו. הסימון vev_e קיים כי בשלב ההוכחה נוח בהרבה לדבר על אובייקט שיש לו שם.

  • [00:34:33] אותו טריק כמו ב-VC≤pDS\mathrm{VC}\le_p\mathrm{DS} (שיעור 19). גם שם הוספנו לכל קשת קודקוד חדש וחיברנו אותו לשני קצותיה, וגם שם בכיוון ההפוך היינו צריכים להחליף כל קודקוד חדש בשכן שלו. "עשינו כבר את הטריק הזה."

  • [00:40:50]–[00:41:23] "בגודל kk" מול "בגודל ≤k\le k". ב-VC\mathrm{VC} אפשר תמיד להוסיף קודקודים כדי להשלים לגודל מדויק; ב-IS\mathrm{IS} וב-CLIQUE\mathrm{CLIQUE} אפשר תמיד להוריד. ב-MAXCUT\mathrm{MAXCUT} אי אפשר — שם בוחרים קודקודים ומודדים קשתות, ובמספר הקשתות אין שליטה מדויקת.

  • [00:45:09]–[00:46:14] דיסציפלינת חלוקה למקרים. תמיד לחלק לשני מקרים, והמקרה השני צריך להיות בדיוק השלילה של הראשון. "אני רוצה עצים בינריים של מקרים." זה לא עניין של סגנון — זה מה שמונע פספוס מקרה.

  • [00:48:25] יש סדר, הוא פשוט לא מובטח. על קבוצה במחשב "אין סדר" הוא ניסוח לא מדויק; הניסוח המדויק הוא "לא מובטח לי סדר". תיאורטית אפשר להיכנס לזיכרון ולקרוא את האיבר הראשון. לכן "נבחר את הקצה הראשון של הקשת" הוא ביטוי חוקי כשמדובר בהוכחה ולא באלגוריתם.

  • [00:52:15] תכתבו גם את מה שברור לכם. "אל תגידו 'זה ברור, אני אכתוב את זה כשאבין את שאר התשובה'. זו שגיאה כדרך עבודה — כי כשאני כותב את מה שברור לי, הרבה פעמים דברים אחרים מתחילים להיות ברורים."

  • [01:07:46]–[01:09:23] מהות מול ערך. הערך הוא הדבר שעליו עושים אופטימיזציה; כל השאר הוא מהות, ועליו צריך להוכיח פיזביליות. ב-MAXCUT\mathrm{MAXCUT} המהות היא רק "קבוצת קודקודים", ולכן שם הפיזביליות טריוויאלית — ובגלל זה מתבלבלים ומדלגים עליה גם במקומות שבהם היא לא טריוויאלית.

  • [01:09:55]–[01:13:33] עצה למבחן. "לעבור על החומר זה הכי חשוב מהכול: שיעורים ותרגילי בית. אם נשאר לכם זמן — קחו בחינות משנה-שנתיים אחרונות. אל תתחילו משם; זו לא נקודת התחלה טובה, זו נקודת סיום." ובהמשך: "אם אתם עושים אוברפיטינג למשהו, תעשו אוברפיטינג לחומר ולא לבחינות קודמות." המרצה ציין שלמעט משפט ההיררכיה ומשפט קוק–לוין, כל מה שהוכח בשיעור הוא "ברמת תרגיל" מבחינת הנבחנים.

  • [01:19:25]–[01:21:00] הטעות של תרגיל 5. אלגוריתם הסתברותי שמשיג את היחס בתוחלת אינו אלגוריתם קירוב. אלגוריתם קירוב חייב את ההבטחה בכל ריצה. "הדבר הראשון שבודקים במדעי המחשב הוא טיפוס: מה הקלט, מה הפלט."

  • [01:26:15] תיאור אלגוריתם. "אני לא חי אצלכם בראש." תיאור אלגוריתם צריך להיות מדויק מספיק כדי שאפשר יהיה לבצע עליו הרצה יבשה — לא ברמת קוד, אבל ברמה שבה אני יודע להריץ אותו.

  • [01:38:51] שאלת סטודנט שתפסה חור בכתיבה. בשלב 3 של תרגיל 5 צריך להשוות בין שני חתכים, וזה דורש מעבר על הקשתות; זמן הריצה של השלב הזה נשמט מהסיכום, והמרצה אישר שצריך להוסיפו ("זה קורה בזמן ליניארי").

  • [01:39:58] שני האלגוריתמים ל-MAXCUT\mathrm{MAXCUT}. בקורס ראינו שניים: חיפוש מקומי (מתחילים מפתרון ומזיזים קודקודים; שיעור 13) וחמדני (מתחילים מכל הקודקודים בחוץ ומכניסים אחד-אחד לפי איפה שהחתך גדל; שיעור 14). שניהם משיגים 12\tfrac12, ובתרגיל 5 אפשר להשתמש בכל אחד מהם.

  • [01:41:02] אקראיות אינה קורית במקרה. "אקראיות זה לא משהו שקורה בדרך אגב — זה משהו שצריך לקרות explicitly." אלגוריתם חמדני דטרמיניסטי מנותח ב-worst case, לא בתוחלת; אין מקום למילה "תוחלת" כשלא הגרלנו כלום.

  • [01:46:36] "נניח" ולא "נניח בשלילה". שאלה מהצורה "אם X אז Y" אינה מזמינה הנחה בשלילה. מתחילים ב"נניח X".

  • [01:50:22]–[01:51:26] "לא הבנתי כלום" אינו קיים. תגובה לסטודנטית שאמרה שלא הבינה כלום: "הבנת איך מריצים את האלגוריתם. מה שלא הבנת זה איך הגיעו לזה, ולמה זה נותן משהו." הכלל: לא לבטל את מה שכן יודעים. ובהמשך ([01:51:57]) — "זה בדיוק הרדוקציה שראינו בשיעור מ-PARTITION\mathrm{PARTITION} ל-BIN-PACKING\mathrm{BIN\text{-}PACKING}; זה לא המצאה מחדש, זה היה בהישג ידך."

  • [01:57:46] הקיצור דרך BIN-PACKING\mathrm{BIN\text{-}PACKING} עם k=2k=2. בשיעור 12 הודגש שלוש פעמים שהרדוקציה מוכיחה NP-קושי גם עבור k=2k=2 קבוע. אפשר להשתמש בזה ישירות ולחסוך את המסלול חזרה ל-PARTITION\mathrm{PARTITION}. "זו הבעיה NP-קשה הכי קרובה ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} שראינו."

  • [02:03:05]–[02:04:11] מתי גודל הקלט הופך למהותי. כל עוד נשארים בעולם המספרים, "פולינומי בגודל הקלט" מתגלגל. במעבר בין מספרים לגרפים (או להפך) צריך לעצור ולבדוק — גרף עם SS קודקודים הוא מעריכי באורך הייצוג של SS. ולעניין בסיסי ספירה: כל בסיס שאינו אונרי שקול, כי המעבר בין בסיס 1010 לבסיס 22 הוא פקטור קבוע.

פערים בין הסיכום להקלטה

  • מקור: הסיכום. הפער: שמונת העמודים מכילים את תרגילים 3, 4, 5 ו-7 בלבד; תרגילים 1, 2 ו-6 של אותו תרגיל בית אינם בהם. ההכרעה: ההקלטה מסבירה את היעדרו של 6 — ב-[01:41:35] המרצה דוחה אותו במפורש ("שש מאוד דומה למה שעשינו בשיעור") ועובר ישירות מ-5 ל-7. תרגילים 1–2 אינם מוזכרים בהקלטה כלל, וסביר שנפתרו במפגש קודם. הקובץ מכסה בדיוק את מה שבעמודים, ואינו מנחש.

  • מקור: ההקלטה. הפער: ההקלטה נפתחת ב-[00:00:00] באמצע פתרון סעיף (א) של תרגיל 3, בלי שום פתיחה, ואף מסכמת את הסעיף במשפט אחד ("אין כל כך מה לעשות אותה עכשיו") כאילו כבר נדון. כלומר תחילת המפגש חסרה בהקלטה. בפרט, שני הנושאים שנדחו בסוף המפגש הקודם — סעיף ד של שאלה 3 במטלה 2 (המחלקה C4C_4) ושאלה על רדוקציות בזמן מעריכי — אינם מופיעים בהקלטה הזו כלל; סריקת מילות מפתח על כל הקובץ לא מצאה אף אזכור שלהם. ההכרעה: לא נוסף כאן חומר שאינו בהקלטה ואינו בעמודים. החומר הדחוי אינו שייך לשיעור הזה, ויש לחפשו במפגש אחר.

  • מקור: ההקלטה. הפער: כל הדיון על הטעות הנפוצה בתרגיל 5 — הפתרון ההסתברותי שהוגש על ידי רוב הכיתה, ולמה ניתוח בתוחלת אינו אלגוריתם קירוב — אינו בסיכום כלל. ההכרעה: נכנס במלואו לפתרון תרגיל 5, לפני האלגוריתם, כי זה עיקר הערך של השיעור לגבי התרגיל הזה.

  • מקור: ההקלטה. הפער: גם ההצעה החמדנית שנפסלה ([01:23:38]) — "להכניס כל קודקוד לצד שמגדיל את החתך" — ולמה היא לא מוגדרת היטב בגרף מכוון, אינה בסיכום. ההכרעה: נכנסה כהערה בתרגיל 5.

  • מקור: הסיכום, עמוד 6. הפער: נכתב ישירות ∣(U,Uˉ)∣≥12∣E∣|(U,\bar U)|\ge\tfrac12|E|, בלי להסביר למה מותר להחליף את ∣E^∣|\hat E| ב-∣E∣|E|. ההכרעה: הצעד תקף רק אם שומרים קשתות מקבילות ב-G^\hat G, כך ש-∣E^∣=∣E∣|\hat E|=|E|; ההקלטה נוגעת בכך ב-[01:27:23] ("יכולות להיות פתאום קשתות מקבילות... ראינו את MAXCUT\mathrm{MAXCUT} כשהגרף לא פשוט"). הפירוט נכתב כאן במפורש, כולל דוגמה נומרית שמראה שמיזוג קשתות שובר את החסם.

  • מקור: הסיכום, עמוד 6. הפער: ניתוח זמן הריצה אינו כולל את שלב 3 (חישוב שני החתכים). ההכרעה: נוסף כאן, לפי [01:38:51] שבו סטודנט העלה את זה והמרצה אישר.

  • מקור: הסיכום, עמוד 7. הפער: נכתב "האלגוריתם יחזיר חלוקה שבה פחות או יותר מ-2.982.98 תאים" — ניסוח שאינו נכון מתמטית; אלגוריתם קירוב אינו יכול להחזיר יותר מ-α⋅OPT\alpha\cdot\mathrm{OPT}. ההכרעה: ההקלטה אומרת בבירור ב-[02:09:26] "לכל היותר 2.982.98", וכך נכתב כאן. מדובר בהשמטת מילה בסיכום, לא בטעות מתמטית.

  • מקור: הסיכום, עמוד 8. הפער: הכיוון השני של תרגיל 7 מסוכם בסוגריים אחת בלבד. ההכרעה: נכתב כאן במלואו, בניסוח הקונטרפוזיטיבי שהמרצה המליץ עליו ב-[02:10:30] (מניחים שהאלגוריתם קיבל ומסיקים).

  • מקור: הסיכום, עמוד 2. הפער: ניסוח התרגיל משתמש ב-SS עבור כיסוי הקודקודים בהיפרגרף, בעוד הפתרון בכתב יד משתמש ב-UU. ההכרעה: זהו שינוי סימון מכוון שנדון בכיתה ב-[00:25:23]; ההגדרה בקובץ שומרת על SS והפתרון על UU ו-U^\hat U, כמו במקור.

  • מקור: הסיכום, עמוד 3. הפער: נכתב "לכן UU כיסוי בקודקודים בגודל קטן או שווה ל-kk", בעוד שהגדרת השפה בעמוד 2 אומרת "בגודל kk". ההכרעה: אין כאן סתירה — שתי הצורות שקולות (על-קבוצה של כיסוי היא כיסוי), וההקלטה עוסקת בכך במפורש ב-[00:40:50]. הקובץ מגדיר את השפה עם ≤k\le k ומוסיף הערה.

  • מקור: הסיכום, עמוד 5. הפער: נכתב "∣C∣=3∣F∣|C|=3|F|" ו-"∣F∣≤∣Copt∣|F|\le|C_{\mathrm{opt}}|" בלי לפרט מדוע ההתאמה חד-חד-ערכית ומדוע שלושת הקודקודים חדשים. ההכרעה: ההקלטה ([01:15:07]–[01:16:42]) מפרטת; ההוכחה נכתבה כאן במלואה בשני שלבים נפרדים.

  • מקור: קונבנציות. הפער: §2a של המפרט קובע תיקון של רביעיית המכונה. ההכרעה: בשיעור הזה אין ולו מכונת טיורינג אחת — כל התוכן הוא אלגוריתמי קירוב ורדוקציה בין שפות — ולכן הכלל אינו חל. שמות מחלקות ובעיות נכתבו ב-⋅\mathrm{\cdot} לפי המפרט; שמות המשתנים (V^,E^,U^,Copt,δ(U),(U,Uˉ)\hat V,\hat E,\hat U,C_{\mathrm{opt}},\delta(U),(U,\bar U)) נשמרו בדיוק כפי שהם בסיכום.

  • מקור: פרטיות. הפער: אין. ההכרעה: לא נמצאו בעמודים מספרי זהות, שמות סטודנטים או פרטים מזהים אחרים. בהקלטה נזכרים שמות פרטיים של סטודנטים בכיתה; הם הושמטו, ושאלות הסטודנטים מובאות כאן ללא ייחוס אישי.

סיכום ונקודות למבחן

זהו שיעור חזרה, ולכן הסעיף הזה חשוב במיוחד.

התבנית שחוזרת בכל שלושת אלגוריתמי הקירוב

לכל אלגוריתם קירוב שלושה דברים, בסדר הזה:

  1. זמן ריצה פולינומי — מספר איטרציות ×\times עלות איטרציה. חסם גס מספיק, ובלבד שהוא נכון.
  2. פיזביליות — הפלט הוא פתרון אפשרי לבעיה. זהו השלב הנשכח.
  3. יחס הקירוב — שני אי-שוויונות, שאחד מהם טריוויאלי ונובע מ-(2).

והטכניקה בשלב (3) היא תמיד אותה טכניקה: האלגוריתם אינו יכול לחשב את OPT\mathrm{OPT}, ולכן בונים גודל עזר שהאלגוריתם שולט בו, מוכיחים שהוא חוסם את OPT\mathrm{OPT} מהצד הנכון, ומשווים אליו את הפלט.

תרגילגודל העזרהכיוון
3 (תת-גרף חסר מעגלים, מקסימיזציה)∥E∥\|E\|חוסם את OPT\mathrm{OPT} מלמעלה
4(ב) (כיסוי בהיפרגרף, מינימיזציה)∥F∥\|F\| (היפר-קשתות זרות בזוגות)חוסם את OPT\mathrm{OPT} מלמטה
5 (חתך מכוון, מקסימיזציה)∥E∥\|E\|חוסם את OPT\mathrm{OPT} מלמעלה

התוצאות שכדאי לזכור

  • E=E1∪˙E2E=E_1\dot\cup E_2 לפי כיוון האינדקסים, ושתי הקבוצות חסרות מעגלים — ולכן קירוב 12\tfrac12 לתת-הגרף המקסימלי חסר המעגלים.
  • VC≤p3H-VC\mathrm{VC}\le_p\mathrm{3H\text{-}VC} בהוספת קודקוד חדש לכל קשת. אותו טריק כמו VC≤pDS\mathrm{VC}\le_p\mathrm{DS}.
  • אלגוריתם ה"היפר-קשתות הזרות" נותן קירוב rr להיפרגרף rr-אחיד; r=2r=2 הוא ה-VC\mathrm{VC} המוכר, r=3r=3 הוא התרגיל.
  • ∣δ(U)∣+∣δ(Uˉ)∣=∣(U,Uˉ)∣|\delta(U)|+|\delta(\bar U)|=|(U,\bar U)| — הזהות שמתרגמת חתך לא מכוון לשני חתכים מכוונים, והמקור לפקטור 14\tfrac14.
  • אם קיים אלגוריתם קירוב ביחס α<32\alpha<\tfrac32 ל-BIN-PACKING\mathrm{BIN\text{-}PACKING} אז P=NP\mathrm{P}=\mathrm{NP}. הסף חד בגלל שלמות מספר התאים.

המלכודות הסטנדרטיות

  1. לשכוח את הפיזביליות. במיוחד בבעיות שבהן היא נראית טריוויאלית — ואז שוכחים אותה גם במקום שבו היא לא.
  2. ניתוח בתוחלת במקום אלגוריתם קירוב. אם הרצתם ניסוי אקראי, יש לכם טענה קיומית או אלגוריתם הסתברותי — לא אלגוריתם קירוב. כדי לקבל אלגוריתם קירוב צריך לדה-רנדם (שיעור 20), ולכתוב את זה.
  3. לקחת קבוצה מהצד הקשה של הרדוקציה כמו שהיא. ב-3H-VC\mathrm{3H\text{-}VC} הקבוצה U^\hat U אינה בהכרח מוכלת ב-VV, ולכן השאלה "האם היא כיסוי של GG" אפילו לא מוגדרת. תמיד לבדוק לאיזו קבוצה שייך האובייקט שבידיכם.
  4. לשלוח לאלגוריתם קלט לא חוקי. אם קוראים לאלגוריתם כתת-שגרה, האחריות לחוקיות הקלט היא שלכם. זו כל הסיבה לשלב 2 בתרגיל 7.
  5. לאבד את ∣E^∣=∣E∣|\hat E|=|E| במחיקת כיוונים. מיזוג קשתות אנטי-מקבילות שובר את החסם.
  6. לכתוב "יותר מ-" במקום "לכל היותר". אלגוריתם קירוב חוסם את הפלט מלמעלה ביחס ל-α⋅OPT\alpha\cdot\mathrm{OPT} ומלמטה ב-OPT\mathrm{OPT}.

רשימת יכולות אחרי השיעור

אחרי השיעור הזה צריך לדעת:

  • להוכיח שגרף מכוון שכל קשתותיו מונוטוניות באינדקסים הוא חסר מעגלים, ולבנות ממנה אלגוריתם קירוב 12\tfrac12.
  • לבנות רדוקציה מ-VC\mathrm{VC} לבעיה על היפרגרפים, כולל הטיפול בכיוון ההפוך שבו יש להחליף קודקודים חדשים בישנים.
  • להכליל את אלגוריתם ה-22-קירוב ל-VC\mathrm{VC} לכל rr, ולנתח אותו במלואו.
  • להשתמש באלגוריתם קיים כתת-שגרה ולהוסיף עליו שלב יחיד, כולל חשבון מלא של מה שהשלב הנוסף עולה ביחס הקירוב.
  • להוכיח תוצאת אי-קירוב מותנית בתבנית "מניחים אלגוריתם קירוב ⇒\Rightarrow מכריעים בעיה NP-קשה ⇒\Rightarrow P=NP\mathrm{P}=\mathrm{NP}", כולל זיהוי הבעיה ה-NP-קשה הנכונה להתחיל ממנה.
  • לדעת מתי "בגודל kk" ו"בגודל ≤k\le k" שקולים ומתי לא.

שאלות שנשארו פתוחות

  • הכותרת הירוקה בראש עמוד 1 נקראה כ"תרגיל מספר 3", כלומר תרגיל בית 3; שאלות 1, 2 ו-6 של אותו תרגיל בית אינן מופיעות בשמונת העמודים.
  • עמוד 1 בסיכום, שורת זמן הריצה: הסימן שאחרי $O(|E|)$ נקרא בקושי ופורש כאן כ-$O(|G|)$, כלומר פולינומי בגודל הקלט.
  • עמוד 4 בסיכום, שלב 2 של האלגוריתם: הסימן בין $e$ ל-$xyz$ אינו חד-משמעי; נקרא כאן כ-$e=\{x,y,z\}\in E$, וזו גם הגרסה שנאמרה בהקלטה ב-[00:54:53].
  • עמוד 8 בסיכום: המילים בסוגריים אחרי סיום הכיוון הראשון נקראו כ"(כך גם ההיפך)"; הכיוון השני נכתב כאן במלואו לפי ההקלטה ב-[02:10:30].
  • ההקלטה נפתחת באמצע פתרון תרגיל 3(א) ואין בה פתיחה; החומר שנדחה מהמפגש הקודם (המחלקה $C_4$ ורדוקציות בזמן מעריכי) אינו מופיע בה כלל, ולכן אינו נכלל בקובץ.
  • ה-slug "exam-review-3" מתאר את מיקום השיעור בסדרת החזרות ולא את תוכנו; התוכן כולו הוא אלגוריתמי קירוב ותוצאת אי-קירוב אחת, כפי שמופיע ב-title_he.