תרגיל בית מספר 6 )אחרון!( - להגשה עד 12 ביוני )יום ראשון( בשעה ::225 קיראו בעיון את הנחיות העבודה וההגשה המופיעות באתר הקורס, תחת התיקייה.assignments חריגה מההנחיות תגרור ירידת ציון / פסילת התרגיל. הגשה: תשובותיכם יוגשו בקובץ pdf ובקובץ py בהתאם להנחיות בכל שאלה. השתמשו בקובץ השלד skeleton6.py כבסיס לקובץ ה py אותו אתם מגישים. לא לשכוח לשנות את שם הקובץ למספר ת"ז שלכם לפני ההגשה, עם סיומת.py בסה"כ מגישים שני קבצים בלבד. עבור סטודנטית שמספר ת"ז שלה הוא 012345678 הקבצים שיש להגיש הם.hw6_012345678.py ו- hw6_012345678.pdf הקפידו לענות על כל מה שנשאלתם. תשובות מילוליות והסברים צריכים להיות תמציתיים, קולעים וברורים. להנחיה זו מטרה כפולה: 1. על מנת שנוכל לבדוק את התרגילים שלכם בזמן סביר. 2. כדי להרגיל אתכם להבעת טיעונים באופן מתומצת ויעיל, ללא פרטים חסרים מצד אחד אך ללא עודף בלתי הכרחי מצד שני. זוהי פרקטיקה חשובה במדעי המחשב. הערות: חלק מן השאלות בתרגיל זה מבוססות על שאלות ממבחנים משנים קודמות, עם שינויים מסויימים..1 ליד כל שאלה מצויין מספר הנקודות שהיא מקנה בתרגיל הבית )לא בהכרח מספר הנקודות שהשאלה היתה שווה במבחן(. ניתן להגיע למקסימום של 111 נקודות..2 שאלה 6 לא תיבדק אך היא לקוחה ממבחן ומומלץ לפתור אותה לאחר שהנושא )קודים לאיתור ותיקון שגיאות( ילמד..3 עמ' 1 מתוך 8
שאלה 1 גנרטורים )20 נק'( r,n משולש פסקל הוא משולש אינסופי המורכב משורות של מספרים, כך שבשורה ה- האיבר ה- מוגדר כ:. a nr n n! r r!( n r!) 7 השורות הראשונות במשולש הן כדלהלן: נשים לב שניתן לקבל את השורה ה- i במשולש פסקל מהשורה ה- i-1 באופן הבא: האיבר הראשון והאיבר האחרון בשורה הם תמיד 1. 1. פרט לכך, האיבר ה- j בשורה ה- i הוא סכום האיבר ה- j-1 והאיבר ה- j בשורה ה- i-1. 2. נייצג כל שורה במשולש על ידי רשימה כך שהשורה ה- 1 היא הרשימה [1], השורה ה- 1 היא הרשימה[ 1,1 ] וכו'. סעיף א השלימו בקובץ השלד את הפונקציה,next_row(row) המקבלת את השורה ה- i-1 במשולש פסקל ומחזירה את השורה ה- i. )return( סעיף ב נייצג את משולש פסקל כזרם אינסופי של רשימות בצורה הבאה: []1], [1,1], [1,2,1], [1,3,3,1], השלימו בקובץ השלד את פונקצית הגנרטור() generate_pascal אשר מחזירה גנרטור המייצר את משולש פסקל. כלומר, בכל קריאה ל- next על הגנרטור להחזיר את השורה הבאה במשולש פסקל - בצורת רשימה. דוגמת הרצה: >>> gen = generate_pascal() >>> next(gen), next(gen), next(gen) ([1], [1,1], [1,2,1]) עמ' 2 מתוך 8
סעיף ג משולש ברנולי הוא המשולש שבו כל שורה היא רשימת הסכומים החלקיים של המקדמים הבינומיים, כלומר. a nk k i0 n i במילים אחרות, כל שורה במשולש ברנולי היא רשימת הסכומים החלקיים של השורה המתאימה במשולש פסקל. בפרט, המספר ה- i בשורה ה- j של משולש ברנולי הוא סכום i המספרים הראשונים של השורה ה- j במשולש פסקל. 7 השורות הראשונות במשולש ברנולי הן כדלהלן: נייצג את משולש ברנולי בצורה הדומה למשולש פסקל, כזרם אינסופי של רשימות: [[1], [1,2], [1,3,4], [1,4,7,8] השלימו בקובץ השלד משולש ברנולי. דוגמת הרצה: את פונקצית הגנרטור() generate_bernoulli אשר מחזירה גנרטור המייצר את >>> gen = generate_ bernoulli() >>> next(gen), next(gen), next(gen) ([1], [1,2], [1,3,4]) הנחיות הגשה: ממשו את הפונקציות מסעיפים א', ב' ו ג' בקובץ השלד. עמ' 3 מתוך 8
שאלה - 2 ניקוי רעש בתמונות )20 נק'( שימו לב שעל מנת להריץ את הפונקציות בשני הסעיפים הבאים עליכם לדאוג שבתיקיה (folder) בה נמצא קובץ הקוד שלכם נמצא גם הקובץ. matrix.py א. השלימו בקובץ השלד את שלוש השורות החסרות בפונקציה,upside_down שמקבלת מטריצה שמייצגת תמונה ומחזירה מטריצה חדשה שמייצגת את התמונה שמתקבלת ע"י שיקוף התמונה על הציר האופקי. לאחר הפעלת הפונקציה תתקבל התמונה: לדוגמא עבור התמונה: הפעילו את הפונקציה על התמונה the-simpsons.bitmap המצורפת לכם בין קבצי התרגיל. ב. בין קבצי התרגיל תמצאו את קובץ התמונה.atallbuilding.bitmap כפי שתוכלו לראות, קרוב לפינה השמאלית העליונה של התמונה נמצא כתם לבן. נרצה להסיר את הכתם תוך שמירה על חדות התמונה. a. נסו להשתמש בשיטות local means, local medians אשר הוצגו בשיעור על מנת להסיר את הכתם. נסו להשתמש בגדלי סביבה שונים ולהפעיל את הניקוי מספר פעמים בזו אחר זו. צרפו לקובץ ה pdf את תוצאות פעולות הניקוי, וכן השוואה קצרה בין ביצועי השיטות והסבר להבדלים בינהן..local medians נתאר עכשיו רעיון לשיטת ניקוי שונה מעט, שהיא וריאציה על b. i. ראשית, לא ננסה "לתקן" את כל הפיקסלים בתמונה, אלא רק את הפיקסלים הבהירים מאד והכהים מאד. בפרט, נתקן רק פיקסלים עם ערכי בהירות קטנים מ 5 או גדולים מ 251. ההנחה מאחורי שינוי זה היא שהרעש יצר ערכי בהירות קיצוניים..ii בבואנו לתקן פיקסלים בהירים, נשתמש רק בפיקסלים הלא-בהירים שבסביבתם על מנת לחשב את החציון )כלומר רק בפיקסלים שערך הבהירות שלהם הוא 251 ומטה(. באופן דומה, בבואנו לתקן פיקסלים כהים נשתמש רק בפיקסלים הלא-כהים שבסביבתם )ערך בהירות 5 ומעלה( על מנת לחשב את החציון. השלימו בקובץ השלד את הפונקציה modified_ median כך שקריאה לפונקציה modified_local_medians תבצע את התיקון שתואר לעיל. modified_local_medians מקבלת אוביקט מטיפוס Matrix ומחזירה אוביקט חדש מטיפוס.Matrix צרפו לקובץ ה pdf את תוצאות פעולת הניקוי, וכן השוואה קצרה עם התוצאות הקודמות. הערה כללית לשני הסעיפים: על מנת לצרף לקובץ ה pdf את תוצאות פעולות הניקוי, הציגו את אוביקט ה Matrix החדש על המסך באמצעות הפעלת המתודה display של המחלקה,Matrix קחו screen shot )צילום מסך( של התוצאה, וצרפו את התמונה שהתקבלה. עמ' 4 מתוך 8
שאלה 3 קארפ-רבין )22 נק'( שאלה זו עוסקת באלגוריתם קארפ-רבין לחיפוש מחרוזת בטקסט. סעיף א הקוד לפונקציה find_matches_kr אשר הוצג בשיעור עלול להחזיר, בנוסף לאינדקסים של מופעי מחרוזת ה-. גם אינדקסים של תת -מחרוזות אשר אינן זהות ל- pattern, text אותה אנו מחפשים בתוך מחרוזת ה- pattern אינדקסים כאלה נקראים, false positive כלומר מופעים שקריים שהקוד מחזיר בטעות. השלימו בקובץ השלד את הפונקציה find_matches_kr_safe אשר מבוססת על find_matches_kr אבל לא מחזירה לעולם false positive )וכמובן עדיין מחזירה את האינדקסים של כל המופעים האמיתיים של pattern ב - )text סעיף ב נתונה מחרוזת text באורך n ומחרוזת pattern באורך m, והניחו כי אנו משתמשים בערכי ברירת המחדל של r ושל base אשר ראינו בכתה. באיזה תרחיש )כלומר עבור אילו מחרוזות text ו- )pattern יגרום השינוי שביצעתם בסעיף א' לשינוי הגדול ביותר בזמן הריצה לעומת הקוד המקורי? תנו דוגמה והסבירו. מהי סיבוכיות הזמן במקרה זה? השוו אותה לזו של הפונקציה המקורית. סעיף ג נניח שמריצים את אלגוריתם קארפ-רבין על text ו- pattern אקראיים, כלומר כאלה שכל תו בהם מוגרל בהסתברות שווה מתוך האלפבית. האם צפוי הבדל בין זמן הריצה של הפונקציה המקורית לבין זה של הפונקציה שכתבתם בסעיף א'? הביאו דוגמאות הרצה ונמקו את מסקנתכם. אין צורך לבצע ניתוח סיבוכיות פורמלי. סעיף ד להלן פונקצית fingerprint אלטרנטיבית: def fingerprint_new (string, r=2**32-3): partial_sum=0 for x in string: partial_sum = (partial_sum + ord(x)) % r return partial_sum ממשו את הפונקציה (32-3**2=r text_fingerprint_new(string, length, כך שתפעל בדומה ל text_fingerprint המקורית אך תשתמש ב fingerprint_new לחישוב ה.fingerprints מה סיבוכיות זמן הריצה של text_fingerprint_new על מחרוזת באורך n? הסבירו. חוו דעתכם האם זו שיטה טובה לחישוב.fingerprints נמקו והדגימו, אם יש צורך. הנחיות הגשה: השלימו את קוד הפונקציות מסעיפים א' וד' בקובץ השלד. את התשובות המילוליות לסעיפים ב', ג', ד' רשמו בקובץ ה-.pdf עמ' 5 מתוך 8
שאלה 4 דחיסת האפמן )22 נק'( מועצת החכמים הבינלאומית לדחיסה קיבלה החלטה להחליף את הטכנולוגיה הספרתית הבינארית )המתבססת על שני ערכים 1 ו- ( 1 בטכנולוגיה ספרתית טרינארית: מידע ייוצג באמצעות שלושה ערכים שיסומנו,1 1 ו- 2.ברצוננו להתאים את האלגוריתם לבניית עצי האפמן לשיטה זו. בכל שלב האלגוריתם יאחד שלושה צמתים )במקום שניים( בעלי השכיחויות המינימליות. במקרה של יותר ממינימום אחד הבחירה ביניהם שרירותית. בנוסף, בחירת הסדר בין הבנים של צומת )שמאל, מרכז, ימין( היא שרירותית ואין לה חשיבות בשאלה זו. מכאן שלכל צומת בעץ שאיננו עלה יהיו כעת 3 בנים. יוצא דופן אחד הוא שורש העץ: אם מספר התווים השונים זוגי, לשורש יהיו רק שני בנים. א. נתון קורפוס המכיל את k התווים התפלגות התווים בקורפוס מקיימת את הכלל הבא: תדירות התו כאשר k מספר אי-זוגי כלשהו ומתקיים היא. נתון כי ב., ציירו את המבנה הכללי של עץ האפמן )טרינארי( המתקבל, ציינו את השכיחויות בעלים )אין צורך לתאר את שלבי בניית העץ(. נתון קובץ שמכיל תווים מתוך אלפבית בן בנוסף נתון קורפוס עם תדירויות: ומתקיים: תווים. )כאשר ). יהי p התו בעל התדירות המינימלית ( יהיו מהו ההפרש בין שדרושים כדי לקודד את התו (, ו- קודי ההאפמן שמתקבלים עבור התווים התו בעל התדירות המקסימלית ( בהתאמה. )מספר הביטים שדרושים כדי לקודד את התו.) ) לבין? ) ג. נתון קורפוס שמכיל את 01 התווים האחרים הינה 1. בונים מקורפוס זה עץ האפמן טרינארי., שכיחות התו )מספר הביטים הינה k ושכיחות כל 77 התווים.i.ii מהו k המינימלי שמבטיח שהתו יקבל קידוד באורך ביט אחד בלבד? מהו אורך הקידוד המקסימלי לתו בקורפוס במקרה זה? עליכם לתת הוכחה מנומקת לכל אחת מקביעותיכם. עמ' 6 מתוך 8
)20 נק'( שאלה 2 זיו למפל כזכור, באלגוריתם Lempel-Ziv דוחסים חזרות באורך לפחות 3 )מתעלמים מחזרות באורך 1,2 משום שדחיסתן אינה משתלמת(. אם נסמן ב- L את אורך החזרה המינימלי שהאלגוריתם דוחס, אז 3=L. האם תיתכן מחרוזת שדחיסתה עם 4=L תהיה יעילה יותר מאשר עם 3=L? כלומר האם ייתכן שגם אם גילינו חזרה באורך 3, ישתלם לא לדחוס אותה? אם לדעתכם כן, רשמו דוגמה למחרוזת כזו, וכן את את ייצוג הביניים* של הדחיסה, עבור 3=L ועבור 4=L. אם לדעתכם לא, הסבירו מדוע. * דוגמה לייצוג ביניים: ייצוג הביניים של המחרוזת abcabcdedede הוא [ a, b, c,(3,3), d, e,(2,4)] א..i ב. לפניכם מוצג קוד עבור הפונקציה genstring(n) שמייצרת מחרוזת באורך n מתוך התפלגות ידועה של שכיחות אותיות )הנתונה ע"י המחרוזת freq בקוד(. def genstring(n): freq = 'a'*25+'bcdefghijklmnopqrstuvwxyz' randletters = [random.choice(freq) for i in range(n)] return ''.join(randletters) תהי.s=genString(100000) איזו דחיסה צפויה לתת יחס דחיסה טוב יותר עבור Huffman s: או?Lempel-Ziv הסבירו את תשובתכם בצירוף מספר דוגמאות הרצה שיתמכו בה. אין צורך בהוכחה מתמטית פורמלית. הבהרה: קידוד Huffman כאן ישתמש ב- s הן בתור corpus והן בתור.text נחליף את המחרוזת freq במחרוזת הבאה: 'a'*2500+'bcdefghijklmnopqrstuvwxyz' freq = האם לדעתכם התשובה תשתנה? הסבירו..ii ג. נניח שעבור טקסט באורך n, מאפשרים לאורך החזרה המקסימלי באלגוריתם Lempel-Ziv להיות 1-n )במקום 31 כפי שמופיע בערכי ברירת המחדל של האלגוריתם שהוצג בהרצאה(. שאר פרטי האלגוריתם ללא שינוי. רוצים לדחוס באופן זה את המחרוזת 01010101 באורך n. כיצד נראה ייצוג הביניים של הדחיסה? מהו יחס הדחיסה )=מספר הביטים במחרוזת הדחוסה חלקי מספר הביטים במחרוזת ללא שימוש בדחיסת למפל-זיו( כתלות ב- n? תנו תשובה בסדר גודל במונחים של ( )O. טיפ: כדאי לבדוק את התשובות בשאלה זו ע"י הרצות... עמ' 7 מתוך 8
שאלה 6 קודים לאיתור ולתיקון שגיאות )לא להגשה( חלק ראשון הקוד לתיקון טעויות המתואר כאן מעתיק 3 ביטים של אינפורמציה למילות קוד בנות 7 ביטים, על פי הסכמה הבאה: (x 1, x 2, x 3 ) (x 1, x 2, x 3, x 1 + x 2, x 1 + x 3, x 2 + x 3, x 1 + x 2 +x 3 ) כאשר הסכומים מחושבים מודולו 2. א. בטבלה הבאה, השלימו בכל שורה את מילת הקוד המתקבלת מ- 3 הביטים הרשומים בה. (x 1, x 2, x 3 ) (x 1, x 2, x 3, x 1 + x 2, x 1 + x 3, x 2 + x 3, x 1 + x 2 +x 3 ) (0, 0, 0) (0, 0, 1) (0, 1, 1) (1, 1, 1) ב. מהו המרחק המינימלי, d, של הקוד? רשמו שתי מילות קוד שונות w, 1, w 2 שהמרחק ביניהן הוא d. ג. כך שיש שתי מילות קוד שונות w, 1, w 2 המקיימות: המרחק של שתיהן מ- טענה: קיימת מילה y שווה, ומרחק זה הוא המרחק המינימלי מ- y למילת קוד כלשהי. החליטו אם הטענה הנ"ל נכונה. אם לדעתכם הטענה נכונה תנו דוגמה ל- w 2 w, 1 y, כאלו. אחרת הסבירו מדוע לא. חלק שני להלן פונקציית קידוד עבור קוד חדש בשם, bad_coding המקבלת רשימת ביטים x ומוציאה רשימת ביטים. def bad_coding(x): z = (x[0]+x[1]) % 2 return (x+[z])*4. תזכורת: קוד עם מרחק מינימלי נקרא קוד מטיפוס האורך של x יסומן כרגיל ב- x..[n=, k=, d= ] השלימו את המשפט הבא: bad_coding הוא קוד מטיפוס סוף עמ' 8 מתוך 8