ב ה ד ג ב ב אוניברסיטת תל אביב - בית הספר למדעי המחשב מבוא מורחב למדעי המחשב, חורף 3102 32:22 תרגיל בית מספר 6 - להגשה עד 66 בינואר 3162 בשעה קיראו בעיון את קובץ הנחיות הגשת תרגילי בית שמופיע באתר את הפונקציות משאלות 2,1,5,4 הגישו בקובץ py אחד הקפידו על שמות הפונקציות כפי שהן מצוינות בשאלות לנוחיותכם, לשאלה 5 מצורף קובץ skeleton המכיל את חתימות כל הפונקציות שעליכם לממש בשאלה זו כדי למנוע בלגן במהלך העבודה על תרגיל הבית, אנו ממליצים לעבוד עם קובץ py נפרד עבור כל שאלה למרות זאת, בסיום התרגיל אתם מתבקשים ליצור קובץ יחיד בשם 123456789py )עם תעודת הזהות שלכם( שמכיל את כל הפונקציות שנתבקשתם לממש בכל השאלות יחד הקפידו לבדוק את תקינות קובץ ה- py שאתם מגישים על ידי הרצה מדוקדקת של הפונקציות את התשובות הסופיות לשאלות 1 א, 1 בסה"כ מגישים שני קבצים בלבד הקפידו לענות על כל מה שנשאלתם 4, 5, 3,, 3 א, 3 גישו בקובץ docx,doc או pdf אחד שאלה 6 ממשו גנרטור בעל החתימה takeonly(it,pred,n) שמקבל איטרטור it ו פונקציה pred שמקבלת ארגומנט יחיד ומחזירה True/False )פונקציה כזאת נקראת פרדיקט( הגנרטור מייצר את האיברים של it לפי סדרם אם הם עונים על התנאי pred כלומר takeonly מייצר תת-סדרה של איברי it המכילה את כל האיברים x עבורם pred(x)=true אם n איברים רצופים אינם עונים לתנאי takeonly מפסיק לייצר איברים לדוגמא: list(takeonly(iter(range(30)),lambda x: x%3==1,5)) = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28] list(takeonly(iter(range(30)),lambda x: x<10 or x%7==0,5)) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14] ממשו גנרטור בעל החתימה blocks(it,k) שמקבל איטרטור it ומספר k ומחזיר רשימות של איברים עוקבים מתוך it שאורכן k למשל, שלושת האיברים הראשונים שיוחזרו ע"י blocks עם 3=k הם: הם איברי it אם it מייצר מס' איברים סופי כאשר שאינו מתחלק ב- k, blocks יחזיר בלוק אחרון שאורכו קצר יותר מ- k לדוגמא: list(blocks(iter(range(10)),5)) = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]] list(blocks(iter(range(10)),3)) = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] שימו לב: האיטרטורים שניתנים כקלט אינם בהכרח סופיים שאלה 3 אלגוריתם המיון bubble-sort פועל על רשימה מקושרת שאיבריה הם מספרים באופן הבא:
ל( 2 בכל איטרציה נסרוק את כל איברי הרשימה לפי סדרם: כאשר שני איברים סמוכים מקיימים : החלף בין האיברים a נעבור לזוג האיברים הסמוכים הבא נשים לב שלאחר החלפה האיבר הפך להיות b - ההשוואה הבאה תשווה את )שעכשיו נמצא במקום ה- 1 נסיים כאשר מתבצעת סריקה מלאה של הרשימה מבלי שבוצעה החלפה נשים לב שהדבר מעיד על כך שהרשימה ממוינת לצורך דוגמא נציג את פעולת bubble-sort על הרשימה [3,2,1,5,4,10,8,7,9,6] נרשום את מצב הרשימה לאחר כל איטרציה: [3,2,1,5,4,10,8,7,9,6] [2,1,3,4,5,8,7,9,6,10] [1,2,3,4,5,7,8,6,9,10] [1,2,3,4,5,7,6,8,9,10] [1,2,3,4,5,6,7,8,9,10] כמה איטרציות עוברות )לכל היותר( עד שהאיבר הגדול ביותר ברשימה נמצא במקומו? כמה איטרציות עוברות )לכל היותר( עד שהאיבר הקטן ביותר ברשימה נמצא במקומו? הבהרה: איטרציה בהקשר זה היא סריקה אחת של כל הרשימה מתחילתה ועד סופה למשל בדוגמה הקודמת בוצעו 4 איטרציות מהו זמן הריצה של אלגוריתם bubble-sort במקרה הגרוע כתלות באורך הרשימה n )במונחי סדר גודל ( )O(? תנו דוגמא לרשימה באורך 21 עבורה מתקבל זמן הריצה הגרוע ביותר סעיף ג לתרגיל מצורף קובץ LinkedListspy המכיל את class linked_list שראיתם בכיתה ממשו פונקציה עם החתימה bubblesort(linklst) שממיינת רשימה מקושרת )אובייקט מסוג linked_list באמצעות bubble- sort על הפונקציה למיין את הרשימה,in-place כלומר: 2 הפונקציה משנה את הייצוג הפנימי של הרשימה linklst שהתקבלה כקלט 1 ניתן ליצור לכל היותר מספר קבוע של אובייקטים חדשים מסוג Node או linked_list ניתן לייצר k אובייקטים חדשים, בתנאי ש- k נותר קבוע, ללא תלות באורך הרשימה הפונקציה אינה נדרשת להחזיר ערך כלשהו שאלה 2 כזכור, באלגוריתם Lempel-Ziv דוחסים חזרות באורך לפחות 3 )מתעלמים מחזרות באורך 2,1 משום שדחיסתם אינה משתלמת( אם נסמן ב- L את אורך החזרה המינימלי שהאלגוריתם דוחס, אז 3=L האם תיתכן מחרוזת שדחיסתה עם 4=L תהיה יעילה יותר מאשר עם 3=L? אם לדעתכם כן, רשמו את המחרוזת ואת ייצוג הביניים של הדחיסה, עבור 3=L ועבור 4=L אם לדעתכם לא, הסבירו מדוע עמוד 2 מתוך 7
דוגמא לייצוג ביניים: ייצוג הביניים של המחרוזת abcabcdedede הוא [ a, b, c,(3,3), d, e,(2,4)] נניח שעבור טקסט באורך n, מאפשרים לאורך החזרה המקסימלי באלגוריתם Lempel-Ziv להיות 1-n )במקום 32 כפי שמופיע בערכי ברירת המחדל של האלגוריתם שהוצג בכיתה( שאר פרטי האלגוריתם ללא שינוי רוצים לדחוס באופן זה את המחרוזת 01010101 באורך n i כיצד נראה ייצוג הביניים של הדחיסה? מהו יחס הדחיסה )=אורך המחרוזת הדחוסה חלקי אורך המחרוזת ללא דחיסה( כתלות ב- n? תנו תשובה בסדר גודל )( )O( בונוס 4 נקודות: רישמו את הביטוי המדויק ליחס הדחיסה )הבונוס יינתן רק לביטוי ללא אף שגיאה( ii נניח כי בנוסף לשינוי הנ"ל, מכניסים את השינוי הבא באלגוריתם: אין אפשרות לחפיפה בין סגמנטים חוזרים במילים אחרות, החזרה לא תוכל לעבור את הנקודה הנוכחית בטקסט למשל, ייצוג הביניים של המחרוזת abcabcabc יהיה [ a, b, c,(3,3),(3,3)] במקום ייצוג הביניים באלגוריתם הרגיל - [ a, b, c,(3,6)] כיצד יראה כעת ייצוג הביניים של המחרוזת 01010101 באורך n? מהו יחס הדחיסה כתלות ב- n? הניחו לשם פשטות כי n הוא חזקה שלמה של 1, ותנו תשובה בסדר גודל )( )O( הסבירו את תשובתכם סעיף ג i לפניכם מוצג קוד עבור הפונקציה genstring(n) שמייצרת מחרוזת באורך n מתוך התפלגות ידועה של שכיחות אותיות )הנתונה ע"י המחרוזת freq בקוד( def genstring(n): freq = 'a'*26+'bcdefghijklmnopqrstuvwxyz' randletters = [randomchoice(freq) for i in range(n)] return ''join(randletters) נניח ש- s הינה מחרוזת המיוצרת ע"י s=genstring(100000) איזו דחיסה צפויה לתת יחס דחיסה טוב יותר עבור s? קידוד Huffman או?Lempel-Ziv הסבירו את תשובתכם הבהרה: קידוד Huffman כאן ישתמש ב- s הן בתור corpus והן בתור,text כלומר הקידוד יבנה בהתאם לשכיחות האותיות במחרוזת s עצמה נחליף את המחרוזת freq במחרוזת הבאה: freq = 'a'*2600+'bcdefghijklmnopqrstuvwxyz' האם תשובתכם תשתנה? הסבירו ii שאלה 4 בשאלה זו נשוב לבעיה של חיפוש תת-מחרוזת משותפת באורך מקסימילי, בה נתקלנו בתרגיל בית מס' 4 הפעם ננקוט בגישה שונה בתכלית כשאנחנו מחפשים מחרוזת משותפת מקסימלית, אנחנו מחפשים מחרוזות משותפות באורך הולך ועולה, נסמן את האורך ב- בשאלה זו נחזיק את תתי-המחרוזות בטבלת עמוד 3 מתוך 7
hash ונשתמש ב- fingerprint של אלגוריתם של Karp-Rabin בתור פונקצית ה- hash ננצל את התכונות של אלגוריתם Karp-Rabin ונגדיל באופן הדרגתי את ה- fingerprints שאנחנו מחשבים נשים לב לתכונה הבאה של טביעות האצבע של אלגוריתם :Karp-Rabin עבור המחרוזת, נסמן ב- את טביעת האצבע של החלון והטביעה מייצגת הטביעה מייצגת את החלון נסתכל על ניתן לחשב את מתוך באמצעות כלל הורנר rule) (Horner s לכן, את החלון, נוכל בקלות לחשב ממנה את בהינתן רשימת טביעות האצבע של חלונות באורך, נסמנה )טביעות האצבע באורך ( נמשיך להשתמש בסימונים שהגדרנו כאן לאורך השאלה לתרגיל מצורף קובץ longmatchkrpy שמבצע חיפוש תת-מחרוזת משותפת מקסימלית של שתי מחרוזות באמצעות הפונקציה findlongest המימוש של findlongest מופיע כבר בקובץ, אך היא קוראת לפונקציות אחרות hasmatch extendfingerprints, makehashtable, עבורן המימוש חסר לאורך השאלה תתבקשו לממש את הפונקציות החסרות בקובץ longmatchkrpy לאחר מימוש הפונקציות העתיקו את כל תוכן הקובץ לתוך קובץ ה- py שאתם מגישים בתרגיל נשווה בין מחרוזות של טקסט ספרותי ספרים שייוצגו ע"י מחרוזות רציפות )בניגוד לאוספים של מחרוזות איתם עבדנו בתרגיל 4( הפרמטרים שונים לאורך התרגיל, כשנחשב טביעות אצבע נשתמש בפרמטרים מאלה שראינו בשיעור כדי שניתן יהיה להשתמש בטביעות האצבע כפונקציית hash לו היינו משתמשים ב- היינו נאלצים להשתמש בטבלת ענק עם תאים ממשו את הפונקציה (r extendfingerprints(text, fingers,,l basis, הפונקציה מקבלת מחרוזת טקסט של הטקסט עבור חלונות באורך (text) ואת רשימת טביעות האצבע על הפונקציה לחשב טביעות האצבע של הטקסט עבור חלונות באורך הפונקציה מחשבת את הפונקציה אינה מחזירה ערך, אלא ע"י הארכה של טביעות האצבע הנתונות ב- את טביעות האצבע במקום את מעדכנת את fingers כך שהרשימה תכיל את מחושבות בבסיס,basis מודולו r, כפי שאנחנו מצפים מאלגוריתם Karp-Rabin משתנה גדל, אורך הרשימה שימו לב: כאשר של טקסט ממשו את הפונקציה tablesize) makehashtable(fingers, הפונקציה מקבלת את לא ידועים ואינם חשובים כאן( ומחזירה טבלת chained-hash בגודל כלשהו )הטקסט ואורך החלון tablesize תא j בטבלה מכיל את רשימת האינדקסים i שעבורם מתקיים fingers[i] == j לדוגמא: makehashtable([0,0,1,2,1,2,1,2,3,3,3,0,0], 4) = [[0, 1, 11, 12], [2, 4, 6], [3, 5, 7], [8, 9, 10]] עמוד 4 מתוך 7
אנחנו מניחים כאן שהטבלה גדולה מספיק כדי להכיל את טביעת האצבע המקסימלית סעיף ג ממשו את הפונקציה (r hasmatch(text1, text2, fingers1, fingers2,l, הפונקציה מקבלת שתי מחרוזות text1, text2 ומחזירה True אם יש להן תת-מחרוזת משותפת באורך )אחרת מוחזר )False הפונקציה מקבלת את של שתי המחרוזות ואת r )המודולו מעליו מחושבות טביעות האצבעות( על מנת שתוכל לעשות hashing של המחרוזות הנחיה: עשו hashing של אחת המחרוזות באמצעות הפונקציה makehashtable שמימשתם ב' סעיף ד לתרגיל מצורפים שני קבצי טקסט wonderlandtxt, looking_glasstxt המכילים את תוכן הספרים Alice s Adventures in Wonderland Through the Looking Glass, and What Alice Found There מאת לואיס קרול השתמשו בפונקציה findlongest )המימוש של פונקציה זו נתון בקובץ )longmatchkrpy כדי למצוא את אורכה של תת-מחרוזת משותפת מקסימלית לשני הספרים הללו רשמו את כל תתי-המחרוזות המשותפות שאורכן מקסימלי כדי להימנע מהבדלים בין הטקסטים שנובעים מסגנון ועריכה נסיר מהטקסט חלק מסימני הפיסוק ורווחים ונהפוך אותיות גדולות לקטנות השתמשו בפונקציה formattext המצורפת כדי לנקות את הטקסטים שאלה 2 בידינו תמונה שנגרסה ונחתכה לרצועות אנכיות החתיכות נאספו מסל הגריסה ולכן ממוספרות באופן אקראי נרצה למצוא את הסדר המקורי של הרצועות, להדביק אותן לפי הסדר הנכון וכך לשחזר את התמונה למזלנו, התמונה נגרסה באמצעות מגרסת פלא שחותכת בדיוק באמצע הפיקסל לכן, לכל שתי רצועות סמוכות יש עמודת פיקסלים משותפת זאת אומרת שאם נסדר את הרצועות לפי הסדר הנכון, נמצא שהעמודה הימנית ביותר של הרצועה ה- i זהה לחלוטין לעמודה השמאלית ביותר של הרצועה ה-( i+1 ) ממשו את הפונקציה findorder(dirname) שמקבלת שם של תיקייה המכילה את קבצי הרצועות הרצועות נתונות בקבצים בעלי סיומת bitmap זהו הפורמט בו השתמשנו בכיתה לייצוג תמונה, שמאפשר טעינה נוחה לאובייקט מהמחלקה Matrix באמצעות הפונקציה )load() הפונקציה מחזירה רשימת אינדקסים המייצגת את הסדר הנכון שבו יש להדביק את הרצועות על מנת לקבל את התמונה המקורית למשל, נניח שהרצועות נמצאות בתיקייה shreds ונראות כך: עמוד 5 מתוך 7
0 1 2 3 4 5 6 הפונקציה תחזיר: findorder( \\shreds\\ ) = [4,2,5,3,6,1,0] אם נסדר את הרצועות לפי הסדר שמחזירה findorder נקבל: 5 1 4 3 6 2 1 לתרגיל מצורף קובץ zip המכיל את הרצועות של התמונה הגרוסה כאמור, כל רצועה נשמרה כקובץ בפורמט bitmap המספור של הקבצים הינו אקראי השתמשו בפונקציה findorder כדי למצוא את הסדר הנכון של הרצועות הדביקו את הרצועות ושחזרו את התמונה המקורית צרפו את התמונה המשוחזרת לקובץ ה- docx שאתם מגישים מיהי האישיות המפורסמת המופיעה בתמונה? הערה: כדי למצוא את כל הקבצים בתיקייה מסוימת dirname תוכלו להשתמש בפקודות האלו: oslistdir(dirname) globglob(dirname + *bitmap ) עמוד 6 מתוך 7
שתי הפקודות מחזירות רשימה של שמות קבצים oslistdir )של המודול )os מחזירה את שמות כל הקבצים בתיקייה והפקודה globglob )של המודול )glob כפי שנכתבה מוצאת רק קבצים עם סיומת bitmap מידע נוסף על הפונקציות האלו תוכלו למצוא בתיעוד של פייתון עמוד 7 מתוך 7