בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/lecture notes/intro/lecture10.pdf ·...

44
המחשב למדעי מבוא סיבוכיות, איטרטורים, למדא ביטויי:10 שיעור: נוספת לקריאהFriedrich von Logau. Deutscher Sinngedichte drei Tausend, 1654. Charles de Secondat, Baron de Montesquieu. De l’Esprit des Loix, Livre XX, 1748. Alonzo Church. An unsolvable problem of elementary number theory, American Journal of Mathematics, 58(2):345-363, April 1936.

Upload: others

Post on 12-Feb-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

מבוא למדעי המחשבשיעור 10: ביטויי למדא, איטרטורים, סיבוכיות

לקריאה נוספת: • Friedrich von Logau. Deutscher Sinngedichte drei Tausend, 1654. • Charles de Secondat, Baron de Montesquieu. De l’Esprit des Loix,

Livre XX, 1748. • Alonzo Church. An unsolvable problem of elementary number theory,

American Journal of Mathematics, 58(2):345-363, April 1936.

Page 2: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

ביטויי למדא

Page 3: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

ביטויי למדא• lambda parameter_list : expression :זה ביטוי מהצורה

שבו parameter_list היא רשימת משתנים מופרדים בפסיקים ו-expression הוא ביטוי המשתמש במשתנים הללו.

• .expression הערך שלו הוא פונקציה שמחשבת את

• prod = lambda x, y : x*y למשל, הפקודהשקולה לקטע הקוד הבא:

def prod(x,y): return x*y

Page 4: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

ביטויי למדא• lambda parameter_list : expression :זה ביטוי מהצורה

שבו parameter_list היא רשימת משתנים מופרדים בפסיקים ו-expression הוא ביטוי המשתמש במשתנים הללו.

• .expression הערך שלו הוא פונקציה שמחשבת את

• prod = lambda x, y : x*y למשל, הפקודהשקולה לקטע הקוד הבא:

