תרגיל מס` 4 - WordPress.com
Transcription
תרגיל מס` 4 - WordPress.com
מכללת אורט כפר-סבא מבני נתונים ויעילות אלגוריתמים תרגיל מס' 4 פתרו את השאלות הבאות .יש לסיים את התרגיל עד יום א' ).(19.10 שאלה 1 א .ממשו את הפונקציה שכותרתה: )void swap (int *a, int *b הפונקציה תקבל מצביעים לשני משתנים מטיפוס שלם ,ותבצע החלפה ביניהם. ב .ממשו את הפונקציה שכותרתה: )void bubble_sort (int a[], int n הפונקציה ממיינת בסדר עולה מערך aהמכיל nמספרים שלמים ,בעזרת האלגוריתם למיון בועות ) .(Bubble Sortהיעזרו בפונקציה שכתבתם בסעיף א'. ג .איזה שינוי עליכם לעשות בפונקציה המממשת את האלגוריתם למיון בועות ,אותה כתבתם בסעיף ב' ,על מנת שהיא תמיין את המערך בסדר יורד ,במקום בסדר עולה? שאלה 2 בשיעור ראינו כי הן מיון בועות והן מיון בחירה ,הם שניהם מסיבוכיות זמן ריצה ) Θ(n 2במקרה הגרוע ביותר .בשאלה זו ננסה להעריך את סיבוכיות זמן הריצה של שני אלגוריתמים אלו במקרה הטוב ביותר .כזכור ,בשיעור ראינו כי באלגוריתם למיון בועות ניתן להכניס שיפור ,בדמות הדגל הבוליאני .sortedהניחו שזו הגרסה של מיון בועות בה אנו משתמשים. א .כמה פעולות יבצע האלגוריתם למיון בועות )המשופר( אם הוא מקבל בתור קלט מערך שהוא כבר ממוין? בטאו את תשובתכם בעזרת הסימן האסימפטוטי . Θ ב .האם קיים קלט אחר מזה שתואר בסעיף א' ,שעבורו האלגוריתם למיון בועות יבצע פחות פעולות? ג .בהסתמך על סעיפים א' ו-ב' ,קבעו מהי סיבוכיות זמן הריצה של האלגוריתם למיון בועות ,במקרה הטוב ביותר. ד .כעת ,קבעו מהי סיבוכיות זמן הריצה של האלגוריתם למיון בחירה ,במקרה הטוב ביותר. לשם כך ,יהיה עליכם קודם לקבוע מה יהיה הקלט הטוב ביותר עבור האלגוריתם. ה .נניח שברשותכם מערך שהוא כמעט ממוין )כלומר :הרוב הגדול של איבריו ממוינים ,פרט למספר קטן של איברים שלא נמצאים במקומם( .באיזה מבין שני האלגוריתמים למיון שהכרנו – מיון בחירה ומיון בועות – תעדיפו להשתמש? 1 שאלה 3 א .מעוניינים לכתוב אלגוריתם המקבל כפרמטר מערך ממוין aהמכיל nמספרים שלמים שונים מאפס )אך לאו דווקא שונים זה מזה( המורכב מסדרת מס' שליליים ולאחריה סדרת מס' אי- שליליים .האלגוריתם יחזיר את האינדקס של האיבר החיובי הקטן ביותר .פתחו אלגוריתם יעיל הפותר את הבעיה ,וחשבו את סיבוכיות זמן הריצה שלו. ב .משנים את הגדרת הבעיה מסעיף א' ,וכעת המטרה היא לכתוב אלגוריתם המוצא את האיבר הקטן ביותר במערך )לאו דווקא חיובי( .פתחו אלגוריתם יעיל הפותר את הבעיה ,וחשבו את סיבוכיות זמן הריצה שלו. שאלה 4 סטודנט פיתח אלגוריתם הנקרא חיפוש טרינרי ) (ternary searchלחיפוש איבר במערך ממוין. האלגוריתם דומה לחיפוש בינארי ,אך במקום לחצות את המערך לשניים בכל שלב ,הוא מחלק את המערך לשלושה חלקים שווים ככל האפשר ,ומבצע שתי השוואות :עבור האיבר במקום הn/3- ועבור האיבר במקום ה .2n/3-לפי השוואות אלו ,האלגוריתם יודע באיזה שליש של המערך יש להמשיך את החיפוש. א .עבור מערך בגודל nתאים ,חשבו כמה צעדים יבצע האלגוריתם לחיפוש בינארי ,וכמה צעדים יבצע האלגוריתם לחיפוש טרינרי .הציגו בפירוט את חישוביכם. ב .מי מבין שני האלגוריתמים יעיל יותר? הסבירו את תשובתכם. ג .האם השיפור ביעילות הוא שיפור בקבוע ) (improvement by factorאו שיפור בסדר גודל ) ?(order-of-magnitude improvementהסבירו את תשובתכם. שאלה 5 נתונה הפונקציה הרקורסיבית הבאה: )float secret (int x, int y */טענת כניסה x :ו y-מס' שלמים /* y >= x , */טענת יציאה/* ???????????????????????? : { ;if (x == y) return x ;if (y-x == 1) return x+0.5 ;)return secret(x+1,y-1 } א .השלימו את טענת היציאה של הפונקציה. ב .בצעו שינויים בפונקציה כך שתבצע את מטרתה עבור כל זוג מספרים ,x,yולא רק עבור אלו שמקיימים . y >= x 2 שאלה 6 כידוע משיעורי חשבון ,ניתן להציג מכפלה של שני מספרים טבעיים על ידי פעולת חיבור בלבד. לדוגמה.3 * 4 = 3 + 3 + 3 + 3 = 12 : ניתן להשתמש בעקרון זה ,על מנת לחשב את המכפלה P * Qבאופן רקורסיבי: תנאי עצירה: P*1=P צעד רקורסיבי) P * Q = P*(Q-1) + P :כאשר .(Q > 1 א .הסבירו כיצד אפשר להשתמש בכלל רקורסיבי זה על מנת לחשב את .3*4 ב .לפניכם פונקציה רקורסיבית )( multiplyהממומשת באופן חלקי ,וחסרים בה שלושה ביטויים הממוספרים ) .(1)-(3השלימו את הביטויים החסרים. )int multiply (int p, int q */ */טענת כניסה P :ו Q-הם שלמים ,ו0 < Q- */טענת יציאה :הפונקציה מחזירה את מכפלתם של Pו/* Q- { ) )(1 ; )(2 ; )(3 ( if else } שאלה 7 לפניכם פונקציה רקורסיבית: )int f(int a, int b */טענת כניסה a :ו b-מס' שלמים */ */טענת יציאה/* ??????????????? : { ;)if (b > a) return 1 + f(a+1, b ;else if (a > b) return f(a-1, b) + 1 ;else return 0 } א .מה מחזירה הפונקציה עבור )?f(-3,1) ?f(6,4) ?f(4,7 ב .השלימו את טענת היציאה של הפונקציה. שאלה 8 לפניכם פונקציה רקורסיבית: )int f(unsigned int x */טענת כניסה x :מס' שלם חיובי )טבעי( */ */טענת יציאה/* ?????????????????????? : { ;if (x == 0) return 0 ;))return (f(x/2) + (x%2 } א .מה מחזירה הפונקציה עבור )?f(8) ?f(7) ?f(6) ?f(5) ?f(4 ב .השלימו את טענת היציאה של הפונקציה. 3 שאלה 9 בכמה דרכים שונות יכולה דבורה לעוף לתא מסוים ,אם היא מתחילה משמאל לימין )החל מתאים 1או ?(2נתון שהדבורה מתקדמת מתא אל תא סמוך ,כך שתמיד היא עפה מתא אל תא אחר שמספרו גדול ממנו )לדוגמה דבורה יכול לעוף מתא 2לתא 3אך לא להיפך(. לדבורה יש רק דרך אחת להגיע לתא מס' .1 לדבורה יש שתי דרכים להגיע לתא מס' :2דרך התאים ,12או דרך תא מס' .2 לדבורה יש שלוש דרכים להגיע לתא מס' :3דרך ,13או ,23או .123 בכמה דרכים יכולה הדבורה לעוף כדי להגיע לתא מס' ?4מס' ?7מס' ?8 כתבו פונקציה המקבלת כפרמטר מספר טבעי ,nומחזירה את מספר הדרכים השונות בהן הדבורה יכולה לעוף כדי להגיע לתא מספר .n שאלה 10 קבוצת תלמידים המכילה בנים ובנות משתתפים באירוע בבית ספר .המארגנים רוצים להושיב חלק מהמשתתפים על שורה של כסאות כך ששני בנים לא ישבו בסמוך זה לזה .השאלה היא בכמה אפשרויות ניתן לסדר ב n-כסאות קבוצה של בנים ובנות בשורה כך ששני בנים לא ישבו בסמוך זה לזה. לדוגמה: בכסא אחד ניתן להושיב בן או בת כלומר 2אפשרויות או בת ובן בשני כסאות יש 3אפשרויות :בן ובת בשלוש כסאות יש 5אפשרויות: , , או שתי בנות , , . א .בכמה אפשרויות ניתן לסדר בנים ובנות על 4כסאות ,כך ששני בנים לא ישבו זה ליד זה ? ב .בכמה אפשרויות ניתן לסדר בנים ובנות על 5כסאות ,כך ששני בנים לא ישבו זה ליד זה ? ג .כתבו פונקציה המקבלת כקלט מס' טבעי ,nומחזירה את מס' האפשרויות לסדר בנים ובנות על nכסאות ,כך ששני בנים לא ישבו זה ליד זה. הדרכה :בנו נוסחה רקורסיבית ) f(nבדומה למה שעשינו בשיעור בבעיית בניית קו הקרשים .עיינו במצגת השיעור האחרון. ד) .סעיף רשות( כתבו פונקציה המקבלת כקלט מס' טבעי ,nומחזירה את מס' האפשרויות לסדר בנים ובנות על nכסאות ,כך ששלושה בנים לא ישבו זה ליד זה )אך שניים כן יוכלו לשבת!(. 4 שאלה 11 בתרגיל קודם נתקלנו במושג של סדרה הנדסית )שאלה 10מתוך תרגיל מס' 1בתכנות מערכות בשפת .(Cכזכור ,מדובר בסדרה שבה קיים יחס קבוע qבין כל שני איברים סמוכים: … a, aq, aq2, aq3, aq4, aq5, עליכם לכתוב פונקציה רקורסיבית שכותרתה: )int geometric_sequence (int a, int q, int n המקבלת כפרמטר שלושה מספר טבעיים ,a,q,nומחזירה את האיבר ה-n-י של הסדרה ההנדסית שאיברה הראשון הוא aוהמנה הקבועה שלה היא .q הדרכה :חשבו -מה יהיה תנאי העצירה? חשבו גם על הצעד הרקורסיבי -כיצד ניתן לבטא איבר בסדרה הנדסית על-ידי האיבר הקודם לו? שאלה 12 כתבו תכנית מחשב בשפת Cהמיישמת את האלגוריתם הבא: קלוט מספר טבעי לתוך X כל עוד Xאיננו פלינדרום ,בצע: הַ שֵ ם ב Y-את המספר ההפוך בסדר ספרותיו לX- הַ שֵ ם ב X-את X + Y הצג כפלט את ערכו של X לדוגמא ,אם נפעיל את האלגוריתם על ,X = 87אז נקבל: 87 + 78 = 165 165 + 561 = 726 726 + 627 = 1353 ,1353 + 3531 = 4884ונסיים. אם נפעיל את האלגוריתם על ,X = 64אז נקבל: 64 + 46 = 110 ,110 + 011 = 121ונסיים. 5 אם נפעיל את האלגוריתם על ,X = 13אז נקבל: ,13 + 31 = 44ונסיים. האם תמיד מובטח שהאלגוריתם יעצור? כלומר – האם נגיע בהכרח בשלב מסוים לפלינדרום? מסתבר שמדובר בבעיה פתוחה ,שהתשובה עליה לא ידועה .קראו ,למשל ,את סיפורו )העגום?( של מתכנת שהריץ תכנית זו במחשב במשך שלוש שנים ,מבלי שהתכנית תיעצר: http://www.fourmilab.ch/documents/threeyears/threeyears.html רמז :האם כתבנו באחד התרגילים בתכנות מערכות בשפת Cפונקציה שעשויה להיות שימושית בשאלה זו? ולשם שעשוע :הקומיקאי האמריקאי Weird Al Yankovicהקליט שיר בשם ' ,'Bobשהוא פארודיה על סגנון השירה של הזמר בוב דילן ,אך מה שמיוחד בשיר הוא שכל שורה בו היא פלינדרוםhttps://www.youtube.com/watch?v=UnJdxUwF1Wg : שאלה 13 מעוניינים לכתוב פונקציה רקורסיבית שכותרתה - )void find_min_max (int a[], int *min, int *max, int n הפונקציה מקבלת מערך aשל מס' שלמים שגודלו ,nומחזירה )דרך הפרמטרים minו,max- המועברים לפי כתובת( את האיבר המינימלי והאיבר המקסימלי במערך. למשל ,נניח ש a-הוא המערך הבא ,שגודלו 8תאים: 7 6 5 4 3 2 1 0 12 -3 16 0 44 -8 0 11 אם נזמן את הפונקציה על-ידי ) ,find_min_max(a,&x,&y,8כאשר xו y-הם משתנים מטיפוס שלם ,אזי הם יקבלו את הערכים . x = -8, y = 44 להלן מימוש חלקי של הפונקציה ,אשר חסרים בו עשרה ביטויים הממוספרים ):(1) - (10 6 void find_min_max (int a[], int *min, int *max, int n) { int temp_min, temp_max; if ( ) (1) { (2) ; (3) ; } else { find_min_max(a, if ( (4) , (5) , (6) ); ) (7) *min = temp_min; else (8) if ( (9) ; ) *max = temp_max; else (10) ; } } . שראינו בשיעור האחרוןmax_array עבדו לפי עיקרון הדומה לזה של הפונקציה:הדרכה 7