You are on page 1of 8

‫ממן ‪ – 12‬אלגוריתמים – ברנדס איתי‬

‫שאלה ‪:1‬‬
‫סעיף א'‪:‬‬
‫נתון שכל הצלעות ב 𝑣‪ 𝑃𝑠,‬שימושיות‪ .‬נניח ש 𝑣‪ 𝑃𝑠,‬הינו מסלול מזערי באינדוקציה על אורך המסלול ‪.n‬‬
‫בדיקה כאשר 𝟎 = 𝒏‪ :‬גודל המסלול 𝑣‪ 𝑃𝑠,‬הוא ‪ ,0‬ולכן מתקיים בהכרח 𝑣 = 𝑠‪ .‬לא קיימים קשתות במסלול‬
‫‪′‬‬
‫𝑣‪ 𝑃𝑠,‬יקיים‬ ‫𝑣‪ 𝑃𝑠,‬ולכן ‪ .𝑤(𝑃𝑠,𝑣 ) = 0‬משום שלכל קשת בגרף יש משקלים חיוביים‪ ,‬ברור שכל מסלול אחר‬
‫‪′‬‬
‫𝑣‪ ,𝑤(𝑃𝑠,𝑣 ) ≤ 𝑤(𝑃𝑠,‬ולכן לפי ההגדרה‪ 𝑃𝑠,𝑣 ,‬מסלול מזערי‪.‬‬ ‫)‬
‫נניח את נכונות טענת האינדוקציה עבור מסלול בגודל ‪ n‬ונוכיח את נכונותה עבור מסלול בגודל ‪:n+1‬‬

‫מתקיים ‪ ,𝑃𝑠,𝑣 = (𝑠, … , 𝑢, 𝑣), |𝑃𝑠,𝑣 | = 𝑛 + 1‬וכמובן שכל הקשתות שימושיות‪ .‬נסתכל על המסלול מ‪ s‬ל‪:u‬‬

‫𝑛 = | 𝑢‪ .𝑃𝑠,𝑢 = (𝑠, … , 𝑢), |𝑃𝑠,‬כמובן שכל הקשתות שלו נמצאות גם במסלול 𝑣‪ ,𝑃𝑠,‬ומשום שקשתות 𝑣‪𝑃𝑠,‬‬
‫הן כולן שימושיות‪ ,‬גם קשתות 𝑢‪ 𝑃𝑠,‬הן כולן שימושיות‪.‬‬
‫לפי הנחת האינדוקציה‪ ,‬משום ש 𝑢‪ 𝑃𝑠,‬הוא מסלול בגודל ‪ n‬שכל הקשתות שלו שימושיות‪ ,‬נקבל ש 𝑢‪ 𝑃𝑠,‬הוא‬
‫מסלול מזערי‪ .‬כמו כן‪ 𝑒 = (𝑢, 𝑣) ∈ 𝐸 ,‬היא קשת שימושית‪ ,‬כלומר‪ ,‬לפי הגדרה‪ ,‬היא צלע אחרונה‬
‫‪′‬‬
‫𝑣‪( 𝑃𝑠,‬שהוא זהה או שונה מ 𝑣‪.)𝑃𝑠,‬‬ ‫באיזשהו מסלול מזערי‬
‫‪′‬‬
‫𝑣‪ .𝑤(𝑃𝑠,𝑣 ) > 𝑤(𝑃𝑠,‬בשני המסלולים הקשת האחרונה היא 𝑒 והיא מקשרת אל‬ ‫נניח בשלילה שמתקיים )‬
‫‪′‬‬
‫‪ .v‬נוריד משני המסלולים את הקשת 𝑒 ואת הקודקוד 𝑣 ונקבל ש) 𝑢‪( 𝑤(𝑃𝑠,𝑢 ) > 𝑤(𝑃𝑠,‬החסרנו את משקל‬
‫𝑒 משני אגפי המשוואה ולכן השוויון עדיין נכון)‪ .‬אך זוהי סתירה לכך ש) 𝑢‪ 𝑤(𝑃𝑠,‬מסלול מזערי‪.‬‬

‫לפיכך ‪ 𝒘(𝑷𝒔,𝒗 ) ≤ 𝒘(𝑷′𝒔,𝒗 ) -‬ולכן 𝒗‪ 𝑷𝒔,‬הוא מסלול מזערי‪ ,‬לכל מסלול בגודל 𝟎 ≥ 𝒏‪.‬‬

‫סעיף ב'‪:‬‬
‫נתון שבמסלול 𝑣‪ 𝑃𝑠,‬קיימת לפחות קשת אחת )𝑦 ‪ 𝑒 = (𝑥,‬שאיננה שימושית‪ .‬עלינו להראות ש 𝑣‪ 𝑃𝑠,‬איננו‬
‫מסלול מזערי‪.‬‬
‫𝑒 איננה שימושית‪ ,‬ולכן היא לא צלע אחרונה במסלול מזערי‪ ,‬ומתקבל שהמסלול )𝑦 ‪𝑃𝑠,𝑦 = (𝑠, … , 𝑥,‬‬
‫‪′‬‬ ‫‪′‬‬
‫𝑦‪.𝑤(𝑃𝑠,𝑦 ) > 𝑤(𝑃𝑠,‬‬ ‫𝑦‪ 𝑃𝑠,‬שהוא כן מזערי‪ .‬אם כן מתקיים )‬ ‫איננו מזערי‪ .‬לפיכך קיים מסלול אחר‬
‫‪′‬‬ ‫‪′‬‬
‫𝑦‪ 𝑃𝑠,‬ו‪ 𝑃𝑦,𝑣 -‬עם קשת מחברת )𝑣 ‪ .(𝑦,‬כעת נקבל‪:‬‬ ‫𝑣‪ 𝑃𝑠,‬שמורכב מחיבור המסלולים‬ ‫נגדיר מסלול חדש‬
‫‪′‬‬ ‫‪′‬‬
‫𝑦‪𝑤(𝑃𝑠,𝑣 ) = 𝑤(𝑃𝑠,𝑦 ) + 𝑤(𝑃𝑦,𝑣 ) > 𝑤(𝑃𝑠,‬‬ ‫𝑣‪) + 𝑤(𝑃𝑦,𝑣 ) = 𝑤(𝑃𝑠,‬‬ ‫)‬

‫ולכן לפי הגדרה‪ 𝑃𝑠,𝑣 ,‬איננו מזערי‪.‬‬

‫סעיף ג'‪:‬‬
‫יהי 𝑣‪ 𝑃𝑠,‬מסלול כמעט מזערי‪ .‬נראה שקיימת בו צלע לא שימושית אחת ויחידה‪.‬‬

‫משום ש 𝑣‪ 𝑃𝑠,‬כמעט מזערי‪ ,‬הוא כמובן איננו מזערי‪ ,‬ולכן לפי סעיף א'‪ ,‬קיימות בו קשתות לא שימושיות‪.‬‬
‫עלינו להראות שיש בדיוק קשת אחת לא שימושית‪ .‬נראה זאת ע"י הוכחה בשלילה‪:‬‬
‫נניח בשלילה שקיימות במסלול ‪ 2‬קשתות שונות לא שימושיות ) ‪ (𝑥1 , 𝑥2‬ו) ‪ .(𝑦1 , 𝑦2‬נניח בלי הגבלת‬
‫הכלליות ש) ‪ (𝑥1 , 𝑥2‬נמצאת לפני ) ‪ (𝑦1 , 𝑦2‬במסלול 𝑣‪ .𝑃𝑠,‬אז מתקיים‪:‬‬

‫𝑣 ‪𝑃𝑠,𝑣 = 𝑠, … , 𝑥1 , 𝑥2 , … , 𝑦1 , 𝑦2 , … ,‬‬

‫נתבונן על המסלול החלקי 𝑣‪ .𝑃𝑥2 ,‬הוא מכיל את הקשת הלא שימושית ) ‪ (𝑦1 , 𝑦2‬ולכן‪ ,‬לפי סעיף ב'‪ ,‬הוא לא‬
‫מזערי‪ .‬אם כן‪ ,‬קיים מסלול אחר 𝑣‪ 𝑃𝑥′2 ,‬שהוא כן מזערי‪ ,‬ולכן ) 𝑣‪.𝑤(𝑃𝑥′2 ,𝑣 ) < 𝑤(𝑃𝑥2 ,‬‬

‫𝑣‪ 𝑃𝑠,‬שמורכב מחיבור המסלולים ‪ 𝑃𝑠,𝑥2‬ו‪ .𝑃𝑥′2 ,𝑣 -‬מתקיים‪:‬‬


‫‪′‬‬
‫נגדיר מסלול חדש‬
‫‪′‬‬
‫𝑣‪𝑤(𝑃𝑠,‬‬ ‫) 𝑣‪) = 𝑤(𝑃𝑠,𝑥2 ) + 𝑤(𝑃𝑥′2 ,𝑣 ) < 𝑤(𝑃𝑠,𝑥2 ) + 𝑤(𝑃𝑥2 ,𝑣 ) = 𝑤(𝑃𝑠,‬‬
‫‪′‬‬ ‫‪′‬‬
‫𝑣‪ 𝑃𝑠,‬מכילה בתוכה את הקשת הלא שימושית ) ‪ ,(𝑥1 , 𝑥2‬ולכן לפי סעיף‬ ‫𝑣‪ .𝑤(𝑃𝑠,‬אך‬ ‫לסיכום‪) < 𝑤(𝑃𝑠,𝑣 ) ,‬‬
‫ב'‪ ,‬הוא לא מזערי‪ ,‬בסתירה לכך ש 𝑣‪ 𝑃𝑠,‬הוא כמעט מזערי‪ ,‬וכל מסלול בעל משקל קטן ממש ממנו הוא‬
‫מזערי‪.‬‬
‫ולכן‪ ,‬אם 𝑣‪ 𝑃𝑠,‬כמעט מזערי‪ ,‬אז קיימת בו צלע לא שימושית אחת ויחידה‪.‬‬

‫סעיף ד'‪:‬‬
‫נתון שבמסלול הכמעט‪-‬מזערי 𝑣‪ 𝑃𝑠,‬יש קשת לא שימושית בודדת ) ‪.𝑒 = (𝑢1 , 𝑢2‬‬
‫כל שאר הקשתות }𝑒{\𝐸 ∈ ‪ 𝑒 ′‬הן קשתות שימושיות‪.‬‬
‫מסלול הרישא של 𝑣‪ 𝑃𝑠,‬מ‪ s-‬ל‪ ,𝑢1 -‬נקרא לו ‪ ,𝑃𝑠,𝑢1‬מכיל רק קשתות שימושיות (שכן כל קשת בו היא‬
‫ב}𝑒{\𝐸 ) ולכן לפי סעיף א'‪ 𝑃𝑠,𝑢1 ,‬מסלול מזערי‪.‬‬

‫מאותו טיעון בדיוק‪ ,‬מסלול הסיפא של 𝑣‪ 𝑃𝑠,‬מ‪ 𝑢2 -‬ל‪ ,𝑣 -‬נקרא לו 𝑣‪ ,𝑃𝑢2 ,‬הוא גם מסלול מזערי‪.‬‬

‫סעיף ה'‪:‬‬
‫הרעיון המרכזי של האלגוריתם‪:‬‬
‫נשתמש ראשית באלגוריתם דייקסטרה מצומת ‪ s‬לכל שאר הצמתים‪ .‬נקבל בחזרה עץ המסלולים‬
‫המזעריים ‪ T‬המושרש ב‪ .s-‬נקבל חלוקה של קשתות ‪ G‬לקשתות שנמצאות ב‪ T‬וקשתות שלא נמצאות בה‪.‬‬
‫קשתות שנמצאות ב‪ G‬וב‪ T‬גם יחד הן קשתות שימושיות‪ ,‬וקשתות שנמצאות ב‪ G‬בלבד הן קשתות לא‪-‬‬
‫שימושיות‪.‬‬
‫כעת ניצור גרף חדש ∗ 𝐺 בו ניצור חלוקה ל‪ 2‬חלקים‪ ,‬כאשר בכל חלק יהיה העתק של הקשתות‬
‫השימושיות ב‪ G‬יחד עם העתקים של כל הצמתים שמחוברים אליהן (בסימוני תג ותגיים ע"מ שנוכל‬
‫להבדיל הצמתים של ‪ 2‬החלקים)‪.‬‬
‫בין שני חלקי הגרף נחבר עם קשתות לא‪-‬שימושיות מ‪ ,G‬ועל הגרף המשולב ∗ 𝐺 שנקבל נריץ שוב את‬
‫האלגוריתם של דייקסטרה‪.‬‬
‫נקבל בחזרה עץ מסלולים מזעריים ∗ 𝑇‪ ,‬שבו נחפש מסלול מצומת ‪ 𝑠′‬לצומת ‪.𝑡′′‬‬
‫אם קיים כזה‪ ,‬זהו המסלול שאנו מחפשים‪ .‬זהו מסלול מזערי ב∗ 𝑇‪ ,‬אך הוא מכיל באופן מלאכותי בדיוק‬
‫קשת לא שימושית אחת (בחיבור מ‪ 𝐺′‬ל‪ )𝐺′′‬ולכן‪ ,‬אם נמחק את סימוני התגים והתגיים מהמסלול‬
‫המתקבל ‪ 𝑃𝑠′ ,𝑡 ′′‬נקבל מסלול בעל קשת לא‪-‬שימושית בודדת ב 𝐺‪ ,‬ולכן זהו מסלול כמעט מזערי‪.‬‬
‫האלגוריתם‪:‬‬
‫נפעיל את אלגוריתם דייקסטרה (עמוד ‪ 149‬בספר הלימוד) על הגרף )𝐸 ‪ 𝐺 = (𝑉,‬מצומת ‪ s‬לשאר‬
‫הצמתים‪ ,‬ונקבל בחזרה את עץ המסלולים המזעריים ‪.T‬‬
‫נגדיר‪:‬‬
‫𝑇𝐸 = ‪ – 𝐸1‬קבוצת הקשתות השימושיות ב 𝐸‪.‬‬ ‫‪‬‬
‫‪ - 𝐸2 = 𝐸\𝐸1‬קבוצת הקשתות הלא‪-‬שימושיות ב 𝐸‪.‬‬ ‫‪‬‬
‫נגדיר גרף חדש ) ∗ 𝑉 ‪ 𝐺 ∗ = (𝐸 ∗ ,‬בדרך הבאה‪:‬‬
‫לכל ‪𝑒 = (𝑢, 𝑣) ∈ 𝐸1‬‬ ‫‪‬‬
‫‪ o‬ניצור צמתים ‪ 𝑢′ , 𝑣 ′ , 𝑢′′ , 𝑣′′‬ב∗ 𝐺 (אם אינן קיימות כבר)‪.‬‬
‫‪ o‬ניצור קשתות ) ‪ (𝑢′ , 𝑣 ′‬ו‪ (𝑢′′ , 𝑣 ′′ )-‬ב∗ 𝐺 (אם אינן קיימות כבר)‪.‬‬
‫לכל ‪ 𝑒 = (𝑢, 𝑣) ∈ 𝐸2‬ניצור קשתות ) ‪ (𝑢′ , 𝑣 ′′‬ב∗ 𝐺‪.‬‬ ‫‪‬‬
‫נפעיל את אלגוריתם דייקסטרה בשנית על ∗ 𝐺 מצומת ‪ 𝑠′‬לצומת ‪ .𝑡′′‬אם קיים מסלול ‪ 𝑃𝑠′ ,𝑡′′‬כזה‪ ,‬נחזיר‬
‫אותו לאחר שנמחק ממנו את סימוני התגים והתגיים‪ .‬אם לא‪ ,‬נחזיר שלא קיים מסלול כזה‪.‬‬
‫ננמק את נכונות האלגוריתם לפתרון הבעיה‪:‬‬
‫נשתמש ראשית באלגוריתם דייקסטרה מצומת ‪ s‬לכל שאר הצמתים‪ .‬נקבל עץ המסלולים המזעריים ‪T‬‬
‫המושרש ב‪ .s-‬לכל צומת 𝑉 ∈ 𝑣‪ ,‬המסלול היחיד מ‪ s‬ל‪ v-‬הוא מסלול מזערי‪ .‬לפי סעיף ב' נקבל שכל‬
‫הקשתות שנמצאות ב 𝑇𝐸 = ‪ 𝐸1‬הן למעשה שימושיות‪ .‬כל שאר הקשתות‪ ,‬שהכנסנו ל ‪ ,𝐸2‬הן קשתות לא‪-‬‬
‫שימושיות‪.‬‬
‫הגרף החדש משרה חלוקה בין ‪ 2‬תתי‪-‬גרף (נקרא להם ‪ 𝐺′‬ו‪ )𝐺′′‬שמכילים כל אחד קשתות שימושיות‬
‫בלבד‪ ,‬וכמו כן חיבור מ‪ 𝐺′‬ל‪ 𝐺′′‬בעזרת קשתות לא‪-‬שימושיות בלבד‪.‬‬
‫לפיכך‪ ,‬כאשר נחפש מסלול מזערי ב∗ 𝐺 מצומת ‪ 𝑠′‬לצומת ‪ ,𝑡′′‬ולמעשה נחפש מסלול מ‪ 𝑠′‬שבתת‪-‬גרף ‪𝐺′‬‬
‫המכיל קשתות שימושיות בלבד‪ ,‬דרך אחת הקשתות הלא‪-‬שימושיות המחברות בין ‪ 𝐺′‬ל‪ ,𝐺′′‬אל ‪𝑡′′‬‬
‫שנמצא בתת‪-‬גרף ‪ 𝐺′′‬המכיל קשתות שימושיות בלבד‪.‬‬
‫במילים אחרות‪ ,‬מסלול ‪ 𝑃𝑠′ ,𝑡′′‬כזה‪ ,‬אם קיים‪ ,‬יכיל בדיוק קשת לא‪-‬שימושית אחת‪ ,‬וכל שאר הקשתות יהיו‬
‫בהכרח שימושיות‪ ,‬ולכן‪ ,‬לפי ההגדרה‪ 𝑃𝑠′ ,𝑡′′ ,‬הוא מסלול כמעט‪-‬מזערי‪.‬‬

‫נבחין שמסלול כזה לא תמיד קיים‪ .‬במצב זה‪ ,‬אין מסלול כמעט‪-‬מזערי מ’‪ s‬ל’’‪.t‬‬
‫כעת‪ ,‬בהינתן מסלול כמעט‪-‬מזערי ‪ ,𝑃𝑠′ ,𝑡′′‬ניתן לחשב את 𝑡‪ 𝑃𝑠,‬בקלות ע"י מחיקת סימוני התג והתגיים‪.‬‬
‫כמובן שמסלול זה גם קיים בגרף 𝐺 המקורי‪ ,‬שכן בנינו אותו בצורה זו‪.‬‬
‫ננתח את סיבוכיות זמן הריצה‪:‬‬
‫אנו מריצים פעמיים את אלגוריתם דייקסטרה‪ ,‬בעלות של )|𝑉|‪( 𝜃(|𝐸| ∗ log‬לפי משפט ‪ 4.15‬בעמוד ‪153‬‬
‫בספר הלימוד)‪.‬‬

‫בנוסף לכך‪ ,‬זמן בניית הגרף החדש ∗ 𝐺 הוא לינארי‪.‬‬

‫סה"כ זמן ריצה )|𝑉|‪.𝑇(|𝐸|, |𝑉|) = 𝜃(|𝐸| ∗ log|𝑉|) + 𝜃(|𝐸| + |𝑉|) = 𝜃(|𝐸| ∗ log‬‬
‫שאלה ‪:2‬‬
‫נתון עץ פורש מזערי 𝑇 של גרף לא מכוון קשיר 𝐺‪ .‬נגדיר גרפים חדשים ‪ 𝐺 ′ , 𝑇′‬שזהים ל𝑇 ‪ 𝐺,‬מלבד כך‬
‫שהושמטה מהם קשת 𝑇 ∈ ∗ 𝑒‪ 𝐺′ .‬קשיר‪ .‬עלינו למצוא אלגוריתם שיתקן את ‪ 𝑇′‬כך שיהיה עץ פורש מזערי‬
‫של ‪.𝐺′‬‬
‫הרעיון המרכזי של האלגוריתם‪:‬‬
‫השמטת הקשת מהעץ 𝑇 הופכת אותו לגרף בעל ‪ 2‬רכיבי קשירות שונים‪ ,‬נגיד ‪ ,𝑇1 , 𝑇2‬כל אחד מהם עץ‪.‬‬
‫עלינו להוסיף קשת כלשהי מ‪ 𝐺′‬ע"מ לחבר בין ‪ 2‬רכיבי קשירות אלה‪ .‬נבחין שבהכרח יש כזאת‪ ,‬כי ‪𝐺 ′‬‬
‫נשארה קשירה‪ .‬קשת זו צריכה להיות בעל משקל מינימלי‪ ,‬על מנת להפוך את ‪ 𝑇′‬לעץ פורש מזערי של‬
‫‪.𝐺′‬‬
‫נוכל לעשות זאת ע"י סריקת ‪ BFS‬של כל אחד מרכיבי הקשירות‪ ,‬ואז נעבור על כל הקשתות שקצה אחד‬
‫שלהן ברכיב של ‪ ,𝑇1‬וקצה שני שלהן ברכיב של ‪ .𝑇2‬מכל קשתות אלה נחפש את זה בעל המשקל‬
‫המינימלי‪.‬‬
‫את הקשת המינימלית הזו נוסיף ל‪ 𝑇′‬ונקבל עץ פורש מזערי‪.‬‬
‫האלגוריתם‪:‬‬
‫בראשית נאתחל את ∞ ← ‪.min_verticle ← NIL, min_weight‬‬
‫נמצא את שני רכיבי הקשירות ב‪ ,𝑇′‬ע"י בחירת צומת ‪ 𝑣 ∈ 𝑇′‬כלשהי‪ ,‬והרצת סריקת ‪ BFS‬ממנה תוך כדי‬
‫סימון במערך ‪.𝑐𝑜𝑛𝑛𝑒𝑐𝑡𝑒𝑑_𝑐𝑜𝑚𝑝𝑜𝑛𝑒𝑛𝑡[𝑣] = 𝑇1‬‬
‫כעת נבחר צומת ‪ 𝑣 ∈ 𝑇′‬אחרת‪ ,‬שטרם סומנה‪ ,‬ונריץ סריקת ‪ BFS‬ממנה תוך כדי סימון במערך‬
‫‪.𝑐𝑜𝑛𝑛𝑒𝑐𝑡𝑒𝑑_𝑐𝑜𝑚𝑝𝑜𝑛𝑒𝑛𝑡[𝑣] = 𝑇2‬‬
‫לכל ‪ 𝑒 ∈ 𝑇′‬אשר קצה אחד שלו נמצא ב ‪ 𝑇1‬וקצה שני שלו נמצא ב ‪:𝑇2‬‬
‫אם 𝑡‪:𝑐𝑒 < min_𝑤𝑒𝑖𝑔ℎ‬‬ ‫‪‬‬
‫‪min_weight ← 𝑐𝑒 o‬‬
‫‪min_𝑣𝑒𝑟𝑡𝑖𝑐𝑙𝑒 ← 𝑒 o‬‬
‫בסיום נוסיף את קשת ‪ min_verticle‬אל ‪ .𝑇′‬כעת ‪ 𝑇′‬הוא עץ פורש מזערי של ‪.𝐺′‬‬

‫ננמק את נכונות האלגוריתם לפתרון הבעיה‪:‬‬


‫נראה שהסרת הקשת )𝑣 ‪ 𝑒 ∗ = (𝑢,‬מהעץ 𝑇 יוצרת בדיוק ‪ 2‬רכיבי‪-‬קשירות שונים‪)*( :‬‬
‫לפני הסרת הקשת ‪ T‬קשירה (מעצם הגדרתה כעץ)‪ ,‬והסרה של קשת אחת מעץ תגרום לו להתנתק‬
‫בהכרח ל‪ 2‬חלקים קשירים שונים‪.‬‬
‫אם נניח בשלילה שהגרף החדש ‪ T′‬נשאר קשיר‪ ,‬סימן שיש מסלול אחר מ𝑢 ל‪ ,𝑣 -‬ולכן ב‪ T‬המקורי יש‬
‫מעגל‪ ,‬בניגוד להגדרת עץ‪.‬‬
‫אם נניח בשלילה שבגרף החדש יש לפחות ‪ 3‬רכיבי‪-‬קשירות‪ ,‬אז כאשר נחזיר את הקשת ∗ 𝑒 לגרף‪ ,‬נקבל‬
‫בחזרה את ‪ T‬המקורי‪ ,‬אך עם לפחות ‪ 2‬רכיבי קשירות (שכן כל קשת בודדת יכולה לחבר עד ‪ 2‬רכיבי‬
‫קשירות יחדיו)‪ ,‬בסתירה להיות 𝑇 עץ‪.‬‬
‫נראה שניתן לתקן את הגרף ‪ 𝑇′‬לגרף פורש (לא בהכרח מזערי) עבור ‪:𝐺′‬‬
‫אנו מחפשים להוסיף ל‪ 𝑇′‬איזשהי קשת מ‪ 𝐺′‬שתחבר מרכיב הקשירות ‪ 𝑇1‬לרכיב הקשירות ‪.𝑇2‬‬
‫אנו מריצים סריקת ‪ BFS‬על כל אחד מרכיבי הקשירות ע"מ לזהות את רכיבי הקשירות ‪.𝑇1 , 𝑇2‬‬
‫כל קשת כזאת‪ ,‬מאיבר כלשהו ב ‪ 𝑇1‬לאיבר כלשהו ב ‪ 𝑇2‬תהפוך את הגרף לגרף קשיר‪.‬‬
‫כמו כן‪ 𝑇1 ,‬ו ‪ 𝑇2‬שניהם עצים‪ ,‬שכן הם תתי‪-‬גרפים של ‪ T‬המקורית שהוא עץ בעצמו‪ .‬בפרט‪ ,‬כל אחד מהם‪,‬‬
‫לפי משפט ‪ 3.2‬בעמוד ‪ 84‬בספר הלימוד‪ ,‬לא מכיל מעגל‪.‬‬
‫כמובן שחיבור של קשת בין מאיבר כלשהו ב ‪ 𝑇1‬לאיבר כלשהו ב ‪ 𝑇2‬לא תיצור שום מעגל בגרף החדש‪.‬‬
‫לפיכך‪ ,‬לאחר הוספת קשת כזאת ל‪ 𝑇′‬הוא יהפוך לגרף פורש עבור ‪ ,𝐺′‬שכן זהו עץ שכל צומת בו נגישה‪-‬‬
‫הדדית‪.‬‬
‫נבחין שבהכרח קיימים קשתות כאלה‪ ,‬שכן ‪ 𝐺 ′‬נשארה קשירה‪.‬‬
‫נראה שניתן לתקן את הגרף ‪ 𝑇′‬לגרף פורש מזערי עבור ‪:𝐺′‬‬
‫מבין כל הקשתות האפשריות להפיכת ‪ T′‬לגרף פורש עבור ‪ ,G′‬נבחר את הקשת ‪ 𝑒′‬בעלת המשקל‬
‫המינימלי‪.‬‬
‫הקשת ‪ 𝑒′‬המחברת בין ‪ 2‬רכיבי קשירות שונים‪ ,‬והיא בעלת המשקל המינימלי משאר הקשתות המחברות‬
‫בין רכיבי הקשירות השונים‪ ,‬ולכן לפי תכונת החתך (משפט ‪ 4.17‬בעמוד ‪ 157‬בספר הלימוד)‪ ,‬נקבל שכל‬
‫עץ פורש מזערי של ‪ 𝐺′‬מכיל בהכרח את ‪( .𝑒′‬המשפט מנוסח לגבי קשתות שבהן מובטח שלכל הקשתות‬
‫בגרף יש משקלים שונים‪ ,‬אך בספר הוסבר שהמשפט נכון גם למצב שבו לקשתות יש משקלים זהים‪ ,‬כפי‬
‫שיתכן בתרגיל זה)‪.‬‬
‫לפיכך‪ ,‬הגרף הפורש המזערי של ‪ G′‬מכיל בהכרח את ‪ ,𝑒′‬אך נשאלת השאלה האם להוסיף אותו ל‪𝑇′‬‬
‫יהפוך אותו לגרף פורש מזערי? באופן תאורטי יתכן שבהתאם למצב החדש‪ ,‬קיימת קבוצת קשתות שונה‬
‫שתגדיר גרף פורש בעלות קטנה יותר‪ .‬נוכיח שלא כך המצב‪:‬‬
‫אנו מכניסים את ‪ 𝑒′‬ל‪.𝑇′‬‬
‫נניח בשלילה שקיים עץ אחר ‪ 𝑇′′‬שהוא עץ פורש מזערי של ‪ ,𝐺′‬ומתקיים ) ‪.𝑐(𝑇 ′′ ) < 𝑐(𝑇 ′‬‬
‫לפי תכונת החתך‪ .𝑒 ′ ∈ 𝑇′′ ,‬אם נסיר את ‪ 𝑒′‬מ‪ 𝑇′′‬נקבל ‪ 2‬חלקי קשירות‪( 𝑇1′′ , 𝑇2′′ ,‬כפי שהוכחנו ב(*))‪.‬‬
‫אם כן‪ ,‬מתקיים‪:‬‬
‫) ‪𝑐(𝑇1′′ ) + 𝑐(𝑇2′′ ) + 𝑐(𝑒 ′ ) = 𝑐(𝑇 ′′ ) < 𝑐(𝑇 ′ ) = 𝑐(𝑇1 ) + 𝑐(𝑇2 ) + 𝑐(𝑒 ′‬‬
‫↓‬
‫) ‪𝑐(𝑇1′′ ) + 𝑐(𝑇2′′ ) + 𝑐(𝑒 ′ ) < 𝑐(𝑇1 ) + 𝑐(𝑇2 ) + 𝑐(𝑒 ′‬‬
‫כעת נחליף ב‪ 𝑇′′‬את הקשת ‪ 𝑒′‬בקשת ∗ 𝑒‪ .‬כמו כן נחסיר את ) ‪ 𝑐(𝑒 ′‬משני אגפי האי‪-‬שוויון‪ ,‬ונוסיף את‬
‫) ∗ 𝑒(𝑐‪ .‬כעת מתקיים‪:‬‬
‫)𝑇(𝑐 = ) ∗ 𝑒(𝑐 ‪𝑐(𝑇 ′′ ) = 𝑐(𝑇1′′ ) + 𝑐(𝑇2′′ ) + 𝑐(𝑒 ∗ ) < 𝑐(𝑇1 ) + 𝑐(𝑇2 ) +‬‬
‫אך העץ החדש ‪( 𝑇′′‬לאחר החלפת ‪ 𝑒′‬ב‪ )𝑒 ∗-‬הוא לא מאחר העץ ‪ T‬המקורי‪ ,‬שכן הצמתים זהים‪ ,‬החלפנו‬
‫את הקשת ∗ 𝑒 ב‪ 𝑒′‬ואז החלפנו את הקשת ‪ 𝑒′‬ב∗ 𝑒 ובכך למעשה החזרנו את המצב לקדמותו‪ .‬מתקיים‬
‫𝑇 = ‪.𝑇 ′′‬‬
‫קיבלנו )𝑇(𝑐 < )𝑇(𝑐‪ ,‬בסתירה לכללי האריתמטיקה‪ .‬לכן‪ ,‬לא קיים עץ אחר ‪ 𝑇′′‬שהוא עץ פורש מזערי של‬
‫‪ ,𝐺′‬ומתקיים ) ‪.𝑐(𝑇 ′′ ) < 𝑐(𝑇 ′‬‬
‫לפיכך‪ 𝑇′ ,‬הוא אכן עץ פורש מזערי של ‪.𝐺′‬‬
‫ננתח את סיבוכיות זמן הריצה‪:‬‬
‫זמן הריצה של סריקת העץ לפי ‪ BFS‬הוא )|𝑉| ‪ 𝜃(|𝐸| +‬לפי עמוד ‪ 99‬בספר הלימוד‪.‬‬
‫זמן הריצה של מעבר על כל הקשתות ב‪ 𝑇′‬הוא )|𝐸|(𝜃‪.‬‬
‫כל שאר הפעולות רצות בזמן קבוע‪.‬‬

‫עם זאת‪ ,‬לפי עמוד ‪ 94‬בספר הלימוד‪ ,‬בכל גרף קשיר מתקיים מתקיים ‪ ,|𝐸| ≥ |𝑉| − 1‬וכל הגרפים‬
‫באלגוריתם הם קשירים (או כמעט קשירים‪ ,‬ז"א‪ ,‬תוספת של קשת אחת היתה הופכת אותם לקשירים)‬
‫ולכן מתקיים )|𝐸|(𝜃 = )|𝑉| ‪.𝜃(|𝐸| +‬‬

‫סה"כ זמן ריצה )|𝐸|(𝜃 = )|𝑉| ‪.𝑇(|𝐸|,‬‬


‫שאלה ‪:3‬‬
‫נגדיר את נוסחת ‪ 3-CNF‬הבאה‪:‬‬
‫‪𝜙 = 𝜙1 ∧ 𝜙2 ∧ 𝜙3 ∧ 𝜙4 ∧ 𝜙5 ∧ 𝜙6‬‬
‫‪𝜙1 = 𝑥1 ∨ 𝑥2 ∨ 𝑥3‬‬
‫‪𝜙2 = 𝑥1 ∨ 𝑥2 ∨ ¬𝑥3‬‬
‫‪𝜙3 = 𝑥2 ∨ 𝑥3 ∨ 𝑥4‬‬
‫‪𝜙4 = 𝑥2 ∨ 𝑥3 ∨ ¬𝑥4‬‬
‫‪𝜙5 = 𝑥3 ∨ 𝑥4 ∨ 𝑥1‬‬
‫‪𝜙6 = ¬𝑥1 ∨ ¬𝑥2 ∨ ¬𝑥3‬‬
‫נפעיל את האלגוריתם החמדן שמוצע בתרגיל ונראה שהאלגוריתם נכשל מפיק כפלט השמה לא מספקת‪,‬‬
‫למרות שהנוסחה כן ספיקה‪.‬‬
‫נספור את מספר המופעים של כל ליטרל‪ .‬נגדיר ב|𝑥| את מספר המופעים של הליטרל 𝑥 בנוסחה 𝜙‪.‬‬
‫𝟏𝒙 = 𝒙‬ ‫𝟐𝒙 = 𝒙‬ ‫𝟑𝒙 = 𝒙‬ ‫𝟒𝒙 = 𝒙‬
‫| 𝒊𝒙|‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪4‬‬ ‫‪2‬‬
‫| 𝒊𝒙¬|‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪1‬‬

‫האלגוריתם החמדן בוחר השמות שממקסמת את מספר הפסוקיות המסופקות החדשות‪ .‬ז"א‪ ,‬במקרה‬
‫שלנו‪ ,‬יגדיר 𝑇 ← ‪ .𝑥1 ← 𝑥2 ← 𝑥3 ← 𝑥4‬באופן אוטומטי מוגדר גם 𝐹 ← ‪.¬𝑥1 ← ¬𝑥2 ← ¬𝑥3 ← ¬𝑥4‬‬
‫לפיכך הנוסחה 𝜙 מקיימת‪:‬‬
‫)𝐹 ∨ 𝐹 ∨ 𝐹( ∧ )𝑇 ∨ 𝑇 ∨ 𝑇( ∧ )𝐹 ∨ 𝑇 ∨ 𝑇( ∧ )𝑇 ∨ 𝑇 ∨ 𝑇( ∧ )𝐹 ∨ 𝑇 ∨ 𝑇( ∧ )𝑇 ∨ 𝑇 ∨ 𝑇( = 𝜙‬
‫𝐹= 𝐹∧𝑇∧𝑇∧𝑇∧𝑇∧‪=T‬‬
‫וההשמה לא מספקת‪.‬‬

‫עם זאת‪ ,‬קיימת השמה שכן מספקת את 𝜙‪:‬‬


‫נגדיר 𝐹 ← ‪ ,𝑥1 ← 𝑥2 ← 𝑥4 ← 𝑇, 𝑥3‬שבעקבותיהם מוגדרים 𝑇 ← ‪ ,¬𝑥1 ← ¬𝑥2 ← ¬𝑥4 ← 𝐹, ¬𝑥3‬ואז‬
‫הנוסחה 𝜙 מקיימת‪:‬‬
‫)𝑇 ∨ 𝐹 ∨ 𝐹( ∧ )𝑇 ∨ 𝑇 ∨ 𝐹( ∧ )𝐹 ∨ 𝐹 ∨ 𝑇( ∧ )𝑇 ∨ 𝐹 ∨ 𝑇( ∧ )𝑇 ∨ 𝑇 ∨ 𝑇( ∧ )𝐹 ∨ 𝑇 ∨ 𝑇( = 𝜙‬
‫𝑇= 𝑇∧𝑇∧𝑇∧𝑇∧𝑇∧‪=T‬‬
‫ואכן הנוסחה ספיקה‪.‬‬

‫לפיכך‪ ,‬האלגוריתם החמדן לא טוב דיו‪ ,‬שכן קיימת נוסחת ‪ 3-CNF‬עליה האלגוריתם נכשל‪ ,‬שכן הנוסחה‬
‫ספיקה‪ ,‬אבל האלגוריתם מפיק כפלט השמה לא מספקת‪.‬‬
‫שאלה ‪:4‬‬
‫נראה שלכל עץ מושרש בינרי לחלוטין 𝑇 קיימת סדרת שכיחויות 𝑓 כך שאחד מעצי הופמן של הסדרה הוא‬
‫𝑇‪.‬‬
‫יהי 𝑇 עץ בינרי לחלוטין עם 𝑛 צמתים‪ .‬לכל עלה 𝑖𝑣 נגדיר שכיחות 𝑖𝑓 באופן הבא‪:‬‬
‫‪1‬‬
‫= 𝑖𝑓‬
‫)𝑖(𝑑‪2‬‬
‫נוכל להוכיח שלסדרת שכיחויות זו יש עץ הופמן שהוא ‪ T‬עצמו באינדוקציה על עומק העץ ‪.d‬‬
‫הנחת האינדוקציה‪ :‬לכל עץ בינרי לחלוטין 𝑇 שעומקו המירבי הוא 𝑑‪ ,‬אחד מעצי הופמן של סדרת‬
‫‪1‬‬
‫השכיחויות )𝑖(𝑑‪ 𝑓𝑖 = 2‬הוא 𝑇‪.‬‬

‫בדיקה כאשר 𝟎 = 𝒅‪ :‬אם העומק הוא ‪ 0‬סימן שב𝑇 יש עלה אחד‪ ,‬וסדרת השכיחויות מכילה את האיבר‬
‫‪1‬‬
‫הבודד ‪ .𝑓1 = 0 = 1‬כמובן שעץ הופמן של סדרה זו הוא גם בעל עלה אחד‪ ,‬ולכן הוא זהה ל𝑇‪.‬‬
‫‪2‬‬

‫נוכיח את נכונות טענת האינדוקציה עבור עץ בעומק 𝐝 ונוכיח את נכונותה עבור עץ בעומק 𝟏 ‪:𝒅 +‬‬
‫יהי )𝐸 ‪ 𝑇 = (𝑉,‬עץ בינרי לחלוטין עם עומק של ‪ .𝑑 + 1‬לפיכך‪ ,‬קיים לפחות צומת אחד 𝑢 המקיים‬
‫‪ .𝑑(𝑢) = 𝑑 + 1‬לפי עמוד ‪ 185‬בספר הלימוד‪ ,‬משום ש‪ T‬הוא עץ בינרי לחלוטין‪ ,‬ל𝑢 יש אח 𝑣 שהוא גם‬
‫עלה‪ ,‬וגם הוא מקיים ‪.𝑑(𝑣) = 𝑑 + 1‬‬
‫נשכפל את 𝑇 ל ‪.𝑇′‬‬
‫(*) כל עוד קיים צומת ‪ 𝑢 ∈ 𝑉𝑇′‬כך ש ‪:𝑑(𝑢) = 𝑑 + 1‬‬
‫‪2‬‬ ‫‪1‬‬
‫𝑑‪ .2𝑑+1 = 2‬את העלים‬ ‫נמצא את אחיו ‪ ,𝑣 ∈ 𝑉𝑇′‬ונציב באב שלהן את סכום השכיחויות שלהם‪:‬‬
‫𝑣 ‪ 𝑢,‬עצמם נמחק מן העץ ‪.𝑇′‬‬
‫נבחין שכל האבות לשעבר (אלה שהצבנו בהם את סכום השכיחויות של הבנים בעומק ‪ )𝑑 + 1‬הם בעומק‬
‫‪1‬‬
‫𝑑 (שכן הם אבות של צמתים בעומק ‪ ,)𝑑 + 1‬והשכיחות שלהם היא 𝑑 ‪ .‬זה תואם את סדרת השכיחויות‬
‫‪2‬‬
‫𝑖𝑓‪.‬‬
‫כמו כן‪ ,‬כבר לא קיימים צמתים בעומק ‪ ,𝑑 + 1‬שכן כולם אוחדו לעומק 𝑑‪ ,‬ולכן כעת עומק העץ הוא 𝑑‪.‬‬
‫‪1‬‬
‫קיבלנו ש‪ 𝑇′‬כעת הוא עץ בינרי לחלוטין בעומק 𝑑 שמקיים את סדרת השכיחויות )𝑖(𝑑‪.𝑓𝑖 = 2‬‬

‫לפי הנחת האינדוקציה‪ ,‬יש עץ הופמן של סדרת שכיחויות זו הזהה ל‪.𝑇′‬‬


‫נוכל לבנות ממנו את 𝑇 המקורית ע"י פעולה הפוכה לזאת שביצענו ב(*) – הוספת ‪ 2‬בנים לחלק (או כל)‬
‫הצמתים בעומק 𝑑‪ .‬ישנן אפשרויות רבות לבחירת העלים שנבצע להם הרחבה‪ ,‬וכל בחירה כזאת תוביל‬
‫לעץ בינרי שונה שהוא עץ הופמן תקין‪ .‬אחת מן האפשרויות הללו תיצור את 𝑇 המקורית (אם נזכור את‬
‫המיקום המדויק של הצמתים שמחקנו ב(*) נוכל לשחזר אותם)‪.‬‬
‫בכך השלמנו את צעד האינדוקציה‪.‬‬
‫לפיכך‪ ,‬לכל עץ מושרש בינרי לחלוטין 𝑇 קיימת סדרת שכיחויות כך שאחד מעצי הופמן של הסדרה הוא‬
‫𝑇‪.‬‬

You might also like