def prod(x,y): return x*y

)דא (lambda) היא האות היוונית λ שמקבילה (ב למלאות למד בעברית (גם השמות מאותו מקור).

(lambada) אין לבלבל אותה עם ריקוד הלמבדהשאולי מוכר לכם מסרטים או מברזיל.

Page 5: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

פונקציות מסדר שניהחשיבות של ביטויי למדא מתבהרת כאשר רוצים להגדיר פונקציה •

מסדר שני (כלומר, פונקציה שמחזירה פונקציה).

• func לדוגמה, הנה פונקציה שמקבלת כקלט פונקציה אחרת .func ומוציאה כפלט פונקציה שהיא הנגזרת (המקורבת) של

הפרמטר השני eps שולט במידת הדיוק של הפלט: def derivative(func, eps): return lambda x: (func(x+eps) - func(x)) / eps

לדוגמה, הביטוי derivative(lambda x: x**2, 0.001)(5) מחשב את • .x = 5 בנקודה x2 הנגזרת של

שימו לב: הביטוי הזה מפעיל את הפלט של derivative (שזו פונקציה) •על הפרמטר 5.

Page 6: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

איטרטורים

Page 7: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

איטרטוריםבפייתון, מבנה שנקרא איטרטור (iterator) מאפשר לנו להגדיר •

סדרות ערכים כרצוננו.

iterator הוא אובייקט שהממשק שלו כולל את שתי המתודות •הבאות:

.1 .self שמחזירה את __iter__(self) מתודה

מתודה next__(self)__ שמחזירה את הערך הבא בסדרה, או 2.מעלה את הפסיקה StopIteration אם הסדרה הסתיימה.

iterable הוא אובייקט שהממשק שלו כולל את המתודה • .iterator שמחזירה אובייקט שהוא __iter__(self)

• .iterable הוא גם iterator שימו לב שכל

Page 8: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמה

Page 9: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב
Page 10: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

לולאת for מתחילה בהפעלת •המתודה __iter__ כדי לקבל

איטרטור. בכל איטרציה היא מפעילה את •

המתודה __next__ כדי לקבל .i את הערך הבא של

הפסיקה StopIteration מציינת •עבור הלולאה את סיומה.

Page 11: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

לולאת for מתחילה בהפעלת •המתודה __iter__ כדי לקבל

איטרטור. בכל איטרציה היא מפעילה את •

המתודה __next__ כדי לקבל .i את הערך הבא של

הפסיקה StopIteration מציינת •עבור הלולאה את סיומה.

• ,iterator הוא fibonacci האובייקט .self מחזירה את __iter__ לכן

אם הגענו לסוף הסדרה, כל קריאה •נוספת ל-__next__ גורמת להעלאת

StopIteration הפסיקה

Page 12: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

לולאת for מתחילה בהפעלת •המתודה __iter__ כדי לקבל

איטרטור. בכל איטרציה היא מפעילה את •

המתודה __next__ כדי לקבל .i את הערך הבא של

הפסיקה StopIteration מציינת •עבור הלולאה את סיומה.

• ,iterator הוא fibonacci האובייקט .self מחזירה את __iter__ לכן

אם הגענו לסוף הסדרה, כל קריאה •נוספת ל-__next__ גורמת להעלאת

StopIteration הפסיקהאפשר לפתור את הבעייה הזו

.iterable-על ידי שימוש ב

Page 13: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמה משופרת

Page 14: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב
Page 15: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

• ,range ,list ,tuple הטיפוסיםstr הם iterable, אבל הם לא

האיטרטורים של עצמם. לכן, לדוגמה, אפשר לעבור •

על אותו list פעמיים בשתי לולאות עוקבות.

Page 16: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

גנרטוריםגנרטור (generator) הוא צורה מקוצרת לייצר איטרטור. •

גנרטור נראה בדיוק כמו פונקציה, אלא שבמקום פקודות return יש בו • .yield פקודות

קריאה לגנרטור תוך העברת הפרמטרים הנדרשים מייצרת איטרטור. •

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

שם ונמשיך בהרצה הדמיונית. סדרת הערכים שרשמנו היא הסדרה שמחזיר האיטרטור שנוצר. •

כל קריאה לגנרטור מייצרת את האיטרטור מחדש.•

Page 17: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמה

Page 18: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב
Page 19: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

פעולות עם איטרטוריםמיפוי (map): רוצים סדרה שנוצרת על ידי הפעלת •

פונקציה על איברי סדרה נתונה.

ניפוי (filter): רוצים תת-סדרה של סדרה נתונה. •

צמצום (reduce): חישוב ערך בודד שהוא פונקציה של •כל הסדרה.

בפייתון יש כלים כלליים לעבוד עם איטרטורים וגם •.(itertools במודול) כלים לבצע פעולות ספציפיות

Page 20: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמאות

Page 21: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב
Page 22: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

Page 23: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

list comprehension (list מייצר)

Page 24: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

generator expression (מייצר גנרטור)

Page 25: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

list comprehension בתוספת פילטר

Page 26: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

.str זו מתודה של המחלקההיא מקבלת אובייקט iterable שהאיטרטור שלו מפיק מחרוזות.

הקריאה string.join(iterable) משרשרת את סדרת המחרוזות .string מפיק, מופרדות על ידי iterable שהאיטרטור של

Page 27: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

עוד דוגמאות

Page 28: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

itertools -פונקציות מ

Page 29: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

itertools -פונקציות מ

Page 30: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

itertools -פונקציות מ

Page 31: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

itertools -פונקציות מ

Page 32: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

itertools -פונקציות מ

Page 33: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

יעילות של חישובים

Page 34: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

סימון אסימפטוטי• g:{1,2,3,…}→{1,2,3,…} -ו f:{1,2,3,…}→{1,2,3,…} תהיינה

שתי פונקציות מונוטוניות לא-יורדות על הטבעיים.

• m∈{1,2,3,…} -ו c > 0 אם ורק אם יש קבועים f = O(g) נסמן .f(n) ≤ c∙g(n) מתקיים n ≥ m עבורם לכל

דוגמה פשוטה: f(n) = 2n+1 ,g(n) = n. אפשר לקחת c = 3 ו- • .2n+1 ≤ 3n מתקיים n ≥ 1 כי לכל ,m = 1

• .g = O(f) אםם f = Ω(g) נסמן

•.f = Ω(g) וגם f = O(g) אםם f = Θ(g) נסמן

Page 35: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמאות .c = 1 אז ניקח ,n ≤ 2n+1 ,n ≥ 1 2, כי לכלn+1 = Ω(n)

.2n+1 = Θ(n) ,2, לכןn+1=O(n)-ראינו כבר ש

.c = 2 אז ניקח ,n2+106n ≤ 2∙n3 ,n ≥ 1000 כי לכל ,n2+106n = O(n3) .n2+106n ≠ Ω(n3) ,מצד שני

n2+106n = Θ(n2). למה?

.loga n = Θ(log2 n) ,a > 1 לכל קבוע .(c = 1/log2 a ניקח) loga n = log2 n / log2 a זה נובע ישירות מהזהות

לכן בסימון אסימפטוטי נכתוב O(log n) וכדומה, בלי לציין בסיס ספציפי.

2n = O(3n), אבל 3n ≠ O(2n). בחזקות, בניגוד ללוגריתמים, הבסיס חשוב.

Page 36: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמאות .c = 1 אז ניקח ,n ≤ 2n+1 ,n ≥ 1 2, כי לכלn+1 = Ω(n)

.2n+1 = Θ(n) ,2, לכןn+1=O(n)-ראינו כבר ש

.c = 2 אז ניקח ,n2+106n ≤ 2∙n3 ,n ≥ 1000 כי לכל ,n2+106n = O(n3) .n2+106n ≠ Ω(n3) ,מצד שני

n2+106n = Θ(n2). למה?

.loga n = Θ(log2 n) ,a > 1 לכל קבוע .(c = 1/log2 a ניקח) loga n = log2 n / log2 a זה נובע ישירות מהזהות

לכן בסימון אסימפטוטי נכתוב O(log n) וכדומה, בלי לציין בסיס ספציפי.

2n = O(3n), אבל 3n ≠ O(2n). בחזקות, בניגוד ללוגריתמים, הבסיס חשוב.

ax = n אםם x = loga n :הגדרה

Page 37: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

דוגמאות .c = 1 אז ניקח ,n ≤ 2n+1 ,n ≥ 1 2, כי לכלn+1 = Ω(n)

.2n+1 = Θ(n) ,2, לכןn+1=O(n)-ראינו כבר ש

.c = 2 אז ניקח ,n2+106n ≤ 2∙n3 ,n ≥ 1000 כי לכל ,n2+106n = O(n3) .n2+106n ≠ Ω(n3) ,מצד שני

n2+106n = Θ(n2). למה?

.loga n = Θ(log2 n) ,a > 1 לכל קבוע .(c = 1/log2 a ניקח) loga n = log2 n / log2 a זה נובע ישירות מהזהות

לכן בסימון אסימפטוטי נכתוב O(log n) וכדומה, בלי לציין בסיס ספציפי.

2n = O(3n), אבל 3n ≠ O(2n). בחזקות, בניגוד ללוגריתמים, הבסיס חשוב.

Page 38: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב
Page 39: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

קצב הגידול של הפונקציה

n

f(n)

log n

nn log n

n2

2n

n!

Page 40: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

סיבוכיותמדד חשוב ליעילות של אלגוריתם הוא כמות המשאבים שהוא צורך •

כפונקציה של אורך הקלט (בביטים או בתאי זיכרון בגודל קבוע).

המשאבים שמעניינים אותנו הם: •זמן - מספר הפעולות הבסיסיות הנדרשות. •מקום - מספר תאי הזיכרון (בנוסף לקלט) הנדרשים. •

פעולה בסיסית - כל פעולת מחשב שלוקחת זמן שלא תלוי באורך •הקלט (פעולות חשבון, השמות, השוואות, …)

בפייתון צריך להיזהר עם הספירה - הרבה קורה ״מאחורי הקלעים״ •

בכל אורך קלט נתייחס למקרה הגרוע ביותר של קלט באורך זה.•

Page 41: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

סיבוכיות אסימפטוטיתבדרך כלל תעניין אותנו ההתנהגות האסימפטוטית של •

סיבוכיות האלגוריתם, ולא הפונקציה המדוייקת.

לדוגמה: למצוא מינימום של n ערכי קלט בשיטה • .Θ(n) המקובלת לוקח זמן של

גישה זו מתעלמת מקבועים כפליים. למשל, סיבוכיות •של n3 יותר גרועה מסיבוכיות של n2∙10100, למרות

שלכל קלט סביר הערך הראשון קטן מהשני.

Page 42: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

השוואת אלגוריתמים

נתונים שני אלגוריתמים A ו-B לבעייה מסויימת. רוצים •להשוות, לדוגמה, את משאבי הזמן שהם דורשים.

• .Θ(g) היא B ושל Θ(f) היא A סיבוכיות הזמן של

• .f = Θ(g) שווי ביצועים אם B-ו A האלגוריתמים

• .n → ∞ כאשר f(n)/g(n) → 0 אם B עדיף על A האלגוריתם•.g = ω(f) וגם f = o(g) במקרה זה נסמן

Page 43: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

למה זה טוב?סיבוכיות אסימפטוטית לא תלוייה בסביבת העבודה •

הספציפית (חומרה, מערכת הפעלה).

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

סיבוכיות אסימפטוטית נותנת מושג על התועלת •הצפוייה משיפור ביצועי החומרה.

טענות לגבי סיבוכיות אסימפטוטית תקפות לכל קלט •אפשרי.

Page 44: בשחמה יעדמל אובמ - cs.huji.ac.ilyrabani/Lecture Notes/Intro/lecture10.pdf · בשחמה יעדמל אובמ תויכוביס ,םירוטרטיא ,אדמל ייוטיב

למה זה רע?

לפעמים ביצועי האלגוריתם הרבה יותר טובים על קלט •אופייני (אבל קשה לאפיין מהו קלט אופייני).

עבור קבועים מאוד גדולים (למשל 10100), באופן מעשי •הקבועים חשובים יותר מהאסימפטוטיקה.