שאלת מבחן במבוא למדעי המחשב - הטכניון 2017 - מחרוזות
שאלה 3 (25 נקודות):
סעיף א' (15 נק')
עליכם לממש את הפונקציה:
הפונקציה צריכה להשוות בין המחרוזות s1 ו-s2 על-פי סדר האותיות במערך abc. המערך abc הוא מערך בגודל 26 אשר מגדיר סדר חדש של אותיות קטנות באנגלית (כל אות אנגלית קטנה מופיעה בו פעם אחת בדיוק). המחרוזות s1 ו-s2 מכילות אותיות אנגליות קטנות בלבד.
אם s1 תופיע לפני s2 במילון שמוגדר ע"י סדר האותיות במערך abc, יש להחזיר מינוס 1. אם s1 ו-s2 בעלות תוכן זהה יש להחזיר 0, ואם s1 תופיע אחרי s2 במילון שמוגדר ע"י סדר האותיות במערך abc, יש להחזיר 1.
לדוגמא, אם מערך abc בעל התוכן הבא (משמאל לימין):
'b' 'c' 'd' 'a' 'e' 'f' 'm' 'g' 'h' 'i' 'j' 'k' 'l' 'n' 'o' 'z' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y'
המחרוזת "air"=s1 תופיע במילון אחרי "balloon"=s2 כי במערך abc האות b קודמת לאות a, וערך ההחזרה של הפונקציה יהיה 1.
המחרוזת "zero"=s1 תופיע במילון לפני "root"=s2 כי במערך abc האות z קודמת לאות r, וערך ההחזרה של הפונקציה יהיה מינוס 1.
המחרוזת "bool"=s1 תופיע במילון אחרי "boom"=s2 כי במערך abc האות m קודמת לאות l, וערך ההחזרה של הפונקציה יהיה 1.
עבור "language"=s1 ו-"language"=s2 ערך ההחזרה יהיה 0 כי המחרוזות זהות.
דרישות: סיבוכיות זמן Θ(n) וסיבוכיות מקום נוסף Θ(1), כאשר n הוא מספר התווים במחרוזת הקצרה מבין s1, s2.
אסור לשנות את תוכן המערכים שמתקבלים כפרמטרים.
אם לפי חישוביכם לא עמדתם בדרישות הסיבוכיות אנא ציינו כאן את הסיבוכיות שהגעתם אליה:
זמן ____________ מקום נוסף _______
סעיף ב' (10 נק')
עליכם לממש את הפונקציה:
הפונקציה מקבלת מערך words של m מחרוזות ומחזירה אינדקס עבורו הקריאה לפונקציה strcmp_new(words[i], words[i+1], abc) תחזיר -1.
לדוגמא, אם נתון המערך abc מהדוגמא שניתנה בסעיף א':
'b' 'c' 'd' 'a' 'e' 'f' 'm' 'g' 'h' 'i' 'j' 'k' 'l' 'n' 'o' 'z' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y'
ונתון המערך:
char *words[6] = {"bool", "air", "balloon", "root", "zero", "language" }
הפונקציה יכולה להחזיר 0 כיוון שהמילה "bool" מופיעה לפני המילה "air".
הפונקציה יכולה גם להחזיר 2 כיוון שהמילה "balloon" מופיעה לפני המילה "root".
ניתן להשתמש בפונקציה מסעיף א' גם אם לא מימשתם אותה.
ידוע כי:
• m>=2
• המילה הראשונה במערך מופיעה לפני המילה האחרונה במערך, לפי סדר האותיות במערך abc, כלומר מובטח כי הקריאה לפונקציה strcmp_new(words[0], words[m-1], abc) תחזיר -1.
דרישות: סיבוכיות זמן Θ(n⋅logm) וסיבוכיות מקום נוסף Θ(1) כאשר n הוא מספר התווים במחרוזת הארוכה ביותר ב-words ו-m הוא מספר המחרוזות ב-words.
אם לפי חישוביכם לא עמדתם בדרישות הסיבוכיות אנא ציינו כאן את הסיבוכיות שהגעתם אליה:
זמן ____________ מקום נוסף _______
סעיף א' (15 נק')
עליכם לממש את הפונקציה:
הפונקציה צריכה להשוות בין המחרוזות s1 ו-s2 על-פי סדר האותיות במערך abc. המערך abc הוא מערך בגודל 26 אשר מגדיר סדר חדש של אותיות קטנות באנגלית (כל אות אנגלית קטנה מופיעה בו פעם אחת בדיוק). המחרוזות s1 ו-s2 מכילות אותיות אנגליות קטנות בלבד.
אם s1 תופיע לפני s2 במילון שמוגדר ע"י סדר האותיות במערך abc, יש להחזיר מינוס 1. אם s1 ו-s2 בעלות תוכן זהה יש להחזיר 0, ואם s1 תופיע אחרי s2 במילון שמוגדר ע"י סדר האותיות במערך abc, יש להחזיר 1.
לדוגמא, אם מערך abc בעל התוכן הבא (משמאל לימין):
'b' 'c' 'd' 'a' 'e' 'f' 'm' 'g' 'h' 'i' 'j' 'k' 'l' 'n' 'o' 'z' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y'
המחרוזת "air"=s1 תופיע במילון אחרי "balloon"=s2 כי במערך abc האות b קודמת לאות a, וערך ההחזרה של הפונקציה יהיה 1.
המחרוזת "zero"=s1 תופיע במילון לפני "root"=s2 כי במערך abc האות z קודמת לאות r, וערך ההחזרה של הפונקציה יהיה מינוס 1.
המחרוזת "bool"=s1 תופיע במילון אחרי "boom"=s2 כי במערך abc האות m קודמת לאות l, וערך ההחזרה של הפונקציה יהיה 1.
עבור "language"=s1 ו-"language"=s2 ערך ההחזרה יהיה 0 כי המחרוזות זהות.
דרישות: סיבוכיות זמן Θ(n) וסיבוכיות מקום נוסף Θ(1), כאשר n הוא מספר התווים במחרוזת הקצרה מבין s1, s2.
אסור לשנות את תוכן המערכים שמתקבלים כפרמטרים.
אם לפי חישוביכם לא עמדתם בדרישות הסיבוכיות אנא ציינו כאן את הסיבוכיות שהגעתם אליה:
זמן ____________ מקום נוסף _______
סעיף ב' (10 נק')
עליכם לממש את הפונקציה:
הפונקציה מקבלת מערך words של m מחרוזות ומחזירה אינדקס עבורו הקריאה לפונקציה strcmp_new(words[i], words[i+1], abc) תחזיר -1.
לדוגמא, אם נתון המערך abc מהדוגמא שניתנה בסעיף א':
'b' 'c' 'd' 'a' 'e' 'f' 'm' 'g' 'h' 'i' 'j' 'k' 'l' 'n' 'o' 'z' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y'
ונתון המערך:
char *words[6] = {"bool", "air", "balloon", "root", "zero", "language" }
הפונקציה יכולה להחזיר 0 כיוון שהמילה "bool" מופיעה לפני המילה "air".
הפונקציה יכולה גם להחזיר 2 כיוון שהמילה "balloon" מופיעה לפני המילה "root".
ניתן להשתמש בפונקציה מסעיף א' גם אם לא מימשתם אותה.
ידוע כי:
• m>=2
• המילה הראשונה במערך מופיעה לפני המילה האחרונה במערך, לפי סדר האותיות במערך abc, כלומר מובטח כי הקריאה לפונקציה strcmp_new(words[0], words[m-1], abc) תחזיר -1.
דרישות: סיבוכיות זמן Θ(n⋅logm) וסיבוכיות מקום נוסף Θ(1) כאשר n הוא מספר התווים במחרוזת הארוכה ביותר ב-words ו-m הוא מספר המחרוזות ב-words.
אם לפי חישוביכם לא עמדתם בדרישות הסיבוכיות אנא ציינו כאן את הסיבוכיות שהגעתם אליה:
זמן ____________ מקום נוסף _______
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
הטכניוןמועד א2017סמסטר א
★★★★★
מחרוזותחיפוש בינאריסיבוכיות זמןסיבוכיות מקוםמערכיםלולאות
בסעיף א', שימו לב שבניית מערך הפוך (rank) בגודל 26 עולה זמן ומקום (קבוע!), ומאפשרת השוואת כל תו ב-. בסעיף ב', הערובה ש-
words[0] < words[m-1] מאפשרת לשמור אינווריאנט של טווח עולה לאורך חיפוש בינארי.סעיף א' — מימוש `strcmp_new`
הרעיון המרכזי: בונים מערך rank בגודל 26 (קבוע ← מקום נוסף) כך ש-
ניתוח סיבוכיות סעיף א':
---
סעיף ב' — מימוש `find_sorted_words`
הרעיון המרכזי: חיפוש בינארי עם אינווריאנט: בכל שלב מתקיים
*הוכחת נכונות האינווריאנט:*
ניתוח סיבוכיות סעיף ב':
הרעיון המרכזי: בונים מערך rank בגודל 26 (קבוע ← מקום נוסף) כך ש-
rank[c - 'a'] = המיקום של האות c בתוך abc. בנייתו עולה זמן. לאחר מכן סורקים את שתי המחרוזות תו-תו — סך-הכל זמן.ניתוח סיבוכיות סעיף א':
- זמן: ✓
- מקום נוסף: מערך
rankבגודל 26 = ✓
---
סעיף ב' — מימוש `find_sorted_words`
הרעיון המרכזי: חיפוש בינארי עם אינווריאנט: בכל שלב מתקיים
words[lo] < words[hi] (לפי abc).*הוכחת נכונות האינווריאנט:*
- בסיס:
lo=0, hi=m-1— מובטח ש-words[0] < words[m-1]. ✓ - צעד: נגדיר .
- אם
strcmp_new(words[mid], words[hi]) == -1(כלומר ): מציביםlo = mid. כעת . ✓ - אחרת (): מכיוון ש-, מתקיים . מציבים
hi = mid. כעת . ✓ - עצירה: כאשר
lo + 1 == hi, האינווריאנט מבטיח , כלומרstrcmp_new(words[lo], words[lo+1], abc) == -1, ומחזיריםlo. ✓
ניתוח סיבוכיות סעיף ב':
- מספר איטרציות: בכל איטרציה הטווח מתחלק לשניים → איטרציות.
- עלות כל איטרציה: קריאה ל-
strcmp_newעולה (כאשר = אורך המחרוזת הארוכה ביותר). - זמן כולל: ✓
- מקום נוסף: משתנים
lo,hi,midבלבד = ✓