בקצרה
- מוכיחים שהבעיה — בהינתן מספרים טבעיים ומספר יעד , האם קיימת תת-קבוצת אינדקסים שסכום איבריה בדיוק — היא NP-complete.
- החלק הקל: שייכות ל-NP, באמצעות certificate שהוא קבוצת האינדקסים עצמה.
- החלק המהותי: רדוקציה , שבה כל קודקוד וכל קשת מקבלים מספר שנבנה ספרה-ספרה: עמודה אחת לכל קשת, ועוד עמודה מובילה שסופרת קודקודים.
- לב ההוכחה הוא טיעון אי-נשאות: בכל עמודת קשת סכום הספרות של כל המספרים הוא לכל היותר , ולכן חיבור ארוך בבסיס אף פעם אינו נושא, וניתן להסיק מן הסכום מסקנה נפרדת על כל עמודה בנפרד. בלי הטיעון הזה כל ההוכחה קורסת.
- בנוסף מוכיחים בשיעור שתי תוצאות "מסביב": כל שפה ב-P ניתנת לרדוקציה לכל שפה לא-טריוויאלית (ולכן הוא כלי גס מדי מכדי להבחין בין בעיות בתוך P), ו- היא NP-complete באמצעות רדוקציה מ-.
- מבחינים בין ערך המספרים לבין אורך הייצוג שלהם: אלגוריתם התכנון הדינמי מקורס האלגוריתמים רץ בזמן , וזה אינו זמן פולינומי בגודל הקלט. זו הסיבה ש- היא NP-hard "חלשה" בלבד.
- מי שקורא רק את הסעיף הזה צריך לדעת: הרדוקציה עצמה קצרה, אבל היא נשענת על שתי נקודות עדינות (אי-נשאות, ו"בדיוק " מול "לכל היותר ") שנבחנות בדיוק בגללן.
רקע ותלויות
השיעור מניח את הדברים הבאים.
מחלקות ו-verifiers (שיעורים 7–8). היא מחלקת השפות הניתנות להכרעה בזמן פולינומי במכונת טיורינג דטרמיניסטית; היא מחלקת השפות שעבורן קיים verifier פולינומי, כלומר קיימים פולינום ומכונה הרצה בזמן פולינומי כך ש- אם ורק אם קיים באורך שעבורו מקבלת. באופן שקול, היא מחלקת השפות הנכרעות בזמן פולינומי במכונה אי-דטרמיניסטית.
רדוקציות (שיעורים 8–9). פירושו: קיימת פונקציה הניתנת לחישוב בזמן פולינומי כך שלכל מתקיים . שימו לב לכיוון: אומר ש- היא הבעיה הקשה יותר — אפשר לפתור את אם יודעים לפתור את . בהקלטה, כמו בכל דיבור חופשי, הכיוון מתהפך לעיתים קרובות; תמיד תרגמו חזרה לניסוח הפורמלי. שפה היא NP-hard אם לכל מתקיים , והיא NP-complete אם בנוסף . הכלי המרכזי: אם היא NP-hard ו-, אז גם היא NP-hard, מפני שהיחס טרנזיטיבי.
התוצאות שנשתמש בהן בפועל. משפט קוק–לוין (שיעור 9) נותן לנו את כבעיה ה-NP-complete הראשונה, ומשיעור 10 יש בידינו ש-, ו- הן NP-complete. בשיעור הזה נשתמש ישירות רק בשתי עובדות: היא NP-hard, ו- היא NP-hard.
נזכיר במלואן את שתי ההגדרות מהשיעור הקודם, כדי שלא תצטרכו לקפוץ:
- (Vertex Cover): הקלט הוא זוג כאשר גרף לא מכוון ו-. כיסוי בקודקודים הוא קבוצה כך שלכל קשת יש לפחות קצה אחד ב- (בהקלטה [00:53:37] סטודנט הציע "בדיוק אחד" והמרצה תיקן במפורש ל"לפחות אחד"; שימו לב שלפי זה עצמה היא תמיד כיסוי). מתקיים אם ורק אם קיים כיסוי בקודקודים עם .
- : הקלט הוא גרף , והשאלה היא האם קיימת פונקציה כך שאף קשת אינה מונוכרומטית, כלומר לכל מתקיים . הוא חלק משם הבעיה, לא מהקלט. הפונקציה אינה חייבת להיות על: מותר שצבע לא ינוצל כלל ([00:15:50]).
הגדרות
הגדרה 1: שפה טריוויאלית
תהי אלפבית. שפה נקראת טריוויאלית אם או . אחרת היא אינה טריוויאלית, כלומר קיימים וגם .
אינטואיציה. שפה טריוויאלית היא שפה שהתשובה עליה קבועה מראש ואינה תלויה בקלט: אפשר להכריע אותה בזמן קבוע ובמקום קבוע, בלי אפילו לקרוא את הקלט. לכן היא "קלה מדי" מכל בחינה, ובפרט אי אפשר לבצע אליה רדוקציה משפה כלשהי שאינה טריוויאלית — אין לאן לשלוח את שני סוגי הקלטים.
דוגמה. אינה טריוויאלית: הנוסחה ספיקה, והנוסחה אינה. אי-דוגמה. השפה טריוויאלית.
הגדרה 2: הבעיה SUBSET SUM
הקלט הוא סדרה של מספרים טבעיים ומספר טבעי נוסף , כולם נתונים בבסיס . השאלה:
אינטואיציה. מבקשים לבחור חלק מן המספרים כך שיפגעו בדיוק ביעד. שימו לב שמדובר בסדרה ולא בקבוצה: מותר שיופיעו חזרות, ולכן תת-הקבוצה היא של אינדקסים ולא של ערכים ([00:03:08] בהקלטה של שיעור 12, לגבי הבעיה האחות PARTITION — אותה הערה בדיוק).
דוגמה. שכן . אי-דוגמה. : כל המספרים זוגיים ולכן כל סכום חלקי זוגי.
הערת בסיס. בסיס נבחר לנוחות בלבד — הוא מאפשר לכתוב על הלוח "חיבור ארוך" ולראות את העמודות ([00:56:15]). כל בסיס נותן את אותה בעיה בדיוק, מפני שההמרה בין בסיס לבסיס משנה את אורך הייצוג בגורם קבוע . הבסיס האונרי הוא היוצא מן הכלל היחיד — ראו הגדרה 3.
הגדרה 3: ערך מספר מול אורך הייצוג שלו
עבור , הערך הוא עצמו, ואילו אורך הייצוג בבסיס הוא ספרות. הקשר ביניהם מעריכי: כדי לייצג את נחוצים ביטים.
אינטואיציה. אלגוריתם נקרא פולינומי אם זמן ריצתו פולינומי באורך הקלט, לא בערכיו. כשהקלט הוא גרף גדול ומספר קטן, ההבחנה אינה מזיקה: בבעיות כמו ו- מקבלים , ו-, כך שהגרף "בולע" את המספר ותרומתו לאורך הקלט זניחה ([00:48:18]). כשהקלט מורכב כולו ממספרים, כמו כאן, ההבחנה קריטית.
אי-דוגמה מאירה. אלגוריתם בדיקת ראשוניות הנאיבי עובר על כל המספרים עד ובודק חלוקה. מספר האיטרציות נראה פולינומי, אך אורך הקלט הוא , ולכן הוא מעריכי באורך הקלט ([00:49:19]).
המקרה האונרי. אם מייצגים מספר בבסיס (אונרי), אורך הייצוג שווה לערך. אז — ורק אז — אלגוריתם שזמנו פולינומי בערך הופך לאלגוריתם פולינומי ([00:50:25]).
משפטים והוכחות
משפט 1: כל שפה ב-P ניתנת לרדוקציה לכל שפה לא-טריוויאלית
תהיינה שפות. אם ו- אינה טריוויאלית, אז .
תזכורת מחישוביות ([00:00:32]). ראינו שם את הטענה המקבילה: אם (כריעה) ו- אינה טריוויאלית, אז . ההוכחה כאן היא אותה הוכחה בדיוק; ההבדל היחיד הוא שכאן מתחייבים גם על זמן הריצה של הרדוקציה.
הוכחה. מכיוון ש-, קיימת מכונה המכריעה את בזמן פולינומי. מכיוון ש- אינה טריוויאלית, קיים וקיים . שני המחרוזות האלה קבועות ונבחרות לפני שהמכונה רואה קלט כלשהו.
נגדיר מכונה באופן הבא. על קלט :
- הרץ את על .
- אם קיבלה את — החזר . אחרת — החזר .
נכונות. יהי .
- נניח . אז מקבלת את , ולכן .
- נניח . אז דוחה את , ולכן .
בשני המקרים , כנדרש.
זמן ריצה. שלב 1 דורש זמן פולינומי ב-, לפי הגדרת . שלב 2 הוא כתיבת אחת משתי מחרוזות קבועות. כאן ישנה נקודה עדינה שסטודנטית העלתה בהקלטה ([00:09:43]): "אבל עלולים להיות ארוכים מאוד!" — נכון, אבל אורכם אינו תלוי ב-. המכונה מחזיקה אותם "בבטן" כחלק מתיאורה, היא לא מקבלת אותם מבחוץ, והם נקבעו לפני שהוגדר . לכן, כפונקציה של , שלב 2 לוקח זמן קבוע. סך הכול רצה בזמן פולינומי בגודל הקלט, ולכן .
המשמעות ([00:02:37]–[00:04:12]). הטענה אומרת ש- היא המחלקה הקלה ביותר ביחס לרדוקציות זמן פולינומי: כל שפה לא-טריוויאלית "קשה לפחות כמו" כל שפה ב-. אבל אנחנו יודעים שגם בתוך יש דרגות קושי — למשל, ממשפט ההיררכיה לזמן (מן הפרק הראשון של הקורס) יש שפה הניתנת להכרעה בזמן ולא בזמן ליניארי. המסקנה: רדוקציות זמן פולינומי הן כלי גס מדי מכדי להבחין בין בעיות בתוך — מבחינתן כל הבעיות ב- הן אותו דבר. זהו הכלי המתאים להוכחת קושי, לא לדירוג עדין.
הערה: בהרצאה זה נאמר בקיצור; הפירוט כאן. השימוש הישיר בטענה (בשיעורי הבית, [00:12:25]) הוא להראות שמחלקה כמו אינה סגורה לרדוקציות זמן פולינומי. הנימוק: קחו לא-טריוויאלית כלשהי (למשל מתחיל ב-, שהיא אפילו ליניארית). לפי משפט ההיררכיה לזמן קיימת , ובפרט . לפי משפט 1, . אילו הייתה סגורה כלפי מטה ל-, היה נובע — סתירה.
משפט 2: היא NP-complete
שייכות ל-NP. ה-certificate הוא הצביעה עצמה, , שאורכה ביטים — פולינומי בגודל הקלט. ה-verifier עובר על כל הקשתות ובודק לכל ש-; זמן . הבדיקה מקבלת אם ורק אם קיימת צביעה חוקית, כנדרש.
NP-hardness: .
האלגוריתם. על קלט :
- בנה גרף על ידי הוספת קודקוד חדש לגרף, וחיבורו בקשת לכל הקודקודים ב-.
- החזר את .
זמן ריצה. הבנייה מוסיפה קודקוד אחד ו- קשתות, ולכן היא לינארית בגודל הקלט; בפרט פולינומית. הפלט קטן מפי שניים מן הקלט ועוד קבוע, כך שגודלו פולינומי בגודל הקלט ([00:26:10]).
נכונות. יהי גרף. נסמן ב- את הגרף המוחזר על ידי האלגוריתם בהרצתו על , וב- את הקודקוד הנוסף.
כיוון ראשון: . קיימת צביעה חוקית , כלומר אין ב- קשת מונוכרומטית. נגדיר על ידי
תהא .
- אם , אז ו-, ומכיוון ש- צביעה חוקית של נובע .
- אחרת היא קשת חדשה, ולכן או . הקודקוד צבוע ב- והשני צבוע בצבע מתוך , ולכן שוב .
כך או כך , ולכן היא צביעה חוקית של ב- צבעים, כלומר .
כיוון שני: . קיימת צביעה חוקית של . ללא הגבלת הכלליות — הצבעים סימטריים לחלוטין, ואם קיבל צבע אחר נחליף את שמות שני הצבעים. נגדיר על ידי לכל , ונראה שהטווח בפועל הוא : יהי . מכיוון שחיברנו את לכל קודקודי , מתקיים , ולכן . לכן לכל מתקיים .
כעת תהא קשת. לא הסרנו קשתות, ולכן גם , ומכיוון ש- חוקית ב- נקבל . לכן היא צביעה חוקית של ב- צבעים, כלומר .
למה הבנייה נראית כך — שני ניסיונות שנשברו.
ניסיון ראשון: הזהות ([00:16:53]–[00:18:30]). סטודנט הציע להחזיר את עצמו: הרי אם הוא -צביע אז בפרט הוא -צביע. הכיוון הראשון עובד — וזו בדיוק הסיבה לחשוד. הכיוון השני קורס: הקליק הוא -צביע (כל קודקוד בצבע משלו) ובוודאות אינו -צביע, שכן בקליק בגודל כל שני קודקודים מחוברים ולכן דרושים צבעים. אז אבל , והזהות אינה רדוקציה.
ניסיון שני: להוסיף קודקוד בלי לחבר אותו ([00:31:29]–[00:34:41]). סטודנטית שאלה למה בכלל צריך את הקשתות החדשות. גם כאן הכיוון הראשון עובר בלי שינוי. הכיוון השני נשבר בדיוק בשורה אחת: הצעד שאומר "לכל מתקיים " נשען כולו על קיום הקשת . בלי הקשתות אין שום מניעה שקודקוד ב- ייצבע ב-, והצמצום של ל- לא יהיה צביעה בשלושה צבעים.
הערה: בהרצאה נאמר על כך רק ש"ההוכחה נשברת"; שימו לב שזה אינו מוכיח שהבנייה החלופית אינה רדוקציה — היא באמת אינה, אבל כדי לטעון זאת דרושה דוגמה נגדית, ולא רק כישלון של הוכחה מסוימת. דוגמה נגדית: ללא הקשתות החדשות נותן גרף שהוא בתוספת קודקוד מבודד; הגרף הזה -צביע, ואילו אינו -צביע.
ניסיון שלישי — ולמעשה הטעות החמורה מכולן ([00:21:39]–[00:23:45]). סטודנט ניסח את אותה בנייה נכונה במילים "נוסיף קודקוד חדש ונצבע אותו בצבע רביעי", והמרצה עצר את השיעור וכינה זאת "חטא כבד". שימו לב היכן בדיוק נמצאת הטעות: הבנייה זהה, אבל הניסוח מייחס לאלגוריתם גישה לצביעה. לאלגוריתם הרדוקציה אין ולא יכולה להיות גישה לפתרון. הוא מקבל גרף ומחזיר גרף; הוא אינו מחפש צביעה, אינו מקבל אחת ואינו יודע אם קיימת. הצביעות ו- מופיעות אך ורק בהוכחת הנכונות, ששם — ורק שם — מותר להניח "קיימת צביעה חוקית". זו הסיבה שבניסוח שלמעלה שלב 1 של האלגוריתם מדבר רק על קודקודים וקשתות, ואילו הפונקציה מוגדרת רק בתוך כיוון ההוכחה. המרצה השווה זאת לרדוקציה מ-: אסור לכתוב "אם המכונה עוצרת אז נחזיר כך", מפני שאי אפשר לבדוק זאת. אותו עיקרון בדיוק חוזר במשפט 4 להלן — הרדוקציה מ- ל- בונה מספרים מהגרף ומ- בלבד, ואינה מחפשת כיסוי.
משפט 3:
הוכחה. ה-certificate הוא קבוצת האינדקסים , שאפשר לקודד ב- ביטים — פולינומי בגודל הקלט. ה-verifier מקבל ואת , מסכם ומשווה ל-. אם כל מספר תופס לכל היותר ספרות, חיבור של עד מספרים כאלה דורש פעולות, וההשוואה — כלומר זמן פולינומי באורך הקלט. ה-verifier מקבל עבור כלשהו אם ורק אם קיימת עם הסכום הנכון, כלומר אם ורק אם הקלט בשפה. באופן שקול: בוחרים את באופן אי-דטרמיניסטי ומסכמים.
הערה: המרצה הדגיש שוב ושוב שלא אומרים "מגרילים" אלא "בוחרים באופן אי-דטרמיניסטי" — הגרלה שייכת לאלגוריתמים אקראיים, ואי-דטרמיניזם הוא דבר אחר לגמרי (ההערה נאמרה במפורש בשיעור העוקב, [00:03:40] בתמליל 18, לגבי אותו טיעון בדיוק).
משפט 4 (לב השיעור): , ולכן היא NP-complete
הרעיון. נבנה מספרים שאפשר לחשוב עליהם כשורות בטבלה: עמודה מיוחדת אחת בשם , ועוד עמודה אחת לכל קשת. שורת קודקוד "מדווחת" באילו קשתות הוא נוגע; שורת קשת היא וקטור יחידה. סכום היעד דורש בדיוק בכל עמודת קשת ובדיוק בעמודה . הקסם הוא שהדרישה "בדיוק " ניתנת לסיפוק אם ורק אם לפחות אחד משני קצות הקשת נבחר.
האלגוריתם. על קלט ו-, נסמן ו-.
- אם , החלף את ב-. (הצדקה למטה.)
- לכל קודקוד נייצר מספר בן ספרות, שבו הספרה השמאלית ביותר היא , ולכל הספרה ה- משמאל היא אם ו- אחרת.
- לכל קשת נייצר מספר בן ספרות, שבו הספרה השמאלית ביותר היא , ולכל הספרה ה- משמאל היא אם ורק אם , ואחרת .
- נגדיר מספר יעד בן ספרות: הספרות השמאליות ביותר מייצגות את , וכל יתר הספרות שוות .
- החזר את רשימת המספרים ואת .
באלגברה, במקום בציור, אלה בדיוק המספרים
על צעד 0 והביטוי "בדיוק ". ההגדרה של מדברת על כיסוי בגודל לכל היותר , ואילו הבנייה כופה בעמודה סכום של בדיוק . הפער אינו מזיק, משתי סיבות: (א) הוספת קודקודים לכיסוי משאירה אותו כיסוי, ולכן אם קיים כיסוי בגודל ו-, אפשר להשלים אותו לכיסוי בגודל בדיוק ; (ב) אם אז תמיד (הקבוצה עצמה מכסה), ולכן ההחלפה אינה משנה את התשובה, שכן . צעד 0 מבוצע בזמן .
הערה: בהרצאה ובסיכום עוברים ישר ל"קיים כיסוי עם " ([01:13:18]) בלי לומר מדוע מותר; הפירוט כאן.
למה 4.1 (אי-נשאות) — הצעד שבלעדיו כלום לא עובד
תהי תת-קבוצה כלשהי של המספרים שנבנו. נסמן (ונזהה אותה עם קבוצת קודקודים), ולכל נסמן
אזי:
- לכל ;
- , וזהו בדיוק הייצוג העשרוני של הסכום בספרות — כלומר החיבור הארוך אינו נושא באף עמודת קשת;
- .
הוכחה. (1) לקשת יש בדיוק שני קצוות. לכן לכל היותר שני מספרי קודקוד נושאים בעמודה , ובנוסף בדיוק מספר קשת אחד — — נושא שם . סך כל האחדות בעמודה על פני כל המספרים שנבנו הוא לכל היותר , ובפרט זה חסם על .
(2) הזהות עצמה נובעת מפתיחת הסכום לפי ההצגה האלגברית שלמעלה וקיבוץ לפי חזקות . הטענה שזהו הייצוג העשרוני נובעת מ-(1): כל מקדם מקיים , ולכן הוא ספרה חוקית בבסיס ואין העברה לעמודה שמשמאלה. זו כל המשמעות של "אין נשאות": בסיס נבחר גדול דיו מכדי שסכום עמודה כלשהי יגלוש. (למעשה כל בסיס היה מספיק; בסיס נבחר מטעמי נוחות כתיבה בלבד.)
(3) .
למה זה קריטי. בלי (1) לא היינו רשאים "לקרוא ספרה-ספרה". אילו סכום עמודה כלשהי היה מגיע ל- או יותר, הוא היה מעביר שמאלה, וסכום כולל שנראה נכון היה יכול להתקבל מצירוף עמודות שגוי לגמרי — למשל אחדות בעמודה אחת היו "מתחזות" לספרה בעמודה שכנה. הטיעון כולו נשען על כך שאין שום קשר בין העמודות, ולכן שוויון הסכומים גורר שוויון בכל ספרה בנפרד. זה מנוסח כמסקנה הבאה.
מסקנה 4.2 (קריטריון הספרות)
בסימוני למה 4.1, מתקיים אם ורק אם וגם לכל .
הוכחה. () הצבה ישירה בזהות של למה 4.1(2).
() נסמן ו-. לפי למה 4.1(3) מתקיים , ובאותו חשבון גם . מן ההנחה, אגף ימין מקיים , ואגף שמאל הוא כפולה שלמה של ; לכן שני האגפים אפס. מכאן וגם . שני הסכומים כתובים במקדמים שכולם בין ל- (למה 4.1(1), ו-), ולכן מיחידות ההצגה בבסיס נובע לכל .
שימו לב היכן נכנס כאן הצורך לכתוב את כבלוק של ספרות ולא כספרה בודדת: מספר הקודקודים הנבחרים עשוי להיות או יותר, ואז "הספרה" השמאלית איננה ספרה. הטיעון לעיל אינו מניח דבר על — הוא רק מנצל את העובדה שכל מה שמתחת ל- אינו מגיע ל-.
הוכחת המשפט
זמן ריצה. האלגוריתם עובר לולאה אחת על הקודקודים ולולאה אחת על הקשתות, וכותב לכל אחד מהם מספר בן ספרות; בנוסף הוא כותב את . סך גודל הפלט הוא ספרות — פולינומי בגודל הקלט. בדיקת "האם " היא בייצוג רשימות שכנויות, ולכן זמן החישוב פרופורציוני לגודל הפלט. המרצה ציין שהאלגוריתם רץ למעשה בזמן ליניארי בגודל הפלט ([01:11:00]).
הערה חשובה שנאמרה רק ברמז: הערך של כל מספר שנבנה הוא בסדר גודל — מעריכי בגודל הקלט! זו אינה בעיה, מפני שהרדוקציה נדרשת לרוץ בזמן פולינומי, וכתיבת מספר כזה עולה רק ספרות. זו בדיוק ההבחנה של הגדרה 3, מן הצד השני שלה: הרדוקציה חוקית רק מפני שמותר לה לייצר מספרים בעלי ערך אדיר באורך ייצוג צנוע.
נכונות, כיוון ראשון: הפלט ב-.
נניח (לאחר צעד 0 מתקיים ). לפי הדיון על צעד 0 קיים כיסוי בקודקודים עם בדיוק. נסמן .
נסכום את המספרים ב-. בעמודה כל אחד מהם תורם , ובחרנו בדיוק קודקודים, ולכן התרומה שם היא — בדיוק כמו ב-.
כעת יהי . מכיוון ש- כיסוי, לפחות אחד מקצות שייך ל-; ומכיוון של- יש רק שני קצוות, לכל היותר שניים שייכים. לכן סכום הספרות בעמודה הוא או .
נגדיר כך: לכל שעבורו סכום העמודה יצא , נוסיף ל- את המספר המתאים לאותה קשת. המספר מוסיף בדיוק לעמודה ואפס לכל עמודה אחרת (כולל עמודת ), ולכן הוא "מתקן" מ- ל- בלי לגעת בשום מקום אחר. שימו לב שהוא אינו יכול לתקן מ- ל- — וזה מדויק: המצב לא ייתכן כאן דווקא מפני ש- כיסוי ([01:18:47]).
נקבל לכל ו-, ולפי מסקנה 4.2 סכום המספרים ב- הוא בדיוק .
נכונות, כיוון שני: הפלט ב- .
הערה: כיוון זה אינו כתוב בסיכום, ובהרצאה הוא נאמר בעל פה בלבד ([01:29:33]) עם המשפט "אתם רוצים באמת להרגיש שאתם מבינים את זה — תכתבו את זה". הנה הכתיבה.
נניח שקיימת תת-קבוצה של המספרים שנבנו שסכומה בדיוק . נסמן, כמו בלמה 4.1, (מזוהה עם קבוצת קודקודים). לפי מסקנה 4.2 מתקיים
יהי . המחובר הוא לכל היותר , שכן יש מספר אחד בלבד המתאים לקשת ולכן אפשר לבחור אותו לכל היותר פעם אחת. לכן
כלומר לכל קשת יש לפחות קצה אחד ב-, ולכן הוא כיסוי בקודקודים של . גודלו , ולכן .
מסקנה. היא NP-hard (שיעור 10), ולפי הטרנזיטיביות של נובע ש- היא NP-hard. יחד עם משפט 3 מתקבל ש- היא NP-complete.
משפט 5: אלגוריתם התכנון הדינמי אינו אלגוריתם פולינומי
בקורס האלגוריתמים ראינו אלגוריתם תכנון דינמי המכריע את בזמן (טבלה בגודל ). האלגוריתם הזה אינו פולינומי בגודל הקלט.
הוכחה. נתבונן במשפחת קלטים שבה המספרים גדולים משמעותית מכמותם: לכל מתקיים , וכן .
גודל הקלט. יש מספרים, וכל אחד מהם דורש לכל היותר ביטים. לכן אורך הקלט הוא לכל היותר ביטים.
זמן הריצה. , שכן .
ההשוואה. נסמן ב- את אורך הקלט; אז , כלומר , וזמן הריצה הוא לפחות . הפונקציה גדולה אסימפטוטית מכל פולינום ב-, ולכן זמן הריצה אינו פולינומי בגודל הקלט.
מה זה בדיוק ([00:46:11], [00:47:13]). הביטוי הוא לא בדיוק "מעריכי" — זה מעריכי בשורש של גודל הקלט — אבל הוא בוודאות אינו פולינומי. המרצה הקפיד על הניסוח הזה. אלגוריתם כזה נקרא pseudo-polynomial: פולינומי בערך המספרים ולא באורך ייצוגם.
המסקנה על הבעיה. מכאן ש- היא NP-hard חלשה (weakly NP-hard): אם היו מייצגים את המספרים בבסיס אונרי, אורך הייצוג היה שווה לערך, אלגוריתם ה- היה נעשה פולינומי, והבעיה הייתה נופלת ל-. שימו לב שזה אינו סותר את משפט 4: הרדוקציה שם מייצרת מספרים שערכם כ-, וכתיבתם בבסיס אונרי הייתה דורשת מקום מעריכי — כלומר הרדוקציה אינה רדוקציה ל- האונרית.
דוגמאות ותרגילים מהשיעור
דוגמה 1: מעקב מלא אחרי הרדוקציה
זהו בדיוק המופע שהמרצה הריץ על הלוח והופיע בעמוד 5 בסיכום.
הגרף. , ריבוע ובתוכו קודקוד המחובר ל- ול-. הקשתות ממוספרות:
כאן , , וכל מספר הוא בן ספרות.
המספרים שהאלגוריתם מייצר.
| 1 | 1 | 0 | 0 | 1 | 0 | 0 | |
| 1 | 1 | 1 | 0 | 0 | 1 | 0 | |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | |
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | |
| 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| 0 | 0 | 0 | 0 | 0 | 1 | 0 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
| 3 | 2 | 2 | 2 | 2 | 2 | 2 |
בקריאה כמספרים: , , . שורות הקשתות הן בדיוק מטריצת היחידה ([01:24:48]), ושורת קודקוד היא שורת מטריצת השכנויות קודקוד–קשת עם מוביל.
כיוון ראשון (מכיסוי לסכום). ניקח את הכיסוי , שגודלו . ואכן הוא כיסוי: מכוסה על ידי , על ידי , על ידי , על ידי , על ידי ו-, ו- על ידי ו-.
בדיקה עמודה-עמודה: : . : . : . : . : . : . : . אף עמודה לא עברה את — כמובטח בלמה 4.1.
העמודות יצאו , ולכן
ובחיבור:
כיוון שני (מסכום לכיסוי). נניח שמישהו נותן לנו את הקבוצה ואומר שסכומה . לפי מסקנה 4.2 אנחנו קוראים מן הסכום: הבלוק השמאלי הוא , ולכן נבחרו בדיוק מספרי קודקוד — הקודקודים . בכל עמודת קשת הסכום הוא ; למשל בעמודה תרם אחת ו- אחת. מכיוון ש- יכול לתרום לכל היותר , בהכרח לפחות אחד מקצות נמצא בקבוצה — וזה . חוזרים על אותו שיקול לכל אחת משש העמודות ומקבלים ש- מכסה את כל הקשתות, כלומר כיסוי בקודקודים בגודל .
מה היה קורה בלי אי-נשאות? נניח לרגע שהיינו עובדים בבסיס ובעמודה של היו שלושה מספרים עם . אז היה נכתב כ-, כלומר נשא לעמודה של , וסכום סופי "נכון" היה יכול להתקבל מקבוצה שאינה כיסוי כלל. זו בדיוק הסיבה שאנחנו סופרים כמה אחדות יכולות להצטבר בעמודה (לכל היותר ) ובוחרים בסיס גדול מזה.
דוגמה 2: הדוגמה עם קשתות שנמחקה על הלוח
בעמוד 4 בסיכום מופיע אותו גרף עם קשתות, ו-, . בהקלטה ([01:22:44], [01:23:15]) המרצה אומר "מחקתי קשת אחת כדי שזה ייכנס לי ללוח" — כלומר עמוד 4 מתעד את המצב לפני המחיקה ועמוד 5 את המצב הסופי. שתי הגרסאות תקינות; הדוגמה המלאה והמאומתת היא זו שבדוגמה 1.
דוגמה 3: מעקב מלא אחרי הרדוקציה
מופע חיובי. ניקח , המעגל באורך : והקשתות .
הבנייה. האלגוריתם מוסיף קודקוד ומחבר אותו לכל חמשת הקודקודים. הגרף המתקבל הוא הגלגל בעל קודקודים ו- קשתות.
מ- ל-. מעגל אי-זוגי אינו -צביע אבל כן -צביע; ניקח
בדיקה: , , , , — צביעה חוקית. לפי הבנייה שבמשפט 2 נגדיר שמסכימה עם על ומקצה . חמש הקשתות הישנות בסדר כי חוקית; חמש הקשתות החדשות בסדר כי לבדו נושא את הצבע . לכן .
מ- ל-. נניח שקיבלנו את הצביעה החוקית
כאן , ולכן נפעיל את שלב "ללא הגבלת הכלליות": נחליף בין שמות הצבעים ו- ונקבל , , ושאר הערכים ללא שינוי. החלפת שמות צבעים שומרת על חוקיות, שכן היא פרמוטציה חח"ע של הטווח. כעת נותנת
וכל הערכים אכן ב- — בדיוק מפני שכל קודקוד ב- שכן של ולכן אסור לו לקבל . הצביעה חוקית על כל חמש הקשתות של , ולכן .
מופע שלילי. ניקח . אז . אכן (בקליק בגודל דרושים צבעים) וגם מאותו נימוק — הרדוקציה שולחת "לא" ל"לא", כנדרש.
אותו מופע שובר את הבנייה השגויה. אילו לא היינו מחברים את בקשתות, היינו מקבלים על הקלט את הגרף " ועוד קודקוד מבודד", שהוא -צביע. אז מופע ה"לא" היה נשלח למופע "כן" — דוגמה נגדית מפורשת לכך שהבנייה החלופית אינה רדוקציה.
תרגיל 1 (נפתר בכיתה): מדוע הזהות אינה רדוקציה מ- ל-?
פתרון. צריך למצוא גרף שהוא -צביע ואינו -צביע. הקליק הוא כזה: הוא -צביע כי אפשר לתת לכל קודקוד צבע משלו, והוא אינו -צביע כי בקליק כל שני קודקודים מחוברים ולכן דרושים לפחות צבעים. לכן אך , בסתירה לתנאי הרדוקציה.
תרגיל 2 (נפתר בכיתה): האם היה אפשר לעשות רדוקציה מ- או מ- במקום מ-?
פתרון ([00:54:41]). כן. יש רדוקציה מיידית : הקבוצה היא כיסוי בקודקודים אם ורק אם היא קבוצה בלתי תלויה, ולכן מספיק להעביר . אפשר לשלב אותה בחזית הרדוקציה שלנו ולקבל ישירות. מ- עוברים תחילה לגרף המשלים ואז ל-. המרצה הדגיש שהבחירה ב- שרירותית לחלוטין ונובעת מכך שזו הרדוקציה הקלאסית בספרות ([00:55:43]) — לא מפני שהאחרות שגויות, אלא מפני שהן מוסיפות רעש להוכחה.
תרגיל 3 (שיעורי בית): אינה סגורה לרדוקציות זמן פולינומי
פתרון. ראו ההערה בסוף משפט 1: בוחרים לא-טריוויאלית, לוקחים ממשפט ההיררכיה , ומקבלים ממשפט 1 ש- בעוד .
תרגיל 4: מה גודל טבלת התכנון הדינמי?
פתרון ([01:05:32] בתמליל 18). סטודנט הציע לפתור בעיה קרובה בעזרת טבלה בגודל . שאלת הבדיקה שהמרצה החזיר: כמה ביטים דרושים כדי לתאר את ? התשובה , ולכן טבלה בגודל היא מעריכית באורך הייצוג של . זו בדיוק הבדיקה שיש להריץ בכל פעם שמופיע בקלט מספר, והיא זהה בתוכנה למשפט 5.
הערות מהשיעור
כל התזמונים מתייחסים לתמליל אלא אם צוין אחרת.
- [00:21:39]–[00:23:45] — הטעות שהמרצה כינה "חטא כבד". סטודנט הציע כרדוקציה: "נוסיף קודקוד חדש ונצבע אותו בצבע רביעי". הבנייה עצמה נכונה, אבל הניסוח שגוי מיסודו: לאלגוריתם הרדוקציה אין שום גישה לצביעה. הוא מקבל גרף ומחזיר גרף, הוא לא מחפש צביעה, לא מקבל אותה ולא מעניין אותו אם קיימת. הצביעה מופיעה רק בהוכחה שהאלגוריתם הוא רדוקציה. המרצה השווה זאת לרדוקציה מ- שבה אסור לומר "אם המכונה עוצרת אז נחזיר כך" — אי אפשר לבדוק זאת. עקרון הברזל: רדוקציה אינה באה להכריע את הבעיה, אלא רק להעביר תכונה הלאה מבלי לדעת כלל אם היא מתקיימת. זו בדיוק הנקודה שסטודנטים מפילים עליה במבחן.
- [00:16:53] — איך בודקים ניסיון רדוקציה. "אם הכיוון הראשון קל מדי — תחשדו." זו הוריסטיקה טובה: כאשר כיוון אחד יוצא בשורה, בדרך כלל השני נשבר.
- [00:15:50]–[00:16:21] — הפונקציה בצביעה אינה חייבת להיות על. צביעה ב- צבעים היא גם צביעה ב- צבעים שבה הצבע הרביעי לא נוצל. ואפילו אם רוצים "בדיוק ", אפשר לצבוע קודקוד אחד מחדש בצבע הרביעי בלי ליצור קשת מונוכרומטית (בגרף עם לפחות ארבעה קודקודים). ב-, לעומת זאת, "לפחות" כן שינה — לא תמיד אפשר לעבור בין "בדיוק" ל"לכל היותר".
- [00:09:43] — שאלת סטודנטית ששווה זהב. "אבל עלול להיות מחרוזת ארוכה מאוד, אז איך שלב 2 לוקח זמן קבוע?" התשובה: נקבעו לפני שראינו את הקלט; הם חלק מתיאור המכונה, לא חלק מהקלט. זמן ריצה נמדד תמיד כפונקציה של גודל הקלט, ולכן כתיבתם היא ב-. עצה תחבירית שהמרצה נתן: כתבו את המשתנים בסדר הופעתם — קודמים ל-, ולכן אינם יכולים לתלות בו.
- [00:52:32] — קיצורים. המרצה סירב במפורש לקצר את לראשי תיבות. שווה לאמץ בכתיבה שלכם: ראשי תיבות מקומיים הם מקור נפוץ לבלבול בבדיקה.
- [01:19:56]–[01:21:36] — "אל תשאלו איך הייתם חושבים על זה". אחרי שהוצגה הרדוקציה, סטודנטית שאלה איך בכלל חושבים על בנייה כזאת. תשובת המרצה: זו אינה השאלה הנכונה בשלב הזה. השאלה הנכונה היא "האם הבנתי למה זה נכון". על הבנייה הזו ישבו אנשים חודשים; הציפייה מכם היא לדעת אותה, להבין למה היא עובדת ולעבוד איתה — לא להמציא אותה מאפס. לעומת זאת, על רדוקציה כמו כן מצפים מכם להגיע לבד ([01:21:03]).
- [01:29:33] — הכיוון השני נשאר כתרגיל. המרצה הציג את הכיוון בעל פה בלבד ואמר "אם אתם רוצים באמת להרגיש שאתם מבינים את זה — תכתבו את זה". הוא כתוב במלואו במשפט 4 לעיל.
- [00:44:01] — המשפט שכדאי לזכור בעל פה. "כשעובדים עם מספרים, הערך של המספר והקידוד של המספר זה לא אותו דבר."
- [00:38:29], [00:40:49] — היסטוריית האלגוריתמים לבעיה. ראיתם את הבעיה במבוא (פתרון רקורסיבי: לכל איבר מחליטים בפנים/בחוץ, עץ רקורסיה בגודל ) ובאלגוריתמים (תכנון דינמי, טבלה בגודל ). האלגוריתם הנאיבי ביותר הוא מעבר על כל תת-הקבוצות.
פערים בין הסיכום להקלטה
- מקור: תמליל , [00:00:00]. הפער: הכתוביות אומרות "נניח כי ב- וכי טריוויאלית", בלי השלילה. ההכרעה: זו נפילת שלילה אופיינית לתמלול אוטומטי. הסיכום (עמוד 1) והתזכורת מחישוביות ב-[00:00:32] אומרים שניהם " אינה טריוויאלית", וזה גם המצב המתמטי הנכון — עבור טריוויאלית הטענה שקרית. תוקן בגוף הקובץ.
- מקור: עמוד 5 בסיכום. הפער: הסיכום מוכיח רק את הכיוון פלט ב-; הכיוון ההפוך חסר לגמרי, ובהקלטה הוא נאמר בעל פה בלבד ([01:29:33]). ההכרעה: הכיוון השני נכתב כאן במלואו לפי הסקיצה שנאמרה, כולל הנימוק שמספר קשת יכול לתרום לכל היותר ולכן בהכרח לפחות קצה אחד נבחר.
- מקור: הסיכום וההקלטה כאחד. הפער: טיעון אי-הנשאות אינו מנוסח בשום מקום כטענה; שניהם רק מציינים שסכום עמודת קשת הוא בין ל- בכיסוי מסוים. ההכרעה: נוסח כאן כלמה 4.1 עם הוכחה מלאה (חסם על סכום עמודה, ולכן ספרה חוקית בבסיס ; כל בסיס מספיק), ומסקנה 4.2 שמצדיקה את הקריאה ספרה-ספרה.
- מקור: הסיכום (עמוד 5) וההקלטה ([01:13:18]). הפער: שניהם עוברים מ-"" ישירות ל-"קיים כיסוי עם ", בעוד ההגדרה של היא "לכל היותר ". ההכרעה: אין כאן שגיאה מהותית, אבל יש חוסר. נוסף צעד 0 לאלגוריתם () והצדקה שהשלמת כיסוי לגודל בדיוק אפשרית.
- מקור: הסיכום (עמוד 4) וההקלטה ([01:07:50]). הפער: נכתב ש- הוא בן ספרות. ההכרעה: מספר הספרות המדויק הוא ; זהו עיגול מקובל ולא שגיאה, אך נכתב כאן במדויק. נשמר הדגש של ההקלטה ([00:59:38]) שהבלוק השמאלי אינו ספרה בודדת.
- מקור: עמוד 4 בסיכום מול עמוד 5. הפער: הדוגמה בעמוד 4 היא על גרף בעל קשתות (, ) ואילו עמוד 5 מציג גרף בעל קשתות. ההכרעה: אין כאן סתירה — בהקלטה ([01:22:44]) המרצה אומר שמחק קשת אחת כדי שהטבלה תיכנס ללוח. הדוגמה המפורטת בקובץ היא של עמוד 5, שנבדקה עמודה-עמודה.
- מקור: עמוד 4 בסיכום. הפער: שורת הקלט של הבעיה כתובה " מספרים ", עם אי-התאמה בין ל-. ההכרעה: הקלט הוא מספרים; זו כנראה פליטת קולמוס, ובכל יתר הסיכום ובהקלטה ([00:39:09]) מופיע . תוקן.
- מקור: ההקלטה בלבד. הפער: כל הדיון בהבחנה בין ערך לאורך ייצוג ([00:40:49]–[00:51:30]) — האלגוריתם הנאיבי על תת-קבוצות, בדיקת ראשוניות נאיבית, המקרה האונרי, ואי-תלות הבסיס — מופיע בסיכום רק כשתי שורות כחולות. ההכרעה: שוחזר במלואו ונוסח כמשפט 5 ובהגדרה 3.
- מקור: ההקלטה בלבד. הפער: שני "הניסיונות שנשברו" ברדוקציה (הזהות; הוספת קודקוד בלי קשתות) והדיון על מה מותר לרדוקציה לדעת ([00:16:53], [00:21:39], [00:31:29]) אינם בסיכום כלל. ההכרעה: נכללו במלואם, כולל דוגמאות נגדיות מפורשות שההרצאה לא נתנה; זהו החומר החשוב ביותר בהקלטה שאינו בסיכום.
- מקור: חלוקת החומר בין קבצי השיעורים. הפער: הרדוקציה נמצאת בעמודים 2–3 של סיכום שיעור 11 (הקובץ הזה) ולא בסיכומי שיעור 10, אף שבמקור נכתבה גם שם. ההכרעה: לפי הסיכום הכתוב היא שייכת לשיעור 11 ונכתבת כאן במלואה (משפט 2, דוגמה 3, תרגיל 1); על הקובץ של שיעור 10 להפנות לכאן.
- מקור: הקצאת התמלילים במשימה. הפער: תמליל 18 () הוגדר כתמליל הראשי לשיעור זה, אך תוכנו הוא שיעור 12 (PARTITION, BIN PACKING, מעגלים המילטוניים, TSP), והוא נפתח במילים "בשיעור האחרון ראינו את SUBSET SUM". ההכרעה: תמליל 17 () הוא התמליל הראשי בפועל — חמשת עמודי הסיכום מופיעים בו לפי הסדר. סומן בהתאם בשדה
sources.
סיכום ונקודות למבחן
מה לזכור בעל פה.
- : בהינתן בבסיס , האם קיימת עם . הבעיה NP-complete.
- הרדוקציה: . עמודות: עמודה מובילה + עמודה לכל קשת. מתחיל ב- ומסמן את הקשתות הנוגעות ב-; מתחיל ב- והוא וקטור יחידה; .
- הטיעון: בכל עמודת קשת מצטברות לכל היותר אחדות אין נשאות שוויון סכומים = שוויון ספרה-ספרה "בדיוק בכל עמודה" "לפחות קצה אחד נבחר", ו-" בעמודה " "נבחרו בדיוק קודקודים".
- בזמן הוא pseudo-polynomial ולא פולינומי. ערך מול אורך ייצוג: ביטים לערך .
- ו- לא-טריוויאלית ; מכאן ש- גס מדי מכדי להבחין בין בעיות בתוך .
- היא NP-complete באמצעות הוספת קודקוד המחובר לכל השאר.
מלכודות סטנדרטיות.
- לכתוב רדוקציה שמסתכלת על הפתרון. "אם הגרף -צביע נחזיר..." — אסור. האלגוריתם רואה רק את הקלט הגולמי. הצביעה/הכיסוי/ההשמה מופיעים אך ורק בהוכחת הנכונות.
- לשכוח להוכיח את הכיוון השני. בדיוק הכיוון שהסיכום מדלג עליו הוא הכיוון שנשבר בבניות שגויות.
- להניח אי-נשאות בלי לנמק. במבחן צריך לומר במפורש: בכל עמודה מצטברות לכל היותר אחדות, ולכן בבסיס אין נשאות, ולכן אפשר לקרוא ספרה-ספרה.
- לבלבל בין "לכל היותר " ל"בדיוק " בהגדרת .
- לקרוא ל- "פולינומי". זו המלכודת המרכזית של השיעור. תמיד שאלו: מה אורך הייצוג של המספר, לא מה ערכו.
- להפוך את כיוון הרדוקציה. פירושו ש- קשה לפחות כמו . כדי להוכיח ש- קשה, מתחילים מבעיה קשה ידועה ואליה לא עושים רדוקציה — עושים ממנה.
צ'ק-ליסט: אחרי השיעור אתם צריכים לדעת
- לנסח את פורמלית ולהוכיח שהיא ב- עם certificate מפורש.
- לבנות את המספרים עבור גרף קטן נתון, ולחשב את הסכום בשתי הבחירות.
- לנמק במלואו מדוע אין נשאות ולמה בלעדיה הטיעון קורס.
- להוכיח את שני כיווני הנכונות של הרדוקציה, ולנמק מדוע היא פולינומית — כולל למה מותר לה לייצר מספרים בעלי ערך מעריכי.
- לחשב אורך קלט מול זמן ריצה במשפחת הקלטים , ולהסביר מדוע אינו פולינומי.
- לבנות את הרדוקציה מאפס, ולהסביר מדוע הזהות ומדוע קודקוד לא מחובר אינם עובדים.
