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

Slides:



Advertisements
מצגות קשורות
מערכות סדרתיות (מערכות עקיבה)
Advertisements

חקירת פונקציה נקודות קיצון אקסטרמום(קיצון) בקטע סגור תחומי עליה וירידה
תחקור והערכת מערכת .
תכנות בשפת C תרגול 11 - קבצים.
הרצאה 02 סוגי משתנים קרן כליף.
ייצוגים שונים של פונקציה
יצירת מקרו הפעלת מקרו יצירת לחצן / פקד דוגמה מסכמת
Computer Programming Fall 2012 תרגול 6 פונקציות
הרצאה 12: מיזוג, מיון ושימושים לפעולות על קבוצות - המשך
מבוא לתכנות ב-JAVA מעבדה 1
תרגול 11: רקורסיה ופיתוח טלסקופי
תרגול 1: סביבת העבודה ומבוא ל-Java
Mitug.com- אתר מיתוג של פטריק
לולאות Department of Computer Science-BGU 19 יולי 19.
נערך ע"י אריק הוד, הגימנסיה העברית הרצליה
תרגול 5: לולאות ומערכים.
מבוא למדעי המחשב מ' - תירגול 9
תירגול 10: מבנים (structs) וקבצים
Marina Kogan Sadetsky –
רמי כהן, מדעי המחשב, הטכניוןכל הזכויות שמורות ©
Jump tables, review questions
הרצאה 3: משפטים, תנאים ולולאות
רקורסיה ופתרונות רקורסיביים
מבוא למדעי המחשב הרצאה מספר 12: רקורסיה
תכנות בשפת C תרגול 11 רשימות מקושרות מבנים
תרגול Introduction to C - Fall Amir Menczel.
פעולות אריתמטיות קרן כליף.
Computer Programming תרגול 1 Summer 2016
נערך ע"י אריק הוד הגימנסיה העברית הרצליה
רקורסיה ופתרונות רקורסיביים
תירגול 3: לולאות, קלט, וטיפוסים
תכנות בשפת C תרגול 8 רקורסיה
Engineering Programming A
תירגול 8:מצביעים והקצאה דינאמית
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא למדעי המחשב הרצאה 9: רקורסיה
תרגול 6: פונקציות, סוגי משתנים, top-down design
תהליך ההרשמה לבעלי אימייל של המכללה, ניתן להכנס לכתובת הבאה וליצור חשבון:
S. Even, "Graph Algorithms", Computer Science Press, 1979
תירגול 2: מבוא לתיכנות ב-C
כל הזכויות שמורות לגבריאל אנקרי © 2017
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוסס על שקפים מאת יאן ציטרין
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הרצאה 10: אלגוריתמי מיון רקורסיביים Merge sort ו-Quick sort
Computer Architecture and System Programming Laboratory
אלגוריתמי מיון רקורסיביים
המשך תכנות מונחה עצמים תרגול מס' 9.
כל הזכויות שמורות לגבריאל אנקרי © 2017
תרגול 13 : חזרה נכתב על-ידי לימור ליבוביץ נערך ע"י ישראל גוטר
Marina Kogan Sadetsky –
מת"מ מעבדה 7-8 רשימות.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא לתכנות ב- JAVA מעבדה 4
מבחני איתור לנבחרת ישראל הצעירה (מדעים ומתמטיקה) לתלמידי כיתות ז'
מבוא למדעי המחשב סמסטר ב' – 2008 מרצה: יעל סיגל מתרגל: ענבל בודובסקי.
Introduction to Programming in C
תרגול 12: backtracking.
מצביעים Pointers – המשך...
(או כיצד ללמוד בצורה נכונה מתחילת הסמסטר)
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
עקרונות תכנות מונחה עצמים תרגול 9:C++ - תרגילים
רקורסיה ופתרונות רקורסיביים
Java Programming רשימות מקושרות - המשך
הפונקציה מחזירה את מספר התווים במחרוזת נתונה.
Engineering Programming A
רשימות מקושרות עבודה עם קבצים דוגמה
תמליל מצגת:

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

תרגיל 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

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

מבוא למדעי המחשב מ' - תירגול 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

מבוא למדעי המחשב מ' - תירגול 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

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

מבוא למדעי המחשב מ' - תירגול 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

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

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

מבוא למדעי המחשב מ' - תירגול 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

תרגיל 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”. שימו לב: ניתן להשתמש בפונקציות מסעיפים קודמים גם אם לא פתרתם אותם. לעיתים יש יותר ממיון אחד אפשרי. תשובה נכונה תיתן אחד מהמיונים הללו.

מבוא למדעי המחשב מ' - תירגול 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

תרגיל 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 גם אם המילה ריקה. שימו לב שניתן להשתמש בפונקציות מסעיפים קודמים גם אם לא פתרתם אותם.

מבוא למדעי המחשב מ' - תירגול 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

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

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

מבוא למדעי המחשב מ' - תירגול 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

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

מבוא למדעי המחשב מ' - תירגול 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