ניתוח זמן ריצה (על קצה המזלג)

Slides:



Advertisements
Similar presentations
Completeness and Expressiveness. תזכורת למערכת ההוכחה של לוגיקה מסדר ראשון : אקסיומות 1. ) ) (( 2. )) ) (( )) ( ) ((( 3. ))) F( F( ( 4. ) v) ( ) v ((
Advertisements

1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
מתמטיקה בדידה תרגול 3.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
מסדי נתונים תשס " ג 1 תכנון סכמות (Design Theory) מסדי נתונים.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
1 מבוא למדעי המחשב תרגול מספר 11 2 הנושאים להיום סיבוכיות זמן ומקום של אלגוריתמים. למה צריך ללמוד את זה? 100% יופיע במבחן מדד ליעילות של אלגוריתמים.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
1 חישוב ואופטימיזציה של שאילתות חלק 2 Query Evaluation and Optimization Part 2.
ערמות ; מבני נתונים 09 מבוסס על מצגות של ליאור שפירא, חיים קפלן, דני פלדמן וחברים.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
תכנות תרגול 2 שבוע : צור קשר מתרגל – שי גוטנר, ביה " ס למדעי המחשב. מתרגל – שי גוטנר, ביה " ס למדעי המחשב. דואר אלקטרוני : דואר.
תכנות תרגול 3 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא כללי למדעי המחשב שיעור רביעי: לולאות
מבוא למדעי המחשב תרגול מספר.
מבוא למדעי המחשב תרגול מספר 11.
Data Structures, CS, TAU, Perfect Hashing 1 Perfect Hashing בעיה : נתונה קבוצה S של n מפתחות מתחום U השוואה ל - Hash : * טבלה קבועה (Hash רגיל - דינאמי.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
1 Data Structures, CS, TAU, Perfect Hashing בעיה: נתונה קבוצה S של n מפתחות מתחום U השוואה ל- Hash : * טבלה קבועה (Hash רגיל - דינאמי) * רוצים זמן קבוע.
רגרסיה קו רגרסיה הוא קו תיאורטי המאפשר לנו לבחון את השפעתו של משתנה מנבא אחד (או יותר) על המשתנה התלוי: במילים אחרות, מודל רגרסיה עוזר לנו לנבא על פי משתנה.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות תרגול 4 שבוע : לולאות for לולאות for for (counter=1 ;counter
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
- אמיר רובינשטיין מיונים - Sorting משפט : חסם תחתון על מיון ( המבוסס על השוואות בלבד ) של n מפתחות הינו Ω(nlogn) במקרה הגרוע ובממוצע. ניתן לפעמים.
תרגול מס ' 1: מבני נתונים – מבוא. כללי מבנה נתונים – דרך לארגן נתונים במחשב ולגשת אליהם. בקורס זה נלמד על מבני נתונים שונים אשר משמשים לבניית אלגוריתמים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
יעילות, סגנון ובדיקה של קוד. " איכות " של פיתרון קוד לבעייה נכונות פשטות (תכנות)‏ יעילות.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
Computer Architecture and Assembly Language
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מבנה נתונים ואלגוריתמים
מיונים וחיפושים קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
רקורסיות קרן כליף.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
מערכים קרן כליף.
לולאות קרן כליף.
הקצאות דינאמיות קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
הרצאה 3: משפטים, תנאים ולולאות
ניתוח זמן ריצה (על קצה המזלג)
מבוא כללי למדעי המחשב תרגול 4
מבוא כללי למדעי המחשב שיעור 2
מחרוזות קרן כליף.
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Computer Architecture and Assembly Language
Presentation transcript:

ניתוח זמן ריצה (על קצה המזלג) קרן כליף

ביחידה זו נלמד: מהו ניתוח זמן ריצה ניתוחי זמן ריצה בסיסיים מוטיבציה הגדרה ניתוחי זמן ריצה בסיסיים קבוע לינארי ריבועי לוגריתמי 2 © Keren Kalif

משפחות של פונקציות לינאריות: כאשר a ו- b קבועים f(n) = a∙n + b ריבועיות: כאשר a,b ו- c קבועים f(n) = a∙n2 + b∙n + c מעריכיות (אקספוננציליות): f(n) = 2n 3 © Keren Kalif

ניתוח זמן ריצה - מוטיבציה כאשר אנחנו מריצים את התוכניות שלנו, נראה לנו שהן רצות מאוד מהר, ואנחנו לא עוצרים לחשוב כמה עבודה באמת מבוצעת ע"י המחשב ב"עולם האמיתי" לעיתים יש חשיבות לכל מיקרו שנייה שהתוכנית רצה נרצה לדעת להעריך האם התוכנית שכתבנו יעילה, כלומר כמה עבודה המחשב באמת מבצע נרצה לבחון האם יש דרך לכתוב את התוכנית בצורה יותר יעילה 4 © Keren Kalif

זמן ריצה - הגדרה זמן ריצה של תוכנית הוא סדר גודל של מספר הפעולות שהתוכנית מבצעת ביחס לגודל הקלט סדר גודל אינו מספר מדויק אלא הערכה של מספר הפעולות המבוצעות בתוכנית 5 © Keren Kalif

ניתוח זמן ריצה – זמן ריצה קבוע לעומת זמן ריצה תלוי משתנה ניתוח זמן ריצה – זמן ריצה קבוע לעומת זמן ריצה תלוי משתנה כמה זמן לוקח למחשב לחשב את: x = x + y; התשובה תלויה במהירות המחשב, אך הנחה סבירה היא שפעולה זו על אותו מחשב בזמנים שונים תיקח זמן זהה for (i=1 ; i <= n ; i++) x += i; במקרה זה זמן הריצה תלוי בגודלו של n שאינו ידוע מראש, ולכן צריך לקחתו בחשבון בזמן הניתוח התיאורטי, שכן יהיה הבדל משמעותי אם n=10 או n=100,000,000... 6 © Keren Kalif

ניתוח זמן ריצה – זמן ריצה קבוע O(1) void main() { int num; printf(“Please enter a number: “); scanf(“%d”, &num); printf(“The number is %d \n”, num); } בתוכנית זו מספר הפעולות תמיד יהיה זהה, לא משנה מה ערכו של num 7 © Keren Kalif

ניתוח זמן ריצה – זמן ריצה קבוע O(1) מציאת הערך הגדול והערך הקטן: void main() { int num1, num2, small, big; printf(“Please enter 2 numbers: “); scanf(“%d%d”, &num1, &num2); small = num1; big = num2; if (small > big) small = num2; big = num1; } עדיין במקרה זה מספר הפעולות קבוע בכל הרצה, אפילו אם ערכם של num1 ו- num2 מאוד גדול, ולכן זמן הריצה של תוכנית זו הוא O(1) בעת חישוב ניתוח זמן ריצה נסתכל תמיד על המקרה הגרוע ביותר, כלומר המקרה בו יהיו הכי הרבה פעולות ולכן בדוגמא זו נניח כי ה- if מבוצע 8 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (לינארי) חישוב עצרת: void main() { int i, num, fact=1; printf("Enter a number: “); scanf(“%d”, &num); for (i=1 ; i <= num ; i++) fact *= i; printf(“%d != %d \n”, num, fact); } מספר הפעולות בתוכנית זו הוא O(1) עבור הפעולות הקבועות ועוד O(1) פעולות בכל איטרציה של הלולאה, ומאחר ויש num איטרציות: O(main) = O(1) + num*O(1) כאשר num מאוד גדול זמן הריצה הקבוע זניח ולכן נאמר כי: O(main) = O(1) + O(num) = O(num) מספר הפעולות בתוכנית זו תלוי בערכו של num: התוכנית תבצע תמיד את הפעולות הקבועות של קבלת הקלט והדפסת התוצאה, אבל מספר הפעמים שהלולאה תרוץ תלוי בקלט. = O(1) + O(num*1) = O(1) + O(num) 9 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (לינארי) (2) void main() { int num, i; printf("Please enter a number: “); scanf(“%d”, &num); printf("All even numbers from 1 to %d:“, num); for (i=0 ; i < num ; i+=2 ) printf(“%d “, i); printf(“\n”); } מספר הפעולות בתוכנית זו הוא O(1) עבור הפעולות הקבועות ועוד O(1) פעולות בכל איטרציה של הלולאה, ומאחר ויש num/2 איטרציות: O(main) = O(1) + (num/2)*O(1) כאשר num מאוד גדול זמן הריצה הקבוע זניח ולכן נאמר כי: O(main) = O(num/2) = O(num) הדפסת המספרים הזוגיים עד מספר מסוים: = O(1) + O((num/2)*1) = O(1) + O(num/2) =O (num/2) 10 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (ריבועי) void main() { int width, height, i, j; printf("Enter a rectangle's width and height: “); scanf(“%d%d”, &width, &height); for (i=1 ; i <= height ; i++) for (j=1 ; j <= width ; j++) printf(“*”); printf(“\n”); } סה"כ זמן הריצה של התוכנית: O(height *width) הדפסת מלבן: O(1) width*O(1) = O(width) heigth*O(width) = O(height*width) אם width == height == n סדר גודל זמן הריצה היה O(n2) 11 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (ריבועי) void main() { int num, i, j; printf(“Please enter the base of the triangle: “); scanf(“%d”, &num); for (i=1 ; i <= num ; i++) for (j=1 ; j <= i ; j++) printf(“*”); printf(“\n”); } סדר גודל זמן הריצה של התוכנית הוא מספר הפעולות בסה"כ של הלולאה הראשית: 1+2+…+num, וזוהי סדרה חשבונית שסכומה: O(main) = O(num*(num+1)/2) הדפסת משולש: בדוגמא זו מספר הפעולות בלולאה הפנימית שונה בכל איטרציה, ולכן נבדוק ביתר קפידה כמה פעולות באמת מתבצעות: באיטרציה הראשונה של הלולאה הראשית לולאה הפנימית תרוץ פעם אחת, באיטרציה השנייה פעמיים וכו'.. = O((num2+num)/2) = O(num2 + num) = O(num2) 12 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (לוגריתמי) הדפסת חזקה: void main() { int num, i; printf("Please enter a number: “); scanf(“%d”, &num); printf("All 2 powers till %d:\n“, num); for (int i=1 ; i <= num ; i*=2) printf(“%d “, i); printf(“\n”); מספר הפעולות בתוכנית זו הוא O(1) עבור הפעולות הקבועות ועוד O(1) פעולות בכל איטרציה של הלולאה, אך מהי כמות האיטרציות של הלולאה? 13 © Keren Kalif

ניתוח זמן ריצה – תלות בגודל הקלט (לוגריתמי) למשל עבור n=128: כמות האיטרציות היא כמות הפעמים שנכפיל ב- 2 עד שנגיע ל- n: 1248163264128 אפשר לשאול כמה פעמים הכפלנו את 2 בעצמו עד קבלת 128: 2? = 128 וזוהי בדיוק פעולת ה- log: log2128 לכן, כמות הפעולות שתרוץ עבור לולאה שקצב ההתקדמות שלה הוא כפל/חילוק הוא log 14 © Keren Kalif

ניתוח זמן ריצה לוגריתמי for (int i=1 ; i <= 240 ; i*=2) ….. כמות האיטרציות: 1 248163264128256 log2256 = 8 for (int i=1 ; i <= 240 ; i*=3) כמות האיטרציות: 13981243 log3243 = 5 כלומר, ככל שבסיס הלוג יותר גדול, כך כמות הפעולות קטנה (יותר יעיל) 15 © Keren Kalif

השוואת סדרי גודל כאשר אנו כותבים תוכנית נשאף שזמן הריצה יהיה נמוך ככל שניתן נזכור כי: O(1) < O(log3n) < O(log2n) < O(n) < O(n2) < O(n3) 16 © Keren Kalif

מאחר ולא ידוע לנו היחס בין n ל-m, נאמר שסדר הגודל הוא O(n+m) חיבור סדרי גודל void foo(int n, int m) { int i, j; for (int i=1 ; i <= n; i++) printf(“%d “, i); printf(“\n”); for (int i=1 ; i <= m; i++) } מאחר ולא ידוע לנו היחס בין n ל-m, נאמר שסדר הגודל הוא O(n+m) 17 © Keren Kalif

ביחידה זו למדנו: מהו ניתוח זמן ריצה ניתוחי זמן ריצה בסיסיים מוטיבציה הגדרה ניתוחי זמן ריצה בסיסיים קבוע לינארי ריבועי לוגריתמי 18 © Keren Kalif

תרגיל 1: מהו זמן הריצה של התוכניות הבאות? for (i=0 ; i <= n ; i+=2) printf(“%d “, i); void main() { int n, i; printf("Enter a number: "); scanf(“%d”, &n); printf("All even from 0 till %d:\n“, n); } O(n) … for (i=0 ; i <= n ; i++) { if (i%2 == 0) printf(“%d “, i); } O(n) ובכל זאת, למרות שהיעילות זהה, נעדיף את הפתרון העליון 19 © Keren Kalif

תרגיל 2: מהו זמן הריצה של התוכניות הבאות? void main() { int n, i; printf("Enter a number: "); scanf(“%d”, &n); printf("All 2 power from 1 till %d:\n“, n); } for (i=1 ; i <= n ; i*=2) printf(“%d “, i); O(log2(n)) … for (i=1 ; i <= n ; i++) { // check if i is a 2 power int j; for (j=1 ; j < i ; j*=2); if (j == i) printf(“%d “, i); } O(n*log2(n)) 20 © Keren Kalif