המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

תירגול 11: מיונים וחיפוש בינארי

מצגות קשורות


מצגת בנושא: "תירגול 11: מיונים וחיפוש בינארי"— תמליל מצגת:

1 תירגול 11: מיונים וחיפוש בינארי

2 תרגיל 1 – אביב תשע"ז מועד א' עליכם לממש את הפונקציה: void mod_sort(int a[], int n, unsigned int key); אשר מקבלת מערך של מספרים שלמים אי שליליים a, את האורך שלו n, ומספר חיובי שלם key. הפונקציה מסדרת מחדש את האיברים של המערךa לפי שארית החלוקה ב key. כלומר בהתחלה יהיו כל המספרים שבחלוקה ב key השארית היא 0, אחר כך כל המספרים שבחלוקה ב key השארית היא 1 וכך הלאה. דוגמא: עבור המערך a הבא באורך n=12 והאינדקס key=3 תוצאה אפשרית אחרי הקריאה לפונקציה: 1 8 3 9 4 5 8 5 1 4 3 9

3 תרגיל 1 – אביב תשע"ז מועד א' 8 5 4 1 9 3 הערות:
יש הרבה פלטים חוקיים לכל key. ניתן לפתור ללא שימוש במערכי עזר. המספרים במערך הפלט שלהם אותה שארית אינם חייבים לשמור על הסדר שהיה במערך המקורי. כלומר גם המערך הבא הוא תוצאה חוקית לדוגמא לעיל: 8 5 4 1 9 3

4 מבוא למדעי המחשב מ' - תירגול 2
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int k_sort(int a[], int n, int key, int k) { int l = 0, r = n - 1; while (l <= r) { while (l <= r && a[l] % key == k) l++; while (l <= r && a[r] % key != k) r--; if (l < r) swap(a + l, a + r); return l; { תרגיל 1 - פתרון מבוא למדעי המחשב מ' - תירגול 2

5 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 1 - פתרון void mod_sort(int a[], int n, unsigned int key) { for (int i = 0; i < key; i++) } int res = k_sort(a, n, key, i); a += res; n -= res; { מבוא למדעי המחשב מ' - תירגול 2

6 תרגיל 2 – אביב תשע"ז מועד ב' יש לכתוב פונקציה שחתימתה
int find_single(int arr[], int n); שמקבלת מערך שמכיל n מספרים. ידוע שבמערך arr כל מספר מופיע פעמיים ברצף פרט למספר אחד שמופיע רק פעם אחת, למשל: 0, 0, 100, 100, -5, -5, 0, 97, 97 הפונקציה צריכה להחזיר את האינדקס של המספר שמופיע פעם אחת בלבד, כלומר עבור הדוגמא לעיל הפונקציה תחזיר 6. ניתן להניח שהמערך תקין ואינו ריק (כלומר אכן רק מספר אחד מופיע פעם אחת וכל השאר מופיעים פעמיים וברצף).

7 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 2 - פתרון int find_single(int arr[], int n) { int l = 0, r = n - 1; while (l <= n) { int m = (l + r) / 2; if (m == 0 || m == n - 1) // first or last element return m; if (arr[m] != arr[m - 1] && arr[m] != arr[m + 1]) return m; // found it if (m % 2) if (arr[m] == arr[m - 1]) l = m + 1; else r = m - 1; if (arr[m] == arr[m + 1]) l = m + 2; r = m; } return -1; { מבוא למדעי המחשב מ' - תירגול 2

8 תרגיל 3 – אביב תשע"ו מועד ב' בשאלה זו נעסוק במחרוזות.
מילה היא רצף של אותיות אנגליות קטנות. משפט מורכב ממילים המופרדות ברווח יחיד. ניתן להניח שאין רווח בתחילת או בסוף משפט. ניתן להניח שכל המחרוזות חוקיות. אין צורך לדעת את הערך ה ascii של התווים כדי לפתור את השאלה. בשאלה זו מותר להשתמש בפונקציה strlen אשר מחזירה את אורך המחרוזת (ללא ה ‘\0’ בסוף). 2 מילים הן זרות מדרגה k אם כל התווים במילה אחת שונים מכל התווים במילה שניה מלבד k תווים. למשל המילים “hello” ו “again” זרות מדרגה 0. המילים “hello” ו “world” זרות מדרגה 2 כיוון שבשתיהן מופיעים התווים ‘o’ ו ‘l’. שימו לב שאם תו מסוים מופיע פעמיים בשתי המילים הוא ייספר פעם אחת כתו אחד זהה. למשל המילים “all” ו “ball” הן זרות מדרגה 2 כיוון שבשתיהן מופיעים התווים ‘a’ ו ‘l’. מילה ריקה זרה מדרגה 0 לכל מילה אחרת, כולל למילה ריקה נוספת.

9 תרגיל 3 – אביב תשע"ו מועד ב' סעיף א' (15 נקודות)
ממשו פונקציה לא רקורסיבית שחתימתה: int stranger(char* s1, char* s2(; הפונקציה מקבלת כקלט 2 מילים ומחזירה את דרגת הזרות שלהם כפי שהוגדר בתחילת השאלה. שימו לב שהערך החוזר תמיד יהיה בין 0 ל-26.

10 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 3א - פתרון #define N 26 int stranger(char* s1, char* s2) { int k = 0; int h1[N] = { 0 }; int h2[N] = { 0 }; while (*s1) h1[*s1++ - 'a']++; while (*s2) h2[*s2++ - 'a']++; for (int i = 0; i < N; i++) if (h1[i] && h2[i]) k++; return k; { מבוא למדעי המחשב מ' - תירגול 2

11 תרגיל 3 – אביב תשע"ו מועד ב' סעיף ב' (20 נקודות) ממשו פונקציה שחתימתה:
ממשו פונקציה שחתימתה: void sort_strangers(char* arr[], int n, char* word (; הפונקציה מקבלת כקלט מערך של מילים arr באורך n ומילה word, וממיינת את המילים במערך לפי דרגת הזרות שלהם עם המילה word. בתחילת המערך יופיעו כל המילים שדרגת הזרות שלהם עם word היא 0, אחר כך אלו שדרגת הזרות שלהם עם word היא 1 וכך הלאה. למשל עבור מערך המכיל את המילים “this”, “is”, “the”, “first” “question” והמילה “code” המערך הממוין יכול להיות: “this”, “is”, “first”, “the”, “question”. המילים “this”, “is”, “first” הן בזרות 0 עם “code”. המילה “the” היא בזרות 1 עם “code”. המילה “question” היא בזרות 2 עם “code”. שימו לב: ניתן להשתמש בפונקציות מסעיפים קודמים גם אם לא פתרתם אותם. לעיתים יש יותר ממיון אחד אפשרי. תשובה נכונה תיתן אחד מהמיונים הללו.

12 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 3ב - פתרון void swap(char** s1, char** s2) { char* temp = *s1; *s1 = *s2; *s2 = temp; { int partition(char* arr[], int n, char* word, int k) { int cnt = 0; for (int i = 0; i < n; i++) if (stranger(arr[i], word) == k) swap(arr + i, arr + cnt++); return cnt; } void sort_strangers(char* arr[], int n, char* word) { int t = 0; for (int i = 0; i < N; i++) t += partition(arr + t, n - t, word, i); { מבוא למדעי המחשב מ' - תירגול 2

13 תרגיל 3 – אביב תשע"ו מועד ב' סעיף ג' (15 נקודות)
ממשו פונקציה רקורסיבית שחתימתה: int cnt_strangers(char* arr[], int n, char* word, int k (; הפונקציה מקבלת כקלט מערך של מילים arr באורך n, מילה word, ומספר שלם k ומחזירה את מספר המילים במערך שזרות למילה word מדרגה k. למשל: עבור המערך “this”, “is”, “the”, “first”, “question”, “in”, “the”, “exam” והמילה “code” ועבור k=0 הפונקציה תחזיר 4 כיוון שיש 4 מילים במערך שזרות למילה “code” מדרגה 0 – “this”, “is”, “first”, “in”. עבור מערך ריק הפונקציה תחזיר 0 גם אם המילה ריקה. שימו לב שניתן להשתמש בפונקציות מסעיפים קודמים גם אם לא פתרתם אותם.

14 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 3ג - פתרון int cnt_strangers(char* arr[], int n, char* word, int k) { if (n == 0) return 0; int cnt = 0; if (stranger(arr[0], word) == k) cnt++; return cnt + cnt_strangers(arr + 1, n - 1, word, k); { מבוא למדעי המחשב מ' - תירגול 2

15 תרגיל 4 – חורף תשע"ז מועד ב' מערך ממוין לסירוגין הוא מערך שבו כל האיברים במקומות הזוגיים ממוינים מהקטן לגדול וכל האברים במקומות האי זוגיים ממוינים גם כן מהקטן לגדול. למשל המערך הבא הוא ממוין לסירוגין: 1,-1,3,3,6,4,10 האיברים במקומות הזוגיים הם: 1,3,6,10 והאיברים במקומות האי זוגיים הם: -1,3,4 לכל אורך השאלה יש לפתור בצורה היעילה ביותר מבחינת זמן ריצה.

16 תרגיל 4 – חורף תשע"ז מועד ב' סעיף א' (15 נק') עליכם לממש את הפונקציה
עליכם לממש את הפונקציה int is_interval_sorted(int arr[], int n); אשר מקבלת מערך arr באורך n. הפונקציה מחזירה 1 אם המערך ממוין לסירוגין ו-0 אחרת. למשל עבור המערך בתחילת השאלה הפונקציה תחזיר 1.

17 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 4א - פתרון int is_interval_sorted(int arr[], int n) { for (int i = 2; i < n; i++) if (arr[i] < arr[i - 2]) return 0; return 1; { מבוא למדעי המחשב מ' - תירגול 2

18 תרגיל 4 – חורף תשע"ז מועד ב' סעיף ב' (20 נק') עליכם לממש את הפונקציה
עליכם לממש את הפונקציה void sort(int arr[], int n); אשר מקבלת מערך ממוין לסירוגין arr באורך n וממיינת אותו. למשל עבור המערך בתחילת השאלה נקבל את המערך הבא: -1,1,3,3,4,6,10 הנחיה: ניתן להשתמש במערכי עזר אם זה משפר את היעילות מבחינת זמן ריצה

19 מבוא למדעי המחשב מ' - תירגול 2
תרגיל 4ב - פתרון void sort(int arr[], int n) { int* temp = (int*)malloc(n*sizeof(int)); if (!temp) return; for (int ie = 0, io = 1, it = 0; it < n; it++) { if (ie >= n) { temp[it] = arr[io]; io += 2; { else if (io >= n) { temp[it] = arr[ie]; ie += 2; else if (arr[ie] < arr[io]) { ie += 2 else { for (int i = 0; i < n; i++) arr[i] = temp[i]; free(temp); מבוא למדעי המחשב מ' - תירגול 2


הורד את "ppt "תירגול 11: מיונים וחיפוש בינארי

מצגות קשורות


מודעות Google