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

Slides:



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

Ford Fulkerson. Ford-Fulkerson (N=(G, c, s, t)) ; G = (V, E) for each edge, while exists a path P from s to t in residual network N f do for each edge.
מבוא למדעי המחשב לתעשייה וניהול
מערכים ומטריצות קרן כליף.
מתמטיקה בדידה תרגול 3.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
מסדי נתונים תשס " ג 1 תכנון סכמות (Design Theory) מסדי נתונים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
חורף - תשס " ג 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,
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
תורת הקבוצות חלק ב'. קבוצה בת מניה הגדרה: קבוצה אינסופית X היא ניתנת למניה אם יש התאמה חד-חד ערכית בין X לבין .
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
1 חישוב ואופטימיזציה של שאילתות חלק 2 Query Evaluation and Optimization Part 2.
ערמות ; מבני נתונים 09 מבוסס על מצגות של ליאור שפירא, חיים קפלן, דני פלדמן וחברים.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
מבוא כללי למדעי המחשב תרגול 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;
עקרון ההכלה וההדחה.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
- אמיר רובינשטיין מיונים - Sorting משפט : חסם תחתון על מיון ( המבוסס על השוואות בלבד ) של n מפתחות הינו Ω(nlogn) במקרה הגרוע ובממוצע. ניתן לפעמים.
1 ׃1998 Morgan Kaufmann Publishers פקודת ה- jump 4 bits 26 bits 2 bits 00 : כתובת קפיצה במילים : כתובת קפיצה בבתים … …
תרגול מס ' 1: מבני נתונים – מבוא. כללי מבנה נתונים – דרך לארגן נתונים במחשב ולגשת אליהם. בקורס זה נלמד על מבני נתונים שונים אשר משמשים לבניית אלגוריתמים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
יעילות, סגנון ובדיקה של קוד. " איכות " של פיתרון קוד לבעייה נכונות פשטות (תכנות)‏ יעילות.
© Keren Kalif JDBC קרן כליף.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
תכנות מכוון עצמים ו- C++ יחידה 11 תבניות - templates
Computer Architecture and Assembly Language
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
רקורסיות קרן כליף.
אבני היסוד של תוכנית ב- JAVA
מיונים וחיפושים קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
רקורסיות קרן כליף.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
מערכים קרן כליף.
לולאות קרן כליף.
תכנות מכוון עצמים ושפת JAVA
הרצאה 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; cout << “Please enter a number: “; cin >> num; cout << “The number is ” << num << endl; } בתוכנית זו מספר הפעולות תמיד יהיה זהה, לא משנה מה ערכו של num 7 © Keren Kalif

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

ניתוח זמן ריצה – תלות בגודל הקלט (לינארי) חישוב עצרת: void main() { int num, fact=1; cout << "Enter a number: “; cin >> num; for (int i=1 ; i <= num ; i++) fact *= i; cout << num << “! = “ << fact << endl; } מספר הפעולות בתוכנית זו הוא 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; cout << "Please enter a number: “; cin >> num; cout << "All even numbers from 1 to “ << num << “: “; for (int i=0 ; i < num ; i+=2 ) cout << i << “ “ ; cout << endl; } מספר הפעולות בתוכנית זו הוא 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; cout << "Enter a rectangle's width and height: "; cin >> width >> height; for (int i=1 ; i <= height ; i++) for (int j=1 ; j <= width ; j++) cout << “*”; cout << endl; } סה"כ זמן הריצה של התוכנית: 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; cout << "Please enter the base of the triangle: "; cin >> num; for (int i=1 ; i <= num ; i++) for (int j=1 ; j <= i ; j++) cout << “*”; cout << endl; } סדר גודל זמן הריצה של התוכנית הוא מספר הפעולות בסה"כ של הלולאה הראשית: 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; cout << "Please enter a number: “; cin >> num; cout << "All 2 powers till “ << num << “: “; for (int i=1 ; i <= num ; i*=2) cout << i << “ “; cout << endl; מספר הפעולות בתוכנית זו הוא 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) { for (int i=1 ; i <= n; i++) cout << i; cout << endl; for (int i=1 ; i <= m; i++) } מאחר ולא ידוע לנו היחס בין n ל-m, נאמר שסדר הגודל הוא O(n+m) 17 © Keren Kalif

דוגמא 2: קבל מספר והחזר מהי הספרה המופיעה הכי הרבה פעמים אופציה 1: לספור כמה פעמים מופיעה הספרה 1 ע"י לולאה על כל המספר, הספרה 2 וכו' 10*O(n), כאשר n הוא מספר הספרות במספר 10*O(n) = O(n) אופציה 2: מיון דליים O(n), כאשר n הוא מספר הספרות במספר 18 © Keren Kalif

הקוד int countDigits1(int num) { int max=0, maxCount=0; for (int i = 0; i < 10; i++) int temp = num; int count = 0; while (temp > 0) if (temp % 10 == i) count++; temp /= 10; } if (count > maxCount) maxCount = count; max = i; return max; O(n) int countDigits2(int num) { int counters[10]; while (num > 0) counters[num % 10]++; num /= 10; } int max = 0; for (int i = 1; i < 10; i++) if (counters[i] > counters[max]) max = i; return max; O(n) 19 © Keren Kalif

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

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

תרגיל 2: מהו זמן הריצה של התוכניות הבאות? void main() { int n; cout << "Enter a number: "; cin >> n; cout << "All 2 powers from 1 till " << n << ":\n"; } for (int i=1 ; i <= n ; i*=2) cout << i << " "; O(log2(n)) … for (int i=1 ; i <= n ; i++) { // check if i is a 2 power int j; for (j=1 ; j < i ; j*=2); if (j == i) cout << i << " "; } O(n*log2(n)) 22 © Keren Kalif