55:11 בשעה ביוני 51 להגשה עד 7- תרגיל בית מספר

‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪4102‬‬
‫תרגיל בית מספר ‪ - 7‬להגשה עד ‪ 51‬ביוני בשעה ‪55:11‬‬
‫אחרון! אחרון!‬
‫אחרון! אחרון! אחרון!‬
‫אחרון!‬
‫שימו לב‪ :‬בתרגיל זה ניתן להגיע למקסימום של ‪ 121‬נקודות !‬
‫אנו ממליצים מאוד להגיש אותו‪.‬‬
‫קיראו בעיון את הנחיות העבודה וההגשה המופיעות באתר הקורס‪ ,‬תחת התיקייה‬
‫‪ .assignments‬חריגה מההנחיות תגרור ירידת ציון ‪ /‬פסילת התרגיל‪.‬‬
‫הנחיות והערות ספציפיות לתרגיל זה‪:‬‬
‫‪‬‬
‫קוד משאלות ‪2‬א'‪2 ,‬ב' ו‪2 -‬ג' יש לממש בקובץ השלד (‪ )skeleton7.py‬המצורף לתרגיל זה‪ .‬אין לצרף לקובץ ה‪-‬‬
‫‪ py‬את הקוד ששימש לפתרון יתר השאלות‪.‬‬
‫‪‬‬
‫קובץ השלד מכיל כבר ייבוא של חבילות הדרושות לעבודה עם תמונות וכן פונקציות שימושיות שראיתם‬
‫בכיתה‪ .‬על הקובץ ‪ matrix.py‬להיות בספריה ממנה אתם מריצים את קובץ הפתרונות שלכם‪ .‬אין לשנות את‬
‫הקובץ ‪ matrix.py‬או את הפונקציות הקיימות בקובץ השלד‪ .‬מותר להוסיף לקובץ השלד פונקציות עזר‬
‫לבחירתכם‪ ,‬כולל כמובן פונקציות שראיתם בכיתה‪.‬‬
‫‪‬‬
‫בקובץ השלד תמצאו פונקציה ‪ test‬שמטרתה לעזור לכם לבדוק את עצמכם‪ .‬זיכרו שהבדיקות שבה מכסות‬
‫רק חלק מהמקרים שייבדקו על ידנו‪.‬‬
‫‪‬‬
‫כל יתר השאלות – נא להגיש בקובץ ‪ pdf‬בלבד‪.‬‬
‫‪‬‬
‫שימו לב‪ :‬מותר להוסיף לקובץ השלד פונקציות נוספות שכתבתם או שנלמדו בכיתה‪ ,‬אך אין לשנות את‬
‫חתימת הפונקציות שהוגדרו בשאלות‪ ,‬אחרת הבדיקות האוטומטיות ייכשלו‪.‬‬
‫לא לשכוח לשנות את שם הקובץ למספר ת"ז שלכם לפני ההגשה‪ ,‬עם סיומת ‪.py‬‬
‫‪‬‬
‫בסה"כ מגישים שני קבצים בלבד‪ .‬עבור סטודנטית שמספר הזהות שלה הוא ‪ 012345678‬הקבצים‬
‫שיש להגיש הם ‪ 012345678.pdf‬ו‪.012345678.py -‬‬
‫‪‬‬
‫הקפידו לענות על כל מה שנשאלתם‪.‬‬
‫‪‬‬
‫תשובות מילוליות והסברים צריכים להיות תמציתיים‪ ,‬קולעים וברורים‪.‬‬
‫להנחיה זו מטרה כפולה‪:‬‬
‫‪ .1‬על מנת שנוכל לבדוק את התרגילים שלכם בזמן סביר‪.‬‬
‫‪ .2‬כדי להרגיל אתכם להבעת טיעונים באופן מתומצת ויעיל‪ ,‬ללא פרטים חסרים מצד אחד אך ללא‬
‫עודף בלתי הכרחי מצד שני‪ .‬זוהי פרקטיקה חשובה במדעי המחשב‪.‬‬
‫עמ' ‪ 1‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪4102‬‬
‫שאלה ‪ – 5‬זיו למפל‬
‫סעיף א‬
‫כזכור‪ ,‬באלגוריתם ‪ Lempel-Ziv‬דוחסים חזרות באורך לפחות ‪( 3‬מתעלמים מחזרות באורך ‪ 1,2‬משום שדחיסתן‬
‫אינה משתלמת)‪ .‬אם נסמן ב‪ L-‬את אורך החזרה המינימלי שהאלגוריתם דוחס‪ ,‬אז ‪.L=3‬‬
‫האם תיתכן מחרוזת שדחיסתה עם ‪ L=4‬תהיה יעילה יותר מאשר עם ‪ ?L=3‬אם לדעתכם כן‪ ,‬רשמו את המחרוזת ואת‬
‫ייצוג הביניים* של הדחיסה‪ ,‬עבור ‪ L=3‬ועבור ‪ .L=4‬אם לדעתכם לא‪ ,‬הסבירו מדוע‪.‬‬
‫* דוגמא לייצוג ביניים‪ :‬ייצוג הביניים של המחרוזת ’‪ ‘abcabcdedede‬הוא ])‪[‘a’,’b’,’c’,(3,3),’d’,’e’,(2,4‬‬
‫סעיף ב‬
‫‪.i‬‬
‫לפניכם מוצג קוד עבור הפונקציה )‪ genString(n‬שמייצרת מחרוזת באורך ‪ n‬מתוך התפלגות ידועה של‬
‫שכיחות אותיות (הנתונה ע"י המחרוזת ‪ freq‬בקוד)‪.‬‬
‫‪def genString(n):‬‬
‫‪freq = 'abcdefghij' + 'k'*10‬‬
‫])‪randLetters = [random.choice(freq) for i in range(n‬‬
‫)‪return ''.join(randLetters‬‬
‫תהי )‪ .s=genString(1000‬איזו דחיסה צפויה לתת יחס דחיסה טוב יותר עבור ‪ Huffman :s‬או ‪Lempel-‬‬
‫‪ ?Ziv‬הסבירו את תשובתכם‪.‬‬
‫הבהרה‪ :‬קידוד ‪ Huffman‬כאן ישתמש ב‪ s-‬הן בתור ‪ corpus‬והן בתור ‪.text‬‬
‫‪.ii‬‬
‫נחליף את המחרוזת ‪ freq‬במחרוזת הבאה‪:‬‬
‫‪freq = 'abcdefghij' + 'k'*1111‬‬
‫האם לדעתכם התשובה תשתנה? הסבירו‪.‬‬
‫הערה‪ :‬בסעיפים ‪ i‬ו‪ ii -‬אין חובה לתת ניתוח מתמטי מדויק בתשובה‪ .‬מספיק לתת הסבר כללי‪ ,‬קולע‪ ,‬שמתייחס‬
‫לפרטים הרלוונטיים באלגוריתמים ולקלט‪.‬‬
‫סעיף ג‬
‫נניח שעבור טקסט באורך ‪ ,n‬מאפשרים לאורך החזרה המקסימלי באלגוריתם ‪ Lempel-Ziv‬להיות ‪n-1‬‬
‫(במקום ‪ 31‬כפי שמופיע בערכי ברירת המחדל של האלגוריתם שהוצג בהרצאה)‪ .‬שאר פרטי האלגוריתם ללא‬
‫שינוי‪ .‬רוצים לדחוס באופן זה את המחרוזת ’…‪ ‘01010101‬באורך ‪.n‬‬
‫כיצד נראה ייצוג הביניים של הדחיסה? מהו יחס הדחיסה (=מספר הביטים במחרוזת הדחוסה חלקי מספר‬
‫הביטים במחרוזת ללא דחיסה) כתלות ב‪ ?n -‬תנו תשובה בסדר גודל במונחים של )…(‪O‬‬
‫בונוס‪ :‬רישמו את הביטוי המדויק ליחס הדחיסה‪.‬‬
‫עמ' ‪ 2‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪4102‬‬
‫סעיף ד‬
‫נניח‪ ,‬כי בנוסף לשינוי שתואר בסעיף ג'‪ ,‬מכניסים את שני השינויים הבאים באלגוריתם‪:‬‬
‫‪-‬‬
‫אין אפשרות לחפיפה בין סגמנטים חוזרים‪ .‬במילים אחרות‪ ,‬החזרה לא תוכל לעבור את‬
‫הנקודה הנוכחית בטקסט‪ .‬למשל‪ ,‬ייצוג הביניים של המחרוזת ’‪ ‘abcabcabc‬יהיה‬
‫])‪ [‘a’,’b’,’c’,(3,3),(3,3‬במקום ייצוג הביניים באלגוריתם הרגיל ‪.[‘a’,’b’,’c’,(3,6)] -‬‬
‫‪-‬‬
‫גודל החלון יוגבל ל‪( n-1 -‬במקום ‪ 6104‬כפי שמופיע בערכי ברירת המחדל של האלגוריתם‬
‫שהוצג בהרצאה)‪.‬‬
‫כיצד יראה כעת ייצוג הביניים של המחרוזת ’…‪ ‘01010101‬באורך ‪ ?n‬מהו יחס הדחיסה כתלות ב‪?n -‬‬
‫הניחו לשם פשטות כי ‪ n‬הוא חזקה שלמה של ‪ ,2‬ותנו תשובה בסדר גודל ()…(‪ .)O‬הסבירו את תשובתכם‪.‬‬
‫טיפ‪ :‬אתם יכולים לבדוק את התשובות לכל הסעיפים ע"י הרצות‪...‬‬
‫שאלה ‪ - 5‬תמונות‬
‫א‪ .‬להלן תמונה סינתטית‪ ,‬בגודל ‪:212X212‬‬
‫כיתבו פונקציה ‪ syn‬שלא מקבלת שום פרמטר ומחזירה אובייקט מהמחלקה ‪ Matrix‬שמייצג תמונה זו בדיוק‪.‬‬
‫כלומר כאשר מריצים )(‪ syn().display‬נפתח חלון עם התמונה הזו‪.‬‬
‫הבהרות‪:‬‬
‫‪-‬‬
‫מרכז הריבוע הפנימי ממוקם במרכז התמונה בדיוק‪ ,‬ואורך צלעו היא מחצית מאורך (או רוחב) התמונה‪.‬‬
‫הצלע השמאלית והימנית של ריבוע זה הן בלבן מוחלט‪ ,‬שמתחלף בהדרגה לשחור מוחלט כאשר נכנסים‬
‫פנימה לכיוון מרכז הריבוע‪ .‬מעל ומתחת לריבוע ישנם ‪ 6‬פסים לבנים (‪ )222‬בעלי עובי זהה‪ ,‬כאשר המרווח בין‬
‫זוג פסים סמוכים (או בין הריבוע לפס הסמוך אליו) הוא כעובי פס‪ .‬כפי שניתן לראות‪ ,‬הפסים אינם חורגים‬
‫מאלכסוני התמונה‪.‬‬
‫עמ' ‪ 3‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪4102‬‬
‫ב‪ .‬כיתבו פונקציה ‪ sun‬שמקבלת מטריצה (אובייקט מהמחלקה ‪ )Matrix‬המייצגת תמונה‪ ,‬ומחזירה מטריצה‬
‫המייצגת תמונה זהה‪ ,‬עם תוספת של שמש בצבע לבן (‪ .)222‬מרכז השמש ימוקם במרכז הרביע השמאלי העליון‬
‫של התמונה (כלומר עבור מטריצה בעלת ‪ n‬שורות ו‪ m-‬עמודות מרכז השמש יהיה הפיקסל בשורה ‪ n//4‬ובעמודה‬
‫‪ – )m//4‬ראו בדוגמה‪ .‬קוטר העיגול יהיה ‪ 21‬פיקסלים בדיוק‪ .‬עובי כל אחת מ‪ 8 -‬הקרניים הוא פיקסל אחד‪,‬‬
‫ואורכה הוא ‪ 11‬פיקסלים ממרכז העיגול (כולל פיקסל המרכז)‪ .‬להלן דוגמה לתוצאה של )(‪sun(im).display‬‬
‫כאשר ‪ im‬היא מטריצה שמייצגת את התמונה שבקובץ ‪ test_image.jpg‬המצורף לתרגיל‪.‬‬
‫הערות‪:‬‬
‫ העיגול לא צריך להיות עיגול מושלם‪ ,‬אלא קירוב סביר שלו (שהרי אנו עובדים ברזולוציה סופית‪,‬‬‫ולא ניתן באמת לייצר קו עקום)‪.‬‬
‫ מותר להניח שהתמונה גדולה מספיק כדי לכלול את התוספת‪.‬‬‫צלמו איזור כלשהו לבחירתכם (עדיף ברחבי קמפוס האוניברסיטה‪,‬‬
‫למשל איזור בניין שרייבר‪ ,‬אך לא חובה)‪ ,‬בשעות החשיכה‪ ,‬כך שלפחות‬
‫הרביע השמאלי העליון של התמונה יכיל שמיים בצבע כהה‪ .‬הוסיפו‬
‫לתמונה שמש באמצעות הפונקציה שלכם מסעיף ב'‪ .‬הגישו בקובץ ה‪-‬‬
‫‪ pdf‬את התמונה המקורית‪ ,‬את התמונה לאחר הוספת השמש‪ ,‬וציינו‬
‫היכן צולמה התמונה‪.‬‬
‫הערה‪ :‬כדאי שנפח הזיכרון של התמונה המקורית שצילמתם לא יעלה‬
‫על כמה עשרות ‪ ,Kilobytes‬אחרת הקוד ירוץ מאוד לאט‪ .‬אפשר‬
‫להקטין את הנפח באמצעות תוכנת ‪ ,Paint‬למשל (לעשות ‪stretch‬‬
‫לאחוז נמוך מספיק‪ ,‬נניח ‪.)21%‬‬
‫ג‪.‬‬
‫בסעיף זה עליכם לכתוב פונקציה ‪ clean‬בהתאם להסבר הבא‪ :‬לתרגיל מצורפת תמונה‬
‫‪ band_name_SP90.bmp‬של אחת הלהקות האהובות על מיכל שמופיעות בארץ בקרוב‪ .‬מיכל זכתה בכרטיס‬
‫להופעה של להקה זו וכתבה על פתק את שם הלהקה‪ ,‬אך אבוי – בעת ארוחת צהרים משותפת של צוות הקורס‬
‫נשפך בטעות המון מלח ופלפל על הפתק‪ ,‬בדיוק בהתאם למודל רעש מסוג ‪ Salt&Pepper‬בהסתברות ‪0.9‬‬
‫(כלומר רק ‪ 11%‬מהפיקסלים המקוריים נשארו כפי שהם‪ ,‬כל היתר הפכו – בהסתברות שווה – ללבן מוחלט או‬
‫לשחור מוחלט)‪ .‬עזרו למיכל לנקות את התמונה ולגלות מה שם ההלהקה כדי שלא תחמיץ את ההופעה‪...‬‬
‫לשם כך עליכם להשלים את מימוש הפונקציה ‪ clean‬בקובץ השלד שתבצע ניקוי רעש לתמונה "המלוכלכת"‪.‬‬
‫‪band_name_SP90.bmp‬‬
‫עמ' ‪ 6‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬
‫אוניברסיטת תל אביב ‪ -‬בית הספר למדעי המחשב‬
‫מבוא מורחב למדעי המחשב‪ ,‬אביב ‪4102‬‬
‫רמזים‪:‬‬
‫‪ .1‬איזו שיטת ניקוי נעדיף – חציון מקומי או ממוצע מקומי?‬
‫‪ .2‬אם הקוד שראיתם בהרצאות ובתרגולים לא יהיה יעיל מספיק לזיהוי המספר‪ ,‬נסו לשנות אותו מעט‪,‬‬
‫בדרך כלשהי שלדעתכם יכולה לשפר את איכות הניקוי‪ .‬שימו לב שאין פה פתרון אחד נכון‪ .‬ניתן לפעול‬
‫בכל דרך שנראית לכם‪.‬‬
‫בקובץ ה‪ pdf -‬צרפו את תמונת הפתק (לאחר הפעלת פונקציית הניקוי שכתבתם) כאשר שם הלהקה קריא ככל‬
‫שתוכלו‪ .‬לניקוי מוצלח במיוחד יינתן בונוס של עד ‪ 51‬נקודות‪ .‬כמו כן צרפו הסבר על הדרך בה ניקיתם את‬
‫התמונה‪ ,‬כולל השיקולים (המוצלחים והשגויים) שהפעלתם לאורך התהליך‪ .‬בקובץ השלד השלימו את המימוש‬
‫של הפונקציה ‪ ,clean‬כך שכאשר נריץ )(‪ clean(im).display‬על מטריצה ‪ im‬שמייצגת את התמונה המלוכלכת‬
‫הנ"ל‪ ,‬תופיע בדיוק התמונה הנקייה שצרפתם ל‪.pdf -‬‬
‫שאלה ‪ - 3‬איתור ותיקון שגיאות‬
‫השאלה עוסקת בקוד גילוי שגיאות המשלב קוד זוגיות (‪ )parity bit‬עם קוד חזרות (‪.)repetition‬‬
‫בהינתן הודעה באורך ‪ ,3‬נוסיף בסוף ביט זוגיות (‪ )XOR‬עבור שלושת הביטים‪ ,‬ואז נשכפל את כל ‪ 6‬הביטים‪.‬‬
‫בסה"כ‪ ,‬עבור הודעה של ‪ 3‬ביטים משדרים ‪ 8‬ביטים‪.‬‬
‫למשל (הביטים שנוספו מודגשים בקו)‪:‬‬
‫הודעה‬
‫שדר‬
‫‪010 01010101‬‬
‫‪110 11001100‬‬
‫א‪ .‬כמה שדרים חוקיים (‪ )codewords‬יש?‬
‫ב‪ .‬מהו ‪ ,d‬מרחק ‪ Hamming‬המינימלי של הקוד (המרחק המינימלי בין שני שדרים חוקיים כלשהם)?‬
‫ג‪.‬‬
‫להלן ‪ 3‬שדרים שנתקבלו‪ .‬ציינו עבור כל שדר‪:‬‬
‫‪‬‬
‫האם כלל לא נפלו בו שגיאות‪ ,‬או שנפלה שגיאה אחת‪ ,‬או שאולי נפלו בו שתי שגיאות‪.‬‬
‫‪ ‬אם ניתן לשחזר את ההודעה המקורית ‪ -‬רישמו גם את ההודעה המקורית (‪ 3‬ביטים)‪.‬‬
‫אנחנו מניחים כי שגיאות בביטים שונים הן בלתי תלויות וכי ההסתברות לשגיאה בכל ביט נמוכה מאוד‪,‬‬
‫ומתייחסים תמיד להודעה המקורית הסבירה ביותר‪.‬‬
‫השדרים שנתקבלו‪:‬‬
‫‪1 1 1 0 1 1 1 0 .a‬‬
‫‪0 1 0 1 1 1 0 1 .b‬‬
‫‪0 0 1 1 0 0 1 1 .c‬‬
‫סוף‪.‬‬
‫עמ' ‪ 2‬מתוך ‪5‬‬
‫‪CC BY-NC-SA 3.0‬‬