מבני נתונים תרגול 1 מבוא
מבנה נתונים דרך לאחסן נתונים )מידע( במחשב מספרים ממוינים, המטרה: למצוא מינימום ומקסימום. מערך או רשימה מקושרת? מערך! כי אפשר לגשת למינימום ומקסימום באופן מיידי. }100,19,17,2,7,3,36,25,1{ ניתן לאחסן אותם ב : עץ בינארי 1 בהנתן נתונים )ללא מיון( 2 3 7 17 דוגמא: מערך )ממוין( מספרים לא ממוינים, המטרה: למצוא מינימום ומקסימום. מערך או רשימה מקושרת? שני מבני נתונים יעבדו באותה מהירות, אבל מערך יתפוס פחות מקום בזכרון. 19 25 36 100 רשימה מקושרת )ממוינת( מספרים ממוינים, המטרה: למצוא מספר כשלהו באוסף. מערך או רשימה מקושרת? 1 2 3 7 17 19 25 36 10 0 מערך! אפשר לבצע חיפוש בינארי.
אלגוריתם תהליך חישובי מוגדר היטב, שמקבל קלט הקלט(. ומחזיר פלט )כ- "פונקציה" של }100,19,17,2,7,3,36,25,1{ דוגמא: קלט אוסף של מספרים פלט אוסף ממוין אלגוריתם תהליך של מיון מספרים פלט קלט הפעלה של }100,19,17,2,7,3,36,25,1 } אלגוריתם מיון }1,2,3,7,17,19,25,36,100{
יעילות של אלגוריתם יעילות של אלגוריתם נקבעת לפי צורת ארגון הנתונים, וצורת הארגון, אם היא מתוכננת כראוי, צריכה להיות מותאמת לסוג הבעיה. בקורס זה שנוכל להתאים מבנה נכון לכל בעיה. נחקור צורות ארגון שונות, כדי
יעילות של אלגוריתם - דוגמא שני אנשים S ו Y,S,Y בהינתן תיק חדש, קיבלו עבודה של ארגון תיקים אישיים. זורק את התיק לתוך המגירה. בהינתן תיק חדש, מכניס למקומו לפי סדר אלף-בית מי עובד מהיר יותר? מי עובד יעיל יותר? מה אם יבקשו תיק מתוך האוסף? ומה אם היו מבקשים תיק לפי מספר ת.ז.? איזו צורת ארגון דורשת יותר מקום?
יעילות של אלגוריתם - דוגמא שני אנשים S ו Y קיבלו עבודה של ארגון תיקים אישיים. S, בהינתן תיק חדש, זורק את התיק לתוך המגירה. Y, בהינתן תיק חדש, מכניס למקומו לפי סדר אלף-בית כמה זמן עבד כל אחד מהם? ל S העבודה היתה מאוד פשוטה, למעשה הוא לא עבד בכלל! לעומתו, Y היה צריך למצוא את מיקומו של התיק החדש ורק אז להכניסו למקום האם העבודה של S יעילה יותר? אם בזה סיימנו את העבודה, אז עבודת S יעילה יותר. אבל מה אם יבקשו תיק מתוך האוסף?? אז ברור ש Y יוכל לשלוף את התיק מהר יותר! ומה היה קורה אם היו מבקשים תיק לפי מספר ת.ז.? במקרה זה לא יהיה הבדל )כי Y מסדר תיקים לפי האלף-בית ולא לפי ת.ז.( איזו צורת ארגון דורשת יותר מקום? S לא מבזבז מקום. אם Y משתמש בתיקיה קשיחה נפרדת עבור כל אות, אז התיקיות יכולות להיות מלאות חלקית =< בזבוז מקום.
יעילות של אלגוריתם זמן ריצה שאלה: האם מודדים זמן ריצה ביחידות של זמן )שניות, דקות וכו'(? תשובה: לא, כי משך הזמן לביצוע פעולות משתנה מסביבת ריצה אחת בגודל הקלט. לשנייה, ותלוי זמן הריצה של אלגוריתם הוא הערכה, חסמים, על מספר הפעולות האטומיות באמצעות שמבצע האלגוריתם במהלך פעולתו, כפונקציה של גודל הקלט.
שאלה 1 נדרשות על מנת למצוא FindMax(A) n size(a) max A[0] for i 1 to n-1 if A[i] > max then max A[i] return max נתון מערך של n איברים. כמה השוואות בין איברים במערך את האיבר המקסימלי? פסאודו קוד comparison לולאת ה- for מבוצעת 1-n פעמים בכל פעם מתבצעת השוואה של max לכן מספר ההשוואות הוא 1-n לאיבר הבא במערך
FindMax&Index(A) n size(a) max A[0] index = 0 // index of maximum for i 1 to n-1 then if A[i] > max1 then max A[i] index I return max, index comparison Main max1, index1 FindMax&Index(A) A' A - A[index1] max2 FindMax&Index(A ) שאלה 2 נתון מערך של n איברים. כמה השוואות בין שני איברים במערך נדרשות על מנת למצוא את שני המספרים הגדולים ביותר? אפשר יעיל יותר? מה יהיה זמן הריצה במידה ונרצה למצוא את k האיברים הגדולים ביותר? פתרון 1: בצע את האלגוריתם המתואר בשאלה 1 פעמיים. בהרצה הראשונה יש 1-n השוואות על מנת למצוא את המספר הגדול ביותר. בהרצה השניה יש 2-n השוואות על מנת למצוא את המספר השני בגודלו. סה"כ 3 2n השוואות
שאלה 2 נתון מערך של n איברים. כמה השוואות בין שני איברים במערך נדרשות על מנת למצוא את שני המספרים הגדולים ביותר? פתרון 2: נבנה עץ תחרות- tournament tree נכניס את כל האיברים לעלים. בכל סיבוב, זוג איברים "ישחקו" אחד מול השני והמנצח )הגדול מביניהם( יעלה לסיבוב הבא.
שאלה 2 נתון מערך של n איברים. כמה השוואות בין שני איברים במערך נדרשות על מנת למצוא את שני המספרים הגדולים ביותר? פתרון 2: האיבר הגדול ביותר הוא max האיבר השני הגדול ביותר הוא המקסימום מבין x 1, x 2, x 3
שאלה 2 n = 2 logn 1 = מספר ההשוואות בזמן בניית העץ: בתחילה יש n עלים. בכל צעד משווים בין כל זוג איברים שמתחרים ביניהם. n 2 נקבל כי בסיבוב הראשון יש בסיבוב השני יש השוואות. השוואות וכך הלאה. n + n + n + + 1 = n + n + n + + n = n 2 2 2 2 3 2 2 2 2 3 2 logn 2 n 2 logn סדרה הנדסית a 1 = n/2, q= 1/2, number of elements = logn n 4 ( 1 1) 2 logn 1 = ( 2 1 n n) 2 logn 1 = n 1 סה"כ 1 n השוואות לבניית העץ
שאלה 2 מספר ההשוואות במציאת האיבר השני בגודלו: ניתן להשתמש באלגוריתם משאלה 1 על log 2 n האיברים המועמדים. סה"כ לפי הניתוח השוואות משאלה 1 נצטרך 1 n log 2 השוואות. מחיבור שני הניתוחים נקבל כי סה"כ מספר ההשוואות הנדרש הוא : )2n 3 )במקום n 1 + log 2 n 1 = n + log 2 n 2 חישבו מה יהיה זמן הריצה למציאת k האיברים הגדולים ביותר
שאלה 3 מה יהיה הערך של k אחרי כל הרצה של כל אחד מקטעי הקוד הבאים. ספקו הערכה גסה של זמן הריצה ניתן להתעלם מקבועים. k = 0 for (int i = 1 ; i n ; i++) k++ פעמים וכל פעם k גדל ב 1. הלולאה מתבצעת n k = n runtime n
שאלה 3 מה יהיה הערך של k אחרי כל הרצה של כל אחד מקטעי הקוד הבאים. ספקו הערכה גסה של זמן הריצה ניתן להתעלם מקבועים. k = 0 for (int i = 1 ; i n ; i++) for (int j = 1 ; j n ; j++) k++ k = n 2 runtime n 2 הלולאה החיצונית מתבצעת n פעמים. הלולאה הפנימית מתבצעת n פעמים בכל ריצה של הלולאה החיצונית. בכל ריצה של הלולאה הפנימית מגדילים את k ב 1.
שאלה 3 מה יהיה הערך של k אחרי כל הרצה של כל אחד מקטעי הקוד הבאים. ספקו הערכה גסה של זמן הריצה ניתן להתעלם מקבועים. הלולאה החיצונית מתבצעת n פעמים. הלולאה הפנימית מתבצעת i פעמים בכל ריצה של הלולאה החיצונית. בכל ריצה של הלולאה הפנימית מגדילים את k ב 1. k = 0 for (int i = 1 ; i n ; i++) for (int j = 1 ; j i ; j++) k++ k = 1 + 2 + + n = runtime n 2 n n + 1 2 סדרה חשבונית a 1 = 1, a n = n, d = 1, number of elements = n
שאלה 4 i נגדיר את להיות מספר הכניסות ללולאת ה- while. בכל פעם k מוכפל, לכן k גדל בצורה הבאה:.1,2,4,8, הכניסות ללולאה יפסקו כאשר.2 i n מה יהיה הערך של k אחרי כל הרצה של כל אחד מקטעי הקוד הבאים. ספקו הערכה גסה של זמן הריצה ניתן להתעלם מקבועים. נקבל כי k = 1; while (k < n) k = k * 2 runtime log 2 n i = log 2 n
for (int i = 1 ; i n ; i++) k = 1; while (k < i) k = k*2 runtime log 2 (n!) שאלה 5 יש מה יהיה הערך של k אחרי כל הרצה של כל אחד מקטעי הקוד הבאים. ספקו הערכה גסה של זמן הריצה ניתן להתעלם מקבועים. לולאת הwhile מתבצעת log 2 i לכל i n 1 log 2 1 + log 2 2 + log 2 3 + + log 2 n log 2 1 + log 2 2 + + log 2 n = log 2 (1 2 n) סה"כ (n!) log 2 הכפלות.
שאלה 6 הערך את מספר ההכפלות המתבצעות בקטע הקוד הבא: הנחה: n = 2 k my_power (x, n) if (n=0) return 1 if (n=1) return x return my_power (x, n/2) * my_power (x, n/2) : עץ הרקורסיה עבור 8=n מספר הצמתים הפנימים הוא מספר המכפלות: 1 + 2 + 4 + 8 + + n/2 = n 1 n 2 = 2log(n 2 ) = 2 logn log2 =2 logn 1 number of elements = logn 1 + 2 + 4 + 8 + + n 2 = 1 (2logn 1) (2 1) = n 1 סדרה הנדסית a 1 = 1, q= 2, number of elements = logn,
שאלה 6 הערך את מספר ההכפלות המתבצעות בקטע הקוד הבא: הנחה: n = 2 k my_power (x, n) if (n=0) return 1 if (n=1) return x temp = my_power (x, n/2) return temp * temp נביט רק על ענף אחד של העץ. log n גובה העץ )על כל ענף )אורך הענף( הוא לצעות(,. log n logn קדקדים ו logn+1 לכן מספר המכפלות הוא
שאלה 7 תאר אלגוריתם המקבל מערך ממויין A עם n מספרים שלמים ומספר שלם x ומחזיר האם קיימים שני איברים ב A שסכומם בדיוק x. על הפתרון לבצע לכל היותר 3n השוואות. Example: x=25 1 6 9 18 p 1+23=24 < 25 p++ 1 6 9 18 p 6+23=29 > 25 q -- 1 6 9 18 19 19 19 23 23 23 q q פתרון: נגדיר שני אינדקסים p,q המצביעים לתחילת וסוף המערך. אם A[p] + A[q] == x אז החזר "אמת" אחרת, אם A[p] + A[q] > x אז 1 q q = אם A[p] + A[q] < x אז + 1 p p = p q 6+19=25 == 25 return True כמה איטרציות מבצעים פה?
שאלה 7 תאר אלגוריתם המקבל מערך ממויין A עם n מספרים שלמים ומספר שלם x ומחזיר האם קיימים שני איברים ב A שסכומם בדיוק x. על הפתרון לבצע לכל היותר 3n השוואות של איברים. TwoSum(A,x) p 0 q n-1 while (p < q) if (A[p]+A[q] == x) return Yes else if (A[p]+A[q] < x) p++ else q-- return No המקרה הגרוע ביותר כאשר אין סכום כזה במערך. אז הלולאה הפנימית מתבצעת עד שנקבל p q בכל פעם או שמקדמים את p, או שמורידים את q. ז"א הלולאה מתבצעת n פעמים. בכל איטרציה של הלולאה, מבצעים לכל היותר 3 השוואות: תנאי הלולאה השוואה אחת פנים הלולאה 2 השואוות סה"כ 3n השוואות.
10 2 שאלה 8 נתון מערך A עם n מספרים שלמים. 3n מצא את המינימום והמקסימום ע"י שימוש בלא יותר מ 2 השואוות. 3 7 17 19 25 36 12.A 2. n 2 A 1,A 2 שניהם בגודל A 1 n 2 - פתרון: נגדיר שני מערכי עזר נחלק את המערך A זוגות. ל בכל זוג, המספר הקטן יכנס למערך ואילו המספר הגדול יכנס למערך נשים לב כי כעת A 1 מכיל את המינימום הגלובלי ו A 2 מכיל את המקסימום הגלובלי. כעת נמצא את המינימום ב A 1 ואת המקסימום ב A. 2 A 10 2 3 minimum 7 17 19 25 36 12 maximum A 1 A 2 10 2 7 3 19 17 36 25 12 12
3n 2 שאלה 8 נתון מערך A עם n מספרים שלמים. מצא את המינימום והמקסימום ע"י שימוש בלא יותר מ כמה השוואות יש? השואוות. Min_and_Max(A, n) Define A1[1..n/2], A2[1..n/2] for i=1 to n/2 do if A[i] < A[n/2 + i] then A1[i] A[i] A2[i] A[n/2 + i] else A1[i] A[n/2 + i] A2[i] A[i] end if end for n/2 comparisons אם n הוא אי-זוגי, אפשר להכניס את האיבר האחרון של,A גם ל 1 A וגם ל 2.A נקבל שמספר ההשוואות הוא: n 1 + n + 1 1 + n + 1 1 = 3n 1 2 2 2 2 3n כלומר עדיין פחות מ - השוואות. 2 min A1[1], max A2[1] for i=2 to n/2 do if A1[i] < min then min A1[i] if A2[i] > max then max A2[i] end for 2 ( n 2 1) comparisons