שאלת מבחן במבוא למדעי המחשב - אוניברסיטת תל אביב 2016 - גנרטורים
בשאלה זו נממש חיפוש של תת-מחרוזות משותפות לשתי מחרוזות טקסט באמצעות אלגוריתם Rabin-Karp וגנרטורים.
נתונות שתי הפונקציות הבאות (הראשונה זהה והשניה דומה מאד לקוד של KR מהשיעור):
א. (8 נק') השלימו את פונקציית הגנרטור הבאה אשר מייצרת את רצף ה-fingerprints של תת מחרוזות באורך
דרישות נוספות: על הפונקציה לעשות שימוש בפונקציות
לדוגמה:
ב. (12 נק') השלימו את פונקציית הגנרטור הבאה, אשר מקבלת שתי מחרוזות טקסט ומייצרת את האינדקסים של כל תת המחרוזות באורך
דרישות נוספות:
1. על הפונקציה לעשות שימוש ב-
2. אסור לפונקציה להקצות זיכרון בגודל שהוא לינארי באורכי מחרוזות הטקסט או יותר מכך. בפרט, אסור לפונקציה בשום שלב לפרוש את רצף ה-fingerprints המלא של אחת ממחרוזות הטקסט.
לדוגמה:
תזכורת מהשיעור - try ו-except:
נתונות שתי הפונקציות הבאות (הראשונה זהה והשניה דומה מאד לקוד של KR מהשיעור):
א. (8 נק') השלימו את פונקציית הגנרטור הבאה אשר מייצרת את רצף ה-fingerprints של תת מחרוזות באורך
length ממחרוזת נתונה text, על פי סדר הופעתן במחרוזת text. קריאה ל-next כאשר תמו ה-fingerprints תגרום לזריקת exception, כרגיל כפי שראינו בכיתה.דרישות נוספות: על הפונקציה לעשות שימוש בפונקציות
fingerprint ו-slide. במהלך ייצור רצף ה-fingerprints המלא עבור מחרוזת נתונה תקרא הפונקציה fingerprint פעם אחת בלבד.לדוגמה:
ב. (12 נק') השלימו את פונקציית הגנרטור הבאה, אשר מקבלת שתי מחרוזות טקסט ומייצרת את האינדקסים של כל תת המחרוזות באורך
length המשותפות להן. ליתר דיוק, הפונקציה מייצרת רצף של tuples, כשכל tuple מייצג match ומכיל זוג מספרים: המספר הראשון הוא אינדקס המופע במחרוזת הראשונה, והשני במחרוזת השניה. אין חשיבות לסדר ייצור ה-tuples (אבל, כאמור, יש חשיבות לסדר המספרים בתוך כל tuple). זיכרו כי כרגיל בעת שימוש ב-fingerprints לצורך השוואת מחרוזות, תיתכן שגיאה בהסתברות קטנה, בדומה לקוד שראינו בשיעור. אין צורך לטפל בבעיה זו.דרישות נוספות:
1. על הפונקציה לעשות שימוש ב-
kr_gen.2. אסור לפונקציה להקצות זיכרון בגודל שהוא לינארי באורכי מחרוזות הטקסט או יותר מכך. בפרט, אסור לפונקציה בשום שלב לפרוש את רצף ה-fingerprints המלא של אחת ממחרוזות הטקסט.
לדוגמה:
תזכורת מהשיעור - try ו-except:
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א2016סמסטר ב
★★★★★
גנרטוריםמחרוזותתת-מחרוזתחיפוש
בסעיף א': קראו ל-fingerprint פעם אחת עבור תת-המחרוזת הראשונה, ואז השתמשו ב-yield כדי להחזיר אותה. בלולאה, השתמשו ב-slide כדי לחשב את ה-fingerprint הבא ולעשות yield. בסעיף ב': צרו שני גנרטורים מ-kr_gen. עבור כל fingerprint מהגנרטור הראשון, עברו על כל ה-fingerprints מהגנרטור השני. שימו לב שצריך ליצור גנרטור חדש עבור text2 בכל איטרציה של text1 (בגלל מגבלת הזיכרון).
סעיף א':
הסבר: קודם מחשבים fingerprint לתת-מחרוזת הראשונה (אינדקס 0) ועושים yield. אחר כך בלולאה, משתמשים ב-slide כדי לעבור לתת-מחרוזת הבאה ועושים yield.
סעיף ב':
הסבר: עוברים על כל fingerprint מהמחרוזת הראשונה. עבור כל אחד, יוצרים גנרטור חדש עבור המחרוזת השניה (כי אי אפשר לשמור את כל ה-fingerprints בזיכרון). משווים ואם יש התאמה עושים yield של זוג האינדקסים.
הערה: הפונקציה כפי שהיא בבחינה עם המבנה הנתון (try/except בתוך while True פנימי, ו-break בחלק ה-except) מתאימה בדיוק למבנה הזה. שימו לב שהשוואת fp1==fp2 ו-yield נמצאים בתוך ה-while הפנימי.
הסבר: קודם מחשבים fingerprint לתת-מחרוזת הראשונה (אינדקס 0) ועושים yield. אחר כך בלולאה, משתמשים ב-slide כדי לעבור לתת-מחרוזת הבאה ועושים yield.
סעיף ב':
הסבר: עוברים על כל fingerprint מהמחרוזת הראשונה. עבור כל אחד, יוצרים גנרטור חדש עבור המחרוזת השניה (כי אי אפשר לשמור את כל ה-fingerprints בזיכרון). משווים ואם יש התאמה עושים yield של זוג האינדקסים.
הערה: הפונקציה כפי שהיא בבחינה עם המבנה הנתון (try/except בתוך while True פנימי, ו-break בחלק ה-except) מתאימה בדיוק למבנה הזה. שימו לב שהשוואת fp1==fp2 ו-yield נמצאים בתוך ה-while הפנימי.