אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג,.6.013 משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם 8 עמודי שאלון )כולל עמוד זה(. עליכם לכתוב את התשובות על גבי הטופס! קראו היטב כל שאלה. ודאו כי אתם מבינים את השאלה לפני שתתחילו לענות עליה. אם יש שאלות פנו למרצה או למתרגלים. כתבו בכתב יד ברור וקריא. תשובות לא קריאות לא תיבדקנה. השתמשו במחברת הטיוטה והעתיקו לטופס רק את תשובתכם הסופית. הערות לתשובותיכם ניתן לכתוב בעברית, גם בגוף פונקציות C. השתדלו להוסיף תיעוד ברור של דרך הפתרון שלכם..1..3..5.6 בהצלחה! שאלה ציון /15 1 /33 /5 3 /33 /133 סה"כ
שאלה )11 1 נק'( נתונה הפונקציה הבאה: #define TRUE 1 #define FALSE 0 int what (int a[], int n, int b[], int m) { int i,j; if (n!= m) return FALSE; for (i=0; i<n; i++) { for (j=0; j<n; j++) { if (a[i] == b[j]) break; if (j==n) return FALSE; return TRUE; א. )1 נק'( הסבירו במשפט קצר מה הפונקציה what עושה? הפונקציה בודקת האם כל המספרים במערך a מופיעים גם במערך b. ושאורך שני המערכים זהה. ב. )1 נק'( מה סיבוכיות הזמן של הפונקציה?what O(n ) ג. )1 נק'( האם ניתן להגדיר פונקציה, אשר עושה בדיוק את אותו הדבר בסיבוכיות זמן טובה יותר? אם כן ציינו מהי הסיבוכיות והסבירו בקצרה את האלגוריתם. אם לא הסבירו מדוע. כן. ניתן למיין את מערך b באמצעות מיון מיזוג ואז לבצע חיפוש בינארי של כל איבר מ- a במערך הממוין.b סך הכל סיבוכיות זמן O(nlogn).
שאלה )33 נק'( הגדירו פונקציה אשר מקבלת מערך של מספרים שלמים, את אורכו n אינדקס במערך(. על הפונקציה לסדר מחדש את המערך כך שכל הערכים שהיו באינדקסים המספרים באינדקסים k עד )1-n(. יש לשמור על סדר המספרים בכל אחד מהחלקים )כמו בדוגמא(. ומספר שלם k )המייצג 3 עד (1-k) יופיעו אחרי לדוגמא: אם הפונקציה קיבלה את המערך הבא עם 3=k 6 3 9 7 1 8 1 אז לאחר פעולת הפונקציה המערך יראה כך: 9 7 1 8 1 6 3 על הפונקציה לעבוד ב: סיבוכיות זמן: O(n) - שימו לב שסיבוכיות של O(kn) לא עומדת בדרישות! סיבוכיות מקום: (1)O כלומר אין להשתמש במערך עזר! פתרונות בסיבוכיות גבוהה יותר יקבלו ניקוד חלקי בלבד. void switch (int arr[], int n, int k) { reverse (arr, 0, n-1); reverse (arr, 0, n-k-1); reverse (arr, n-k, n-1); return; void reverse (int a[], int i, int j) { int temp; while (i < j) { temp = a[j]; a[j] = a[i]; a[i] = temp; return;
שאלה )1 3 נק'( מערך דו מימדי ריבועי )מספר השורות שווה למספר העמודות( נקרא "מערך ממוין ריבועי" אם ניתן לחלק אותו לארבעה תת-ריבועים שווים כמתואר להלן, כך שכל המספרים בחלק 1 קטנים ממש מכל המספרים שבחלק שקטנים ממש מכל המספרים בחלק 3, שקטנים ממש מחלק : 1 3 כתבו פונקציה בשם ) ( sortedsquare אשר מקבלת מערך דו מימדי ריבועי של מספרים שלמים ואת גודל הצלע בו ומחזירה 1 אם המערך ממוין ריבועי ו- 3 אחרת )שימו לב כי גודל הצלע צריך להיות מספר זוגי. אפשר להניח זאת. אין צורך לבדוק(. לדוגמא, המערך הבא ממוין ריבועי, ולכן על הפונקציה להחזיר 1: - 0 7 3-1 6 8 9 1 17 0 1 10 1 המערך הבא לא ממוין ריבועי, ולכן על הפונקציה להחזיר 3: 0 1 7 3 5 8 6 1 0 10 9 11 1 דרישות סיבוכיות: )n )O n הוא אורך צלע במערך( סיבוכיות זמן: ) סיבוכיות מקום: (1)O פתרונות בסיבוכיות גבוהה יותר לא יתקבלו.
int sortedsquare (int mat[][m], int n, int m) { int max1, min, max, min3, max3, min; max1 = max(m, n/, n/); min = min(&m[0][n/-1], n/, n/); max = max(&m[0][n/-1], n/, n/); min3 = min(&m[n/-1][0], n/, n/); max3 = max(&m[n/-1][0], n/, n/); min = min(&m[n/-1][n/-1], n/, n/); if (max1 < min && max < min3 && max3 < min) return 0; return 1; int min (int m[ ][M], int n, int m) { int i, j, min = m[0][0]; for (i = 0; i < n; i++) for (j = 0; j < m; j++) if (m[i][j] < min) min = m[i][j]; return min; int max (int m[ ][M], int n, int m) { int i, j, min = m[0][0]; for (i = 0; i < n; i++) for (j = 0; j < m; j++) if (m[i][j] > max) max = m[i][j]; return max;
שאלה )33 נק'( קוטר של עץ בינארי הינו אורך המסלול הארוך ביותר בין שני צמתים כלשהם בעץ. למשל, לעץ הימני קוטר 6 )מספר הצמתים על המסלול הארוך ביותר( ולעץ השמאלי קוטר : 7 1 5 7 5 1 9 6 9 6 8 3 8 הגדירו פונקציה אשר מקבלת מצביע לעץ בינארי, ומחזירה את קוטר העץ. typedef struct node{ int data; struct node* left; struct node* right; Node; כל צומת בעץ מוגדר כך: int diameter(node* node( { int hl, hr, hc, dl, dr, dc; if (node == NULL) return 0; hl = height (node->left); hr = height (node->right); hc = hl + hr + 1; dl = diameter (node->left); dr = diameter (node->right); dc = dl > dr? dl : dr; return dc > hc? dc : hc ;
int height (Node *node) { int hr, hl; if (node == NULL) return 0; hr = height (node->right) + 1; hl = height (node->left) + 1; return hl > hr? hl : hr;