1 / 29

מבני נתונים

מבני נתונים. מבוא, סיבוכיות חישוב. מבוא. מחשבים פועלים על נתונים ומאחסנים אותם. במדעי המחשב מבנה הנתונים מתייחס לאופן אחסון וארגון הנתונים בזיכרון המחשב, המאפשר גישה ושימוש יעיל בנתונים המאוחסנים. לכל מבנה נתונים יש יתרונות וחסרונות.

Download Presentation

מבני נתונים

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מבני נתונים מבוא, סיבוכיות חישוב.

  2. מבוא • מחשבים פועלים על נתונים ומאחסנים אותם. • במדעי המחשב מבנה הנתונים מתייחס לאופן אחסון וארגון הנתונים בזיכרון המחשב, המאפשר גישה ושימוש יעיל בנתונים המאוחסנים. • לכל מבנה נתונים יש יתרונות וחסרונות. • בחירת מבנה הנתונים המתאים תלוי באלגוריתם אותו מעוניינים לממש. • בשפות תכנות שונות קיימים מבני נתונים בסיסיים המובנים בשפה. לדוגמא, String עבור מחרוזת.

  3. מהו מבנה נתונים? • מבנה נתונים יכול להכיל מספר רב של ערכים אטומיים (int, double, char…), או מבני נתונים אחרים. • בחירת מבנה הנתונים המתאים עשויה לעשות את ההבדל בין אלגוריתם יעיל לאלגוריתם לא יעיל.

  4. סוגי מבני נתונים • מערך – הכנסת ערך מהירה, גישה מהירה לאינדקס ידוע, חיפוש ומחיקה איטיים, גודל קבוע. • תור – ראשון נכנס ראשון יוצא (FIFO) • מחסנית – אחרון נכנס ראשון יוצא (LIFO) • עץבינארי – חיפוש, הוספה ומחיקה מהירים, אלגוריתם מחיקה מורכב.

  5. מהו אלגוריתם? • רצף פעולות סופי לפתרון בעיה מסוימת. • על האלגוריתם להיות מדויק, לכלול רצף צעדים סופי וברור (ללא חוסר וודאות לגבי מה הצעד הבא), כמו כן האלגוריתם חייב להגיע לסיום. תוכנית מחשב מורכבת מאלגוריתם ומבנה נתונים

  6. יעילות אלגוריתם • יעילות קוד תלויה בתכנון נכון של האלגוריתם (הנדסת תוכנה) ובמבנה שנבחר לאחסון הנתונים. • כיצד ניתן למדוד יעילות קוד על מנת שנוכל לבחור את מבנה הנתונים המתאים? זמן ריצה הוא מדד מקובל ליעילות אלגוריתם

  7. זמן ריצת אלגוריתם • זמן הריצה של תוכנית מחשב בדרך כלל יגדל כאשר גודל נתוני הקלט גדלים. • זמן הריצה תלוי גם בסוג הקלטולא רק בגודלו • לעיתים בודקים את זמן הריצהשל המקרה הגרוע כמדד לזמןריצת האלגוריתם(קל יותר לחישוב) • כיצד ניתן לחשב זמן ריצה?

  8. ניתוח אימפירי של זמן ריצה • יש להריץ את התוכנית מספר רב של פעמים עם גודל נתוני קלט שונים. • בכל הרצה נמדוד את זמןהריצה של התוכנית. • נייצר גרף שמראה את זמןהריצה כתלות בגודלהנתונים.

  9. חסרונות ומגבלות שיטה אימפירית • צריך לממש את האלגוריתם כדי לאפשר הרצות עם נתונים שונים (לעיתים מורכב) • לא ניתן לכסות את כל האפשרויות, ולכן נתוני קלט שלא נבדקו לא יופיעו בגרף. • התהליך מורכב ותובעני (דורש זמן ותכנון) • על מנת להשוות בין שני אלגוריתמים שונים יש צורך לבצע את הבדיקות על אותו מחשב.

  10. ניתוח תיאורטי של זמן ריצה • מבוסס על תיאור כללי של האלגוריתם (פסאודו קוד), ללא צורך במימושו. • לוקח בחשבון את כל סוגי הקלט האפשריים. • מאפיין את הקשר בין זמן הריצה לגודל/סוג הקלט. • ניתוח זמן ריצה ללא תלות בביצועי המחשב.

  11. פסאודו קוד PseudoCode • תיאור כללי של מבנה האלגוריתם בשפה לא רישמית • יותר מובנה ומדויק מתאור בשפה מילולית • פחות מובנה ומדויק מקוד בשפת תכנות • מאפשר להבין את מבנה האלגוריתם בכלליות ללא פרטים על אופן המימוש

  12. Arrays מערכים • כאשר מעוניינים לעבוד עם מספר אובייקטים/נתונים ולבצע עליהם פעולות שונות, ניתן להגדיר מערך. • מערך הוא אוסף של משתנים/אובייקטים שלכל אחד מספר סידורי המאפשר גישה מהירה ונוחה. • מערך הוא למעשה אובייקט בפני עצמו המאפשר הפעלת שיטות על אוסף הנתונים אותם הוא מכיל. • מערך הוא אחד ממבני הנתונים (דרך לשמור ולנהל נתונים) הבסיסיים. • מספר איברי המערך הינו קבוע ונקבע בעת יצירתו. • למשל אם נרצה לשמור נתונים של כל הסטודנטים בניהול תעשייתי, ניצור מערך שיכיל את כל מופעי הסטודנטים במחלקה. כך ייתאפשר לנו ביצוע פעולות על כלל הסטודנטים בצורה נוחה.

  13. Arrays מערכים כל איבר במערך נקרא אלמנט. כל אלמנט ניתן לגישה ע"י אינדקס מספרי. ניתן לגשת לאיבר i בתוך מערך Aע"י A[i]

  14. Example: find max element of an array AlgorithmarrayMax(A, n) Inputarray A of n integers Outputmaximum element of A currentMaxA[0] fori1ton  1do ifA[i]  currentMaxthen currentMaxA[i] returncurrentMax PseudoCode • דוגמא:מציאת האיבר הגדול ביותר בתוך מערך

  15. פעולות פרימיטיביות • פעולות חישוב בסיסיות המבוצעות באלגוריתם. למשל חישוב ביטוי מתמטי, השמת ערך במשתנה, קריאה לפונקציה. • פעולות פרימיטיביות אמורות להופיע בפסאודוקוד. • מניחים כי זמן הריצה לביצוע פעולה פרימיטיבית הינו קבוע ולא תלוי בשפת התכנות או בביצועי המחשב.

  16. ספירת פעולות פרימיטיביות ע"י בחינת הפסאודוקוד ניתן להעריך את מספר הפעולות האטומיות המקסימלי של האלגוריתם. "המקרה הגרוע" worst case

  17. שיערוך זמן הריצה • בחינת "המקרה הגרוע" העלתה כי האלגוריתם למציאת ערך מקסימום בתוך מערך דורש 7n-2 פעולות פרימיטיביות. • נניח כי הפעולה הפרימיטיבית עם זמן הריצה הנמוך ביותר לוקחת a יחידות זמן, והגבוה b יחידות זמן. • נסמן את זמן הריצה במקרה הגרוע של האלגוריתם ב T(n), ונקבל:a (7n 2) T(n)b(7n 2) • כלומר זמן הריצה חסום בין שתי פונקציות לינאריות

  18. שיעור הגידול של זמן הריצה • אם נשנה את סביבת העבודה, שפת התכנות או המחשב עליו מריצים את האלגוריתם זמן הריצה יושפע ע"י הכפלה בקבוע (זמן ריצת הפעולות הפרימיטיביות) • קצב השינוי של זמן הריצה כתלות בגודל הנתונים n אינו מושפע ונשאר תכונה קבועה של האלגוריתם • באלגוריתם למציאת מקסימום, שיעור הגידול הינו לינארי, מכוון שהוא פרופורציוני ל n. וניתן לומר כי T(n) הינו O(n).

  19. למשל: n^2 אינו O(n), אלא O(n^2) • לצורך הפשטות, ניתן לומר כי שיעור הגידול של זמן הריצה נקבע ע"י הדרגה הכי גבוה של שיעור הגידול התלוי בגודל הנתונים, n 7n-2 is O(n) 3n3 + 20n2 + 5 is O(n3)

  20. שיעור הגידול של פונקציות שונות

  21. דוגמאות for( i=0; i<n ;++i) x = x + y ; n*2  O(n)

  22. דוגמאות for( i=0; i<n ;++i) x = x + y ; y = y - 1 ; n*4  O(n)

  23. דוגמאות x = x * y; for( i=0; i<n ;++i) x = x + y ; y = y - 1 ; n*4 + 2  O(n)

  24. דוגמאות for( i=0; i<n ;++i) for( j=0; j<n ;++j) x = x + y ; n*n*2  O(n^2)

  25. דוגמא x++; y++; for(i=0 ; i< n ; ++i){ for(j=0 ; j < n ; ++j) x = x + y ; x++; y++; for(j=0 ; j < n ; ++j) x = x + y ; }

  26. פתרון נתחיל מבפנים כלפי חוץ : בתוך הלולאה החיצונית הסיבוכיות היא : O(n) + k + O(n) = O(n) כלומר בכל איטרציה של הלולאה החיצונית אנו מבצעים חישוב בסדר גודל של n ולכן בסה"כ : O(n)  O(n) = O(n²) ובתוספת הקבוע : O(n²) + k = O(n²)

  27. דוגמא – חיפוש בתוך מערך חיפוש ערך מסוים, x בתוך מערך בגודל n i = 0; (1) while ( x != a[i]) (2) i++; (3) זמו ריצה במקרה הגרוע לעומת מקרה פרטי (1) O(1) test in (2) O(1) (3) O(1) iterations maximum n O(while-loop) = O(1) + n * O(1) = O(n)

  28. זמן ריצת תנאי test כאשר קיים תנאי if בתוך אלגוריתם, זמן הריצה שלו יהיה שווה לזמן הריצה של החלק בעל זמן הריצה הגדול יותר. O (max (f (n), g (n))) if-part else-part O(f(n)) O(g(n))

  29. דוגמא – זמן ריצת תנאי if ( a[1][i] == 0) for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j] = 0; else for (i = 0; i<n; i++) a[i][i] = 1; if: T(n)= O(n2) else : T(n) = O(n) T(n) = max (O(n2), O(n)) = O (n2)

More Related