áùçîä éòãîì äîâîä ÌÈÏÈ ÂÁ

Σχετικά έγγραφα
(2) מיונים השאלות. .0 left right n 1. void Sort(int A[], int left, int right) { int p;

השאלות..h(k) = k mod m

םינותנ ינבמ 3 ליגרתמ תולאשל המוד תולאש טסל תונורתפ תולאשה

השאלות ידי מצביעים לילדים.

פתרון תרגיל 5 מבוא ללוגיקה ותורת הקבוצות, סתיו תשע"ד

פתרון תרגיל מרחבים וקטורים. x = s t ולכן. ur uur נסמן, ur uur לכן U הוא. ur uur. ur uur

חורף תש''ע פתרון בחינה סופית מועד א'

( n) ( ) ( ) שאלה 1: שאלה 2: שאלה 3: (n 5) = Θ. ב. אם f 1, f 2, g 1, g 2. .g 1 *g 2 = Ω(f 1 *f 2 ) , g. ג. ) n.n! = θ(n*2. n) f ( אז ד. אם ה. אם ו.

תרגיל 13 משפטי רול ולגראנז הערות

פתרון תרגיל 8. מרחבים וקטורים פרישה, תלות \ אי-תלות לינארית, בסיס ומימד ... ( ) ( ) ( ) = L. uuruuruur. { v,v,v ( ) ( ) ( ) ( )

דף פתרונות 7 נושא: תחשיב הפסוקים: צורה דיסיונקטיבית נורמלית, מערכת קשרים שלמה, עקביות

סדרות - תרגילים הכנה לבגרות 5 יח"ל

יסודות לוגיקה ותורת הקבוצות למערכות מידע (סמסטר ב 2012)

צעד ראשון להצטיינות מבוא: קבוצות מיוחדות של מספרים ממשיים

גבול ורציפות של פונקציה סקלרית שאלות נוספות

ל הזכויות שמורות לדפנה וסטרייך

( )( ) ( ) f : B C היא פונקציה חח"ע ועל מכיוון שהיא מוגדרת ע"י. מכיוון ש f היא פונקציהאז )) 2 ( ( = ) ( ( )) היא פונקציה חח"ע אז ועל פי הגדרת

= 2. + sin(240 ) = = 3 ( tan(α) = 5 2 = sin(α) = sin(α) = 5. os(α) = + c ot(α) = π)) sin( 60 ) sin( 60 ) sin(

תרגול 1 חזרה טורי פורייה והתמרות אינטגרליות חורף תשע"ב זהויות טריגונומטריות

מבני נתונים מבחן מועד ב' סמסטר חורף תשס"ו

I. גבולות. x 0. מתקיים L < ε. lim אם ורק אם. ( x) = 1. lim = 1. lim. x x ( ) הפונקציה נגזרות Δ 0. x Δx

שדות תזכורת: פולינום ממעלה 2 או 3 מעל שדה הוא פריק אם ורק אם יש לו שורש בשדה. שקיימים 5 מספרים שלמים שונים , ראשוני. שעבורם

מבני נתונים ויעילות אלגוריתמים

TECHNION - ISRAEL INSTITUTE OF TECHNOLOGY DEPARTMENT OF COMPUTER SCIENCE סמסטר אביב תשס"ו מס' סטודנט:

שאלה 1 V AB פתרון AB 30 R3 20 R

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

לדוגמה: במפורט: x C. ,a,7 ו- 13. כלומר בקיצור

Logic and Set Theory for Comp. Sci.

מבני נתונים ואלגוריתמים תרגול #3 נושאים: תור קדימויות/ערימה, עצים

gcd 24,15 = 3 3 =

תוכן הפרק: ,best case, average case דוגמאות 1. זמן - נמדד באמצעות מס' פעולות סיבוכיות, דוגמאות, שיפור בפקטור קבוע האלגוריתם. וגודלם. איטרטיביים. לקלט.

תרגול פעולות מומצאות 3

3-9 - a < x < a, a < x < a

אסימפטוטיים תוכנית הקורס עצי AVL עצי 2-3 עצי דרגות סיבוכיות משוערכת מיון מיון שימושים: גרפים איסוף אשפה

לוגיקה ותורת הקבוצות פתרון תרגיל בית 8 חורף תשע"ו ( ) ... חלק ראשון: שאלות שאינן להגשה נפריד למקרים:

מבני נתונים מבחן מועד א' סמסטר אביב תשס"ו

2 יח"ל ) השלמה ל - 5 יח"ל) (50 נקודות) מעבר חוקי, ו-'שקר' אחרת.

מבני נתונים 08a תרגול 8 14/2/2008 המשך ערמות ליאור שפירא

חלק א' שאלה 3. a=3, b=2, k=0 3. T ( n) היותר H /m.

לוגיקה ותורת הקבוצות פתרון תרגיל בית 4 אביב תשע"ו (2016)

אלגברה ליניארית (1) - תרגיל 6

מיונים א': מיון (Sorting) HeapSort. QuickSort תור עדיפויות / ערימה

תשובות מלאות לבחינת הבגרות במתמטיקה מועד ג' תשע"ד, מיום 0/8/0610 שאלונים: 315, מוצע על ידי בית הספר לבגרות ולפסיכומטרי של אבירם פלדמן

תרגיל 7 פונקציות טריגונומטריות הערות

brookal/logic.html לוגיקה מתמטית תרגיל אלון ברוק

תרגול מס' 6 פתרון מערכת משוואות ליניארית

חידה לחימום. כתבו תכappleית מחשב, המקבלת כקלט את M ו- N, מחליטה האם ברצוappleה להיות השחקן הפותח או השחקן השappleי, ותשחק כך שהיא תappleצח תמיד.

{ : Halts on every input}

מבני נתונים ויעילות אלגוריתמים

[ ] Observability, Controllability תרגול 6. ( t) t t קונטרולבילית H למימדים!!) והאובז' דוגמא: x. נשתמש בעובדה ש ) SS rank( S) = rank( עבור מטריצה m

אלגוריתמים 1, סמסטר אביב 2017

תורת הגרפים - סימונים

Hash Tables (המשך) ערבול (Hashing)

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

דוגמה: יהי T עץ בינארי כפי שמתואר בציור הבא:

מתמטיקה בדידה תרגול מס' 5

תורת הקבוצות תרגיל בית 2 פתרונות

מבחן מועד ב' בהצלחה! אנא קיראו היטב את ההוראות שלהלן: ודאו כי כל עמודי הבחינה נמצאים בידכם.

אוסף שאלות מס. 3 פתרונות

מתמטיקה בדידה תרגול מס' 12

הגדרה: קבוצת פעילויות חוקית היא קבוצה בה כל שתי פעילויות

סיכום- בעיות מינימוםמקסימום - שאלון 806

מתכנס בהחלט אם n n=1 a. k=m. k=m a k n n שקטן מאפסילון. אם קח, ניקח את ה- N שאנחנו. sin 2n מתכנס משום ש- n=1 n. ( 1) n 1

כלליים זמן: S מחסנית, top(s) ראש המחסנית. (Depth First Search) For each unmarked DFS(v) / BFS(v) רקורסיבי. אלגוריתם :BFS

מבני נתונים (234218) 1

ניהול תמיכה מערכות שלבים: DFfactor=a-1 DFt=an-1 DFeror=a(n-1) (סכום _ הנתונים ( (מספר _ חזרות ( (מספר _ רמות ( (סכום _ ריבועי _ כל _ הנתונים (

מבני נתונים מבחן מועד א' סמסטר חורף תשס"ו

אלגברה מודרנית פתרון שיעורי בית 6

תאריך עדכון אחרון: 27 בפברואר ניתוח לשיעורין analysis) (amortized הוא טכניקה לניתוח זמן ריצה לסדרת פעולות, אשר מאפשר קבלת

סיכום בנושא של דיפרנציאביליות ונגזרות כיווניות

בחינה בסיבוכיות עמר ברקמן, ישי חביב מדבקית ברקוד

מבני נתונים הגבלת אחריות פרק - 1 אלגוריתמי מיון ואנליזה אסימפטוטית. מיון בועות Sort Bubble מאת : סשה גולדשטיין,

אלגברה ליניארית 1 א' פתרון 2

קיום ויחידות פתרונות למשוואות דיפרנציאליות

לוגיקה ותורת הקבוצות מבחן סופי אביב תשע"ב (2012) דפי עזר

מבני נתונים עצים שיעור 7

תכנון אלגוריתמים 2016 עבודה 1 שאלה 1 פתרון נתונות שתי בעיות. יש למצוא: אורך מסלול קצר ביותר המתחיל באחד מן הקודקודים s 1,..., s k ומסתיים ב t.

פתרון תרגיל בית 6 מבוא לתורת החבורות סמסטר א תשע ז

x a x n D f (iii) x n a ,Cauchy

s ק"מ קמ"ש מ - A A מ - מ - 5 p vp v=

קבוצה היא שם כללי לתיאור אוסף כלשהו של איברים.

מתמטיקה בדידה תרגול מס' 13

אינפי - 1 תרגול בינואר 2012

עצי 2-3 תזכורת: בנים. דוגמאות: Chapter 19: B trees ( ) Chapter 15: Augmenting data structures ( )

םינותנ ינבמ (הנכות ידימלתל)

' 2 סמ ליגרת ןורתפ םיפרגה תרותב םימתירוגלא דדצ 1 : הלאש ןורתפ רבסה תורעה

מיון. 1 מיון ערימה (Heapsort) חלק I 1.1 הגדרת ערימה 0.1 הגדרה של המושג מיון מסקנה: הערך הכי גבוה בערימה נמצא בשורש העץ!

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

אוטומט סופי דטרמיניסטי מוגדר ע"י החמישייה:

תרגילים באמצעות Q. תרגיל 2 CD,BF,AE הם גבהים במשולש .ABC הקטעים. ABC D נמצאת על המעגל בין A ל- C כך ש-. AD BF ABC FME

1 תוחלת מותנה. c ארזים 3 במאי G מדיד לפי Y.1 E (X1 A ) = E (Y 1 A )

תוכן עניינים I בעיות מיון 2 1 סימון אסימפטוטי... 2 II מבני נתונים 20 8 מבני נתונים מופשטים משפט האב גרפים... 37

מבני נתונים ואלגוריתמים תרגול #11

אוניברסיטת בר אילן מבני נתונים תרגולים מרצה: פרופ' שמואל טומי קליין סמסטר ב', תש"ע

הגדרה: מצבים k -בני-הפרדה

Nir Adar גירסה 1.00 עמוד 1

פתרון תרגיל 4 יסודות מבני נתונים סמסטר א' תשע"ה שאלה 1:

סיכום חקירת משוואות מהמעלה הראשונה ומהמעלה השנייה פרק זה הינו חלק מסיכום כולל לשאלון 005 שנכתב על-ידי מאיר בכור

תרגול מס' 1 3 בנובמבר 2012

עץץץץ AVL. עץ AVL הוא עץ חיפוש בינארי שמקיים את התנאי הבא: לכל צומת x בעץ גורם האיזון של x הוא 1, 0, או 1-. הגדרה: במילים אחרות: לכל צומת x בעץ,

Transcript:

åôé-à"ú ìù úéîã àä äììëîä áùçîä éòãîì äîâîä :ÌÈ Â È Ó ÌÈÏÈ ÂÁ

הנחיות כלליות: יש להגיש את כל התרגילים בזמן (זמני ההגשה מצוינים בסילבוס הקורס). ציונו של תרגיל שיוגש באיחור יהיה 0, למעט מקרים חריגים כגון שירות מילואים, לידה ומחלה. במקרים אלה יש להביא אישור על כך. יש להגיש כל תרגיל עד לתחילתו של השיעור השני בשבוע ההגשה. יש להגיש את כל התרגילים בכתב ברור ומסודר. תלמיד שאינו מסוגל לעשות זאת, מתבקש להדפיס את התרגילים! התרגילים העיוניים הם אישיים. אנו רואים בחומרה רבה העתקות של בעבודות שהוגשו בסמסטרים קודמים), וכאלו אם יתגלו יטופלו משמעתית. (כולל שימוש עבודות הציון על תרגילי הבית ישקף גם את ההערכה לעבודתו של הסטודנט ולא רק את נכונות הפתרון. כאשר אתם מתארים מבנה נתונים הקפידו על השלבים הבאים: תארו את מבנה הנתונים במילים בצורה מדויקת. 1. אם מבנה הנתונים כולל כמה חלקים, הקפידו לתאר תחילה תיאור ברמת על של החלקים, 2. ורק אח"כ תארו בפירוט כל חלק. הוסיפו ציור של מבנה הנתונים שכולל את חלקיו השונים ואת הקשרים ביניהם. 3. אם אתם משתמשים במנה נתונים זהה לחלוטין למה שנלמד בכיתה, ניתן להשתמש בו 4. שחורה. אולם אם אתם משנים משהו במימוש תארו את השינויים במדויק. כבקופסה כאשר אתם כותבים אלגוריתם הקפידו על השלבים הבאים: 1. כתבו תחילה תיאור עילי קצר של האלגוריתם. 2. כתבו את האלגוריתם בצורה ברורה, הקפידו על אינדנטציה, מספרו את השלבים השונים וכדומה. פרטים המסרבלים את האלגוריתם יש לכתוב לחוד כמו פונקציה בשפת תכנות. למשל, נניח שאתם כותבים אלגוריתם כלשהו המטפל בעץ בינארי ובתוך האלגוריתם יש קטע המוצא את הצומת הגדול ביותר בערכו בעץ. כתבו רק "נמצא את הצומת בעל הערך הגדול ביותר בעץ" ותארו בנפרד איך לבצע זאת. 3. הוכיחו את נכונות האלגוריתם. 4. נתחו את יעילותו של האלגוריתם מבחינת זמן וזיכרון. נסחו במפורש ובמדויק כל תוצאה שהוכנו בכיתה, כאשר אתם משתמשים בה.

log( n 3 סדרי גודל: שאלה 1: הוכיחו את הטענות הבאות עפ"י הגדרה: 3 3. n 5 n = Ω(n א ) n 2 + 9 n = Ο(n) ב. + 7 n) = Θ(log(n)) ג. שאלה 2: הוכיחו ש- O משרה יחס סדר חלש, כלומר מקיים :. f (n) = O(f (n)) : רפלקסיביות. i ו- O(h(n)) g (n) = אז אם n)) f (n) = O(g( טרנזיטיביות :. ii. f (n) = O(h(n)).(f(n) = Θ(g(n)) אמ "מ g(n) = O(f(n)) אז f(n) = O(g(n)) אנטי סימטריות חלשה: אם. iii שאלה 3: נתונה ההגדרה הבאה עבור ˆO (רמזים באתר הקורס): + תהיינה f, g : N R שתי פונקציות. נאמר שהפונקציה g היא Ô של f, ונסמן זאת על ידי. g(n) c f(n) מתקיים n כך שלכל 1 c אם קיים קבוע > 0, g ( n) = Oˆ ( f ( n)) הוכיחו שההגדרות של ˆO ו- O שקולות.. g ( n) = O( f ( n)) אם"ם g ( n) הערה : כדי להראות ששתי ההגדרות שקולות הראו ש- ((n) = O ˆ ( f (שימו לב שהפונקציות חיוביות ממש) שאלה 4: הוכיחו עפ"י הגדרה (רמזים באתר הקורס): n / 2 n / 2 א. n O(3 n! O(3 n ) ב. ) ג. ) a,(n - b) a = Θ(n כאשר a,b שני קבועים, 0 > a. (שימו לב, b אינו בהכרח חיובי, הוא יכול להיות גם שלילי או 0). - 1 -

log( n) 6 log( n) n n n n! n log( n) שאלה 5: דרגו את הפונקציות הבאות עפ"י סדר גודל עולה: 6 log( n) n n n n log(log( n)) n 2 log( ) 2 log ( ) 1 n log( n) 2 n n n n n n log(log( )) הערה : אין צורך להוכיח את הדירוג, אך חשוב שתשתכנעו בעצמכם בנכונותו. שאלה 6: בנוסף לסימונים O,Ω,Θ שנראו בכיתה, קיימים שני סימונים חשובים נוספים, o,ω קטן. ההגדרות של o,ω נמצאות במקראה. אומגה קטן ו- אוו 3 f (n) = n 4 n g(n) = 5 n 2 + 3n נתונות f ו - g הבאות : הוכיחו ש- o(f) g = המופיעות שם). עפ"י ההגדרה הראשונה של o קטן מהמקראה (לא על פי ההגדרות הנוספות ניתוח סדרי גודל זמן ריצה - 2 -

זמני ריצה של פונקציות איטרטיביות: שאלה 1: נתחו את זמן הריצה של הפונקציות הבאות במונחים של Θ (הוכיחו טענתכם במפורט ): א. void func1(int n) { int i,j,x; for (i = 1; i <= n; i++) if (i % 2 == 1) x++; void func2(int n) { int i,j,y; ב. for (i = n; i >= 1; i = i - 2) for (j = i; j <= n; j++) y--; int func3(int n) { int x, y; ג. y = 1; x = n; while (x > 1){ x = x / 2; y++; return y; int func4(int n) { int j, y; ד. for(j = 1; j <= n; j++){ y = j; while (y > 1) y /= 2; - 3 -

int func5(int n) { int j, y; ה. for(j = n; j >= 1; j--){ y = 1; while (y < j) y *= 2; while (y > 2) y = sqrt(y); הערה : ניתן להניח שפעולת sqrt מתבצעת ב- (1 )Θ. int func6(int n) { int j, y; ו. for (j = 2; j <= n; j *= j){ y = 1; while (y < j) y *= 2; while (y > 2) y = sqrt(y); הערה : ניתן להניח שפעולת sqrt מתבצעת ב- (1 )Θ. ז. עבור כל אחד מהסעיפים א' ב' ו- ג' (של שאלה זו), ציירו גרף, המתאר את זמן הריצה (במילי-שניות) של הפונקציות, כפונקציה של גודל הקלט. הריצו את הפונקציות השונות על קלטים בגודל: n=1000; n=5000; n=10,000; n=50,000; n=100,000; n=500,000; n=1,000,000; לשם מדידת הזמנים, השתמשו בפונקציה._ftime() להלן תוכנית דוגמא, המודדת את הזמן של ביצוע הפונקציה, func1 עם קלט בגודל 10,000: #include <stdio.h> #include <sys/timeb.h> #include <time.h> const MILLI_SECONDS_IN_SECOND = 1000; const SECONDS_WINDOW = 1000000; void main(){ struct _timeb Start_timebuffer,End_timebuffer; unsigned long int milli_start, milli_end, milli_diff; int n=10000; _ftime( &Start_timebuffer ); func1(n); _ftime( &End_timebuffer ); milli_start = (Start_timebuffer.time % SECONDS_WINDOW) * MILLI_SECONDS_IN_SECOND + Start_timebuffer.millitm; milli_end = (End_timebuffer.time % SECONDS_WINDOW) * MILLI_SECONDS_IN_SECOND + End_timebuffer.millitm; milli_diff = milli_end - milli_start; printf("this function took %lu milli-seconds\n", milli_diff); - 4 -

הערה: עבור קלטים קטנים, או כאשר זמן הריצה של הפונקציה הינו מהיר, זמן הריצה שנמדוד עלול להיות קטן מידי (אולי אפילו 0 מילי-שניות). בכדי להעריך את זמן הריצה במקרים כאלו, ניתן להפעיל את הפונקציה מספר רב של פעמים, ולחלק במספר ההפעלות. כלומר: _ftime( &Start_timebuffer ); for (i=0; i<1000; i++) func1(n); _ftime( &End_timebuffer ); milli_diff = (milli_end - milli_start)/1000.0; כמובן, את ההשמה האחרונה יש לבצע לתוך משתנה מטיפוס double כי אחרת שוב עלולים לקבל. 0 במקום לחלק במספר ההפעלות, אפשר לחילופין לתת את התוצאה ביחידות אחרות. בדוגמה למעלה, אם לא נחלק ב- 1000 אז התוצאה תהיה במיקרו שניות. - 5 -

זמני ריצה של פונקציות רקורסיביות: שאלה 1: פתרו את נוסחאות הנסיגה בסעיפים א-ג על ידי הצבה חוזרת. א. n T(n) = T(n 1) + log כאשר = 1 T(1). ב. 1 + 2T(n 3) T(n) = כאשר = 1 T(2). T(0) = T(1) = ג. 1 + ) n T(n) = T( כאשר = 1 T(2). T(1) = ד. הפונקציה הבאה מקבלת כקלט מערך A הכולל n מספרים, ושני אינדקסים :.0 left right n 1 חשבו חסם הדוק במונחי Θ לזמן הריצה של הפונקציה כאשר היא נקראת עם הפרמטרים = 0 left, ו- n 1 right = לפי ההנחיות הבאות: כתבו נוסחת נסיגה לזמן הריצה ופתרו אותה על ידי הצבה חוזרת. void Sort(int A[], int left, int right) { int p; if ( left < right) { p = (right left + 2)/3; Sort(A,left, left + p 1); Sort(A, left + p, left + 2*p 1); MergeSort(A, left + 2*p, right); Merge3(A, left, left + p, left + 2*p, right); היא הפונקציה שראינו בכיתה שממיינת את המערך A בין הגבולות i ל- j בעזרת אלגוריתם MergeSort שלמדנו. כאשר: MergeSort(A, i, j) היא פונקציה הממזגת שלושה חלקים ממוינים הנמצאים בין הגבולות i ל- 1 j j, ל - k 1, ו- k ל -,f ויעילותה ליניארית במספר הנתונים הכולל שהיא ממזגת. (אם אחד החלקים ריק אז הפונקציה ממזגת את שני החלקים הנותרים) Merge3(A, i, j, k, f) - 6 -

שאלה 2: פתרו את נוסחאות הנסיגה בסעיפים א-ב על ידי עץ רקורסיה. יש לשרטט את העץ בצורה ברורה ולציין ליד כל רמה את מספר הרמה ואת מספר הפעולות המתבצעות ברמה. כמו כן יש לתת את הנוסחה למספר הפעולות ברמה l כלשהי בעץ. א. n T(n) = T(n/3) + T(n/2) + כאשר = 1 T(1). T(0) = ב. n T(n) = T(2n/5) + T(3n/5) + כאשר = 1 T(1). T(n) = n + k i= 1 T(a n) i שאלה 3: הכלילו את הפתרונות לשאלה 2 כדלקמן. נניח שנוסחת הנסיגה היא כאשר k קבוע ולכל a i, 1 i k הוא קבוע המקיים < 1 i < a 0. מה יהיה פתרון נוסחת הנסיגה כאשר : k i= 1 k i= 1 k i= 1 a i א. < 1 a i ב. = 1 עבור כל אחד מהסעיפים, הסבירו במילים מדוע לדעתכם הפתרון שנתתם נכון (אינכם צריכים לתת את פרטי הפתרון).? a i נמקו. מה יקרה לדעתכם כאשר > 1 שאלה 4: מצאו את נוסחת הנסיגה עבור זמן הריצה של האלגוריתמים הבאים. אין צורך לפתור את הנוסחה שמצאתם. int stam(int Arr[], int n){ int mid1, mid2, mid3; int i, sum; if (n <= 1) return 0; else{ mid1 = n/3; sum = stam(arr, mid1); mid2 = (n - mid1)/2; sum += stam(arr + mid1, mid2); mid3 = (n - mid1 - mid2)/2; sum += stam(arr + mid1 + mid2, mid3); for(i=0; i< 2n; i++) sum += Arr[i]; return sum; - 7 -

י" שאלה 5: האלגוריתם הרקורסיבי הבא למציאת האיבר ה- i הקטן ביותר במערך A בעל n איברים ) אלגוריתם,(iii) ), ii) (שלבים pivot דומה לאלגוריתם שלמדנו. ההבדל העיקרי הוא דרך מציאת ה- ( Selection ו- iv) ( להלן.( אם 70 n נמיין את A בעזרת Bubble Sort ונחזיר את האיבר ה - i במערך הממוין. (i) אחרת: יכיל את 5 האיברים נחלק את A ל - n/5 תתי מערכים n/5 A 1, A 2,..., A כך שתת המערך (ii) A 1 A 2 יכיל את 5 האיברים הבאים ב - A, וכך הלאה. הראשונים ב-, A תת המערך (iii) לכל j n / 5,j 1 נמיין את A j בעזרת. Bubble Sort עבור כל מערך A j הממוין כעת, נסמן את האיבר האמצעי (השלישי מתוך החמישה) ב- b j וניצור מערך n/5. B = b 1, b 2,..., b (iv) נמצא ברקורסיה את החציון ב- B (כלומר את האיבר ה- 10/n הקטן ביותר ב - B ). זה יהיה ה-.pivot k יהי ). iv) שמצאנו בשלב pivot - בעזרת ה A על המערך Partition נבצע את אלגוריתם (v) המיקום של ה- pivot שמוחזר ע Partition (כלומר ה- pivot הוא האיבר ה - k הקטן ביותר ב- A)..pivot הקטן ביותר בתת המערך משמאל ל- i - נמצא ברקורסיה את האיבר ה i < k אם (vi) אחרת, אם i > k נמצא ברקורסיה את האיבר ה- (i-k) הקטן ביותר בתת המערך מימין ל-.pivot אחרת, אם i = k נחזיר את ה- pivot הוא האיבר ה- i הקטן ביותר הנדרש. אפשר להראות שכתוצאה מבחירת ה- pivot בצורה שתוארה, הערך k בשלב (v ( מקיים 3 7 + 6 n n 6 k (למעוניינים, אפשר למצוא את הפרטים בחלק מהספרים המומלצים לקורס 10 10 למשל,.(Introduction to Algorithms, Cormen, Leiserson and Rivest לשם השאלה שלנו נניח שהערך. 7 k בשלב (v ( הוא בדיוק n 1 ושהרקורסיה בשלב (vi) תהיה תמיד לתת המערך הגדול יותר 10 + בהתחשב בהנחות אלו, מצאו נוסחת נסיגה לזמן הריצה T(n) של אלגוריתם ה- Selection שתואר. שאלה : 6 פתרו את נוסחאות הרקורסיה בסעיפים א-ד בעזרת משפט האב. הניחו כי = 1 (1)T. T(n) = 16T(n/4) + n א. T(n) = 6T(n/6) + n ב. T(n) = T(3n/4) + n 2 ג. 7 + T(5n/6) T(n) = ד. T 2 (n) = 2 T( n ) + n / log(n ) שאלה 7: א. נתונה נוסחת הנסיגה הבאה: מצאו חסם הדוק ל-.T(n) ב. נתונה נוסחת הנסיגה הבאה : n T(n) = T( 2) + log(n) מצאו חסם הדוק ל- T(n) והוכיחו את נכונות החסם שמצאתם עפ"י ההגדרה. שימו לב שנדרש שימוש באינדוקציה בסעיף זה. - 8 -

מיונים: שאלה 1: נתונים n אברים, המחולקים ל- k קבוצות S 1,S2,, Sk כל אחת מכילה קבוצה קטנים מאברי הקבוצה הבאה וגדולים מאברי הקבוצה הקודמת, כלומר כל אברי n/k אברים. אברי כל S i גדולים. S i+1 i 1, S וקטנים מאברי מאברי א. מצאו חסם תחתון לסדר גודל מספר ההשוואות המינימלי הנדרש כדי למיין את n האברים במקרה הגרוע. הוכיחו תשובתכם. כלומר עליכם להוכיח ששום אלגוריתם לבעיה זו אינו יכול לרוץ בזמן מהיר יותר (בסדר גודל) מהחסם שנתתם. (שימו לב שתשובה לסעיף זה אינה יכולה להיות תאור של אלגוריתם). ב. הראו שהחסם שנתתם הדוק, ע"י תאור אלגוריתם שרץ בזמן זה. הדרכה לסעיף א': חשבו ראשית את מספר העלים בעץ ההכרעה, כלומר את מספר התמורות השונות האפשריות של הקלט לקבלת מערך ממוין. שאלה 2: בכיתה ראינו שאפשר להשתמש ב- Radix Sort על מנת למיין מספרים בתחום {1-, n 2,0 בזמן ליניארי, במקרה הגרוע. א) תארו שתי שיטות לחילוץ המספרים המופיעים ב- log n הביטים הראשונים וב- log n הביטים האחרונים של כל מספר בקלט (מספרים אלו משמשים כמפתח key בהפעלות.(bucket sort שיטה אחת תשתמש בפעולות על ביטים, ושיטה אחת לא תשתמש בפעולות כאלו. ב) נשתמש עתה ב- Radix Sort על מנת למיין מספרים מתחום גבוה יותר מ- n: 2 i) מה יהיה זמן הריצה אם תחום המספרים יהיה {1- l, n,0? (מותר להניח ש- l שלם.) (ii לאילו ערכי l זמן הריצה יישאר ליניארי??Merge Sort המכסימלי כך שהאלגוריתם יהיה יעיל לפחות כמו l מה ערך ה- (iii - 9 -

מחסניות ותורים : שאלה 1: נגדיר סדרה בנויה היטב ומדורגת של סוגריים באופן רקורסיבי: הסדרות ),( ],[ { בנויות היטב. דרגתן היא,2,1 ו- 3 בהתאמה. אם, b, a ו - c סדרות בנויות היטב שדרגתן,2,1 ו- 3 בהתאמה אז : (a) סדרה בנויה היטב ודרגתה 1. [a] ו- [b] סדרות בנויות היטב ודרגתן. 2 {b, ו - {c סדרות בנויות היטב ודרגתן. 3,{a אם a ו - b סדרות בנויות היטב שדרגתן היא i ו - j בהתאמה, אז :.max(i,j) היא סדרה בנויה היטב ודרגתה היא b) ו- a כאן לשרשור הסדרות (הכוונה ab למשל,{] ] [,{ ו - ) ] [ ( אינן בנויות היטב, ואילו הסדרה ) ( ] [ { בנויה היטב ודרגתה.3 כתבו אלגוריתם המקבל קלט הבנוי מסוגריים ומכריע האם הוא סדרה בנויה היטב. על האלגוריתם להשתמש רק במחסנית כמבנה נתונים, כאשר השימוש במחסנית יהיה כקופסה שחורה, כלומר רק ע"י הפעולות,Push(x),IsEmpty( ),Top( ),Pop( ) ו- ),MakeEmpty( מבלי להיכנס למימוש הפנימי של המחסנית. אתם יכולים להחליט על טיפוס הנתונים השמורים במחסנית (טיפוס זה יועבר לפעולה Push ויוחזר מהפעולות Pop ו-.( Top לצורך מעבר על הקלט על האלגוריתם להשתמש בפעולה ) GetNextParen( המחזיר את סימן הסוגריים הבא בקלט, או END_OF_INPUT בסוף הקלט. 2 שאלה 2: נניח שמוגדר טיפוס הנתונים המופשט מחסנית Stack היכול להכיל מספרים שלמים, ולבצע את הפעולות הבאות: Push(x), IsEmpty( ), Top( ), Pop( ), ו - ) MakeEmpty(. כמו כן מוגדר טיפוס הנתונים המופשט תור דו-כווני DQueue היכול להכיל מספרים שלמים ולבצע את הפעולות הבאות: ) MakeEmpty( מרוקנת את התור. ) IsEmpty( מחזירה true אם"ם התור ריק. QPush(x) מוסיפה נתון חדש לראש התור. ) QPop( - מורידה ומחזירה את הנתון הנמצא בראש התור. Enqueue(x) מוסיפה נתון חדש בסוף התור. ) Dequeue( מורידה ומחזירה את הנתון הנמצא בסוף התור. תור דו-כווני דומה מאוד לתור, אולם הוא מאפשר להוסיף ולהוריד נתונים משני צדי התור. הראו כיצד ניתן לממש בעזרת מחסנית אחת S, תור דו-כווני אחד,DQ וזיכרון נוסף בגודל קבוע (ללא שימוש ברקורסיה) את טיפוס הנתונים המופשט מחסנית אמצע MStack היכולה להכיל מספרים שלמים, ולבצע את הפעולות הבאות, כל אחת ב- (1 )Θ זמן במקרה הגרוע: MPush(x) מוסיפה נתון חדש לראש המחסנית (כמו מחסנית רגילה) ) MPop( מורידה את הנתון שנמצא בראש המחסנית ומחזירה אותו כערך(כמו מחסנית רגילה) MPushMid(x) מכניסה את x לאמצע המחסנית. n נתונים, ו- n זוגי אז x יכנס בדיוק לאמצע, אך אם n אי-זוגי x יכנס אחרי אם במבנה כרגע n+1. הנתון ה- - 10 -

שאלה 3: ברצוננו לממש טיפוס נתונים מופשט מחסנית מקסימום MaxStack שתומך בפעולות,Push(x) ו- Pop() הרגילות המוגדרות על מחסנית, וכן מאפשר לבצע את הפעולה ) Max( שמחזירה את האיבר הגדול ביותר מבין הנתונים שנמצאים כרגע במחסנית (מבלי להוציא אותו מהמחסנית!). א. תארו מבנה נתונים שמאפשר לבצע כל אחת מהפעולות האלה בזמן (1)Θ במקרה הגרוע. ב. נניח שברצוננו להחליף את הפעולה Max() בטיפוס הנתונים המופשט מחסנית מקסימום בפעולה ) DeleteMax( המוציאה את הנתון המקסימלי מהמחסנית ומחזירה את ערכו. הוכיחו כי במודל השוואות, אחת הפעולות Push(x) או ) DeleteMax( תדרוש Ω(log(n)) זמן במקרה הגרוע בכל מימוש שהוא. שאלה 4: נרצה לממש תור בעזרת 2 מחסניות. הסבירו כיצד תתבצע כל אחת מהפעולות הבסיסיות המוגדרות על תור, תוך שימוש בפעולות הבסיסיות של מחסנית כקופסאות שחורות, וכן זיכרון נוסף בגודל קבוע (ללא שימוש ברקורסיה). א. הציעו מימוש פשוט בו היעילות הנדרשת במקרה הגרוע עבור פעולות התור :.O(1) תתבצע ב- EnQueue(x) ) DeQueue( תתבצע ב-,O(k) כאשר k הוא מספר הנתונים כרגע בתור. בנוסף נדרש שסדרה של n פעולות EnQueue ו- DeQueue (בסדר כלשהו) המתחילה מתור ריק )Θ n זמן במקרה הגרוע. 2 תיקח ) שימו לב שמשמעות ה- Θ היא כפולה: א) כוון ה- O: יש להראות שכל n פעולות ייקחו ) 2 O(n זמן. ב) כוון ה- Ω: יש להראות שקיימת סדרת פעולות שתיקח ) 2 Ω(n זמן. ב. הציעו מימוש מתוחכם יותר בו היעילות הנדרשת במקרה הגרוע עבור פעולות התור היא כמו בסעיף א, כלומר:.O(1) תתבצע ב- EnQueue(x) ) DeQueue( תתבצע ב-,O(k) כאשר k הוא מספר הנתונים כרגע בתור. בנוסף נדרש הפעם שסדרה של n פעולות EnQueue ו- DeQueue (בסדר כלשהו) המתחילה מתור ריק תיקח Θ(n) זמן במקרה הגרוע. הערה : חישוב יעילות של סדרת פעולות נקרא.Amortized Analysis התרגיל הוא דוגמה לשני אלגוריתמים שיעילותם במקרה הגרוע זהה לכל פעולה, אך יעילותם שונה לחלוטין עבור סדרה של פעולות. שאלה 5 (רשות לא להגשה): ברצוננו לממש טיפוס נתונים מופשט תור מקסימום MaxQueue שתומך בפעולות EnQueue(x), ו - DeQueue() הרגילות המוגדרות על תור, וכן מאפשר לבצע את הפעולה ) Max( שמחזירה את האיבר הגדול ביותר מבין הנתונים שנמצאים כרגע בתור (מבלי להוציא אותו מהתור!). הציעו מימוש בו היעילות במקרה הגרוע המושגת עבור הפעולות: EnQueue(x) תתבצע ב-,O(k) כאשר k הוא מספר הנתונים כרגע בתור.. O(1) תתבצע ב- DeQueue( ).O(1) תתבצע ב- Max( ) בנוסף נדרש שכל סדרה של n פעולות DeQueue,EnQueue ו- Max (בסדר כלשהו) המתחילה מתור ריק תיקח O(n) במקרה הגרוע. הערה : למעשה אפשר (אך קשה יותר) לבצע את פעולת EnQueue ב- (n O(log במקרה הגרוע. המעוניינים מוזמנים לנסות זאת. - 11 -

עצים בינאריים: שאלה 1: נתון עץ בינארי T שבקדקודים שלו יש מספרים טבעיים, חלקם זוגיים, וחלקם אי-זוגיים. העץ ממומש על ידי מצביעים לילדים. כתבו אלגוריתם (T LongestSignChangingPath(Tree שיחזיר את אורכו של המסלול הארוך ביותר שמתחיל בשורש ומורכב מנתונים זוגיים ואי-זוגיים לסירוגין (המסלול אינו חייב להסתיים בעלה). דוגמה: בעץ הבא מודגש המסלול הארוך ביותר (שמתחיל בשורש ומכיל זוגיים ואי-זוגיים לסירוגין), האלגוריתם יחזיר, אם כן, את אורכו - 3. 8 7 3 1 6 10 6 4 9 5 3 לשם כתיבת האלגוריתם השתמשו בשני תורים,Q1. Q2 לכל תור מוגדרות הפעולות הבסיסיות הבאות: ) ( MakeEmpty לרוקן את התור. ) ( IsEmpty מחזירה 1 אם התור ריק, 0 אחרת. data) En Queue (TreeNode מכניסה את הנתון data לתור. הנתון data יכול להיות צומת בעץ, או מצביע לצומת בעץ, עפ"י בחירתכם. ) ( DeQueue מוציאה ומחזירה את הנתון שבראש התור. בנוסף אתם יכולים להשתמש רק בזיכרון נוסף בגודל קבוע (אין להשתמש ברקורסיה). שימו לב, האלגוריתם שלכם ישתמש ב- Q1,Q2 ובפעולות המוגדרות עליהם כבקופסאות שחורות! נתחו את יעילותו של האלגוריתם במקרה הגרוע כפונקציה של מספר הצמתים בעץ, בהנחה שכל פעולות התור יכולות להתבצע ב- (1)O זמן. - 12 -

שאלה 2: כתבו אלגוריתם שמדפיס ב- InOrder את כל הנתונים המאוכסנים בעץ בינארי T. האלגוריתם יכול להשתמש בזיכרון נוסף בגודל קבוע בלבד ) אסור לכן למשל להשתמש ברקורסיה, במחסנית או בתור). האלגוריתם ישתמש כקופסה שחורה ב - ADT של עץ בינארי המכיל את הפעולות הבאות : T. מחזירה את הקדקוד שהוא שורש העץ - Root() (n - LeftChild(Node מחזירה את הילד השמאלי של קדקוד n בעץ NULL) T אם אין ילד שמאלי). (n - RightChild(Node מחזירה את הילד הימני של קדקוד n בעץ NULL) T אם אין ילד ימני ). (n Parent(Node מחזירה את הקודקוד שהוא ההורה של n בעץ NULL) T אם n שורש העץ).. T בעץ n מחזירה את הנתונים המאוכסנים בקדקוד - Retrieve(Node (n יש לכתוב את האלגוריתם ב-.Pseudo Code נתחו את יעילותו של האלגוריתם במקרה הגרוע כפונקציה של מספר הצמתים בעץ, בהנחה שכל פעולות ה- ADT יכולות להתבצע ב- (1)O זמן. שאלה 3: הוכיחו שבעץ בינארי מלא (לאו דווקא שלם) מספר העלים גדול באחד ממספר הקדקודים מדרגה 2. שאלה 4: נתון עץ בינארי שלם שגובהו h. חשבו (בסדר גודל) את התוחלת של מספר העלים בתת עץ של צומת בעץ, כפונקציה של h. הניחו שלכל צומת בעץ יש את אותה הסתברות להיבחר. - 13 -

עצי חיפוש בינאריים: שאלה 1: נתונים שני קודקודים u ו - v בעץ בינארי T. תארו אלגוריתמים יעילים לחיפוש ההורה הקדמון הנמוך ביותר של u ו- v בעץ במקרים הבאים. ב. העץ הוא עץ רגיל וקיימת (אך ורק) הפעולה (n Parent(Node המחזירה את הקודקוד שהוא ההורה של n בעץ NULL) T אם n שורש העץ ). העץ הוא עץ חיפוש בינארי וקיימות (אך ורק) הפעולות הבאות: T. מחזירה את הקדקוד שהוא שורש העץ - Root() a. - LeftChild(Node (n. b מחזירה את הילד השמאלי של קדקוד n בעץ NULL) T אם אין ילד שמאלי). NULL) אם אין T בעץ n מחזירה את הילד הימני של קדקוד - RightChild(Node (n c. ילד ימני).. T בעץ n מחזירה את הנתונים המאוכסנים בקדקוד - Retrieve(Node n).d כמו ב' אלא שהעץ הוא עץ רגיל. מותר בסעיף זה להשתמש ברקורסיה או במחסנית. א. ג. נתחו את יעילותם במקרה הגרוע של האלגוריתמים שנתתם כפונקציה של גובה העץ. שאלה : 2 נתונים 3 עצים בינאריים, 3 T 1 T, 2 T, וידוע שכל אחד מהם מכיל את n המספרים {n,1,2. עוברים על T 1 ב-,Inorder על T 2 ב- Preorder ועל T 3 ב-.Postorder התוצאה המתקבלת בשלושת המעברים האלה היא, 1,1-n,n, כלומר המספרים מודפסים בסדר יורד. הוכיחו או הפריכו את הטענות הבאות: א. T 1 הוא בהכרח עץ חיפוש בינארי. ב. T 2 הוא בהכרח עץ חיפוש בינארי. ג. אם נעבור על T 2 ב- Postorder ועל T 3 ב- Preorder נקבל אותו פלט בשני המקרים (לאו דווקא הפלט, 1 n-1,.(n, - 14 -

עצים מאוזנים: שאלה 1: עליכם לקרוא בחומר העזר שבמקראה את הנושא AVL Trees ולענות על השאלות הבאות: 8 א. נתון עץ AVL הבא: 3 22 6 13 25 10 17 i) מוסיפים את המפתח 15 לעץ. ציירו את כל השלבים שעובר העץ ואת העץ המתקבל לבסוף. (ii מורידים את המפתח 3 מהעץ המקורי. ציירו את כל השלבים שעובר העץ ואת העץ המתקבל לבסוף. שאלה 2: א. (i) תארו אלגוריתם רקורסיבי IsSearchTree(root) הבודק אם עץ בינארי ששורשו root הוא עץ חיפוש בינארי (הניחו שהעץ ממומש על ידי מצביעים לילדים). האלגוריתם אינו מחזיר שום ערך נוסף (מלבד 0 או 1) ואינו משנה את העץ (אפילו לא זמנית). בנוסף לרקורסיה מותר להשתמש בזיכרון נוסף בגודל קבוע בלבד. (ii) נתחו את יעילותו של אלגוריתם זה במקרה הגרוע כפונקציה של מספר הצמתים בעץ n ושל גובה העץ h. הערה: שימו לב שעליכם להניח ש- n ו- h נתונים ולנתח את זמן הריצה כפונקציה של שניהם. מבין כל העצים בעלי n צמתים שגובהם h, המקרה הגרוע הוא עץ כזה שזמן הריצה של האלגוריתם עליו הוא הגבוה ביותר (איננו יכולים לומר שבמקרה הגרוע גובה העץ הוא n כי זהו רק ערך אפשרי אחד של h, ועלינו לנתח את האלגוריתם לכל h אפשרי). (iii) עתה מותר לאלגוריתם הרקורסיבי IsSearchTree לחשב ולהחזיר ערך אחד נוסף. שנו את האלגוריתם כך שיעילותו כפונקציה של מספר הצמתים בעץ תהפוך לליניארית. הראו שזו אכן יעילותו של האלגוריתם שנתתם. ב. בצעו את השלבים בi, בii, ו- בiii בדומה ל- א' אך הפעם במקום IsSearchTree תארו אלגוריתם רקורסיבי IsAVLTree(root) הבודק אם עץ בינארי ששורשו root הוא עץ AVL (הניחו כמו קודם שהעץ ממומש על ידי מצביעים לילדים). - 15 -

שאלה 3: נתון ה- ADT הבא לשמירת נקודות (y,x) במישור הממשי, התומך בפעולות הבאות: (y Insert(x, מכניס את הנקודה (y,x) למבנה ביעילות,O(log(n)) כאשר n הוא מספר הנקודות במבנה. y) Delete(x, מסיר את הנקודה y) (x, מהמבנה ביעילות O(log(n)), כאשר n הוא מספר הנקודות במבנה. a) SameFactor(double מדפיס את כל הנקודות במבנה המקיימות, x = a y ביעילות log(n)),o(k + כאשר n הוא מספר הנקודות הכולל במבנה, ו- k הוא מספר הנקודות מהמבנה המקיימות קשר זה. הציעו מבנה נתונים למימוש ה- ADT הנ"ל, ופרטו איך תתבצע כל אחת מהפעולות. הערה: ניתן להשתמש במבני הנתונים שנלמדו בכיתה כקופסאות שחורות, מבלי לממשן. - 16 -

טבלאות ערבול: שאלה 1: נתונה טבלת ערבול שבה התנגשויות נפתרות בשיטת.Open Addressing הכניסו לטבלה את המפתחות הבאים: 59 90, 17, 28, 16, 4, 31, 22, 10, (מימין לשמאל), כאשר גודל הטבלה הוא = 11 m, תוך שימוש בשיטות הבאות:. h 1 (k) = k mod m כאשר, h(k,i) = (h 1 (k) + i) mod m :Linear Probing א. ב. h(k,i) = (h 1(k) + c1i + c2i 2 ) mod m :Quadratic Probing כאשר (k) h 1 כמו בסעיף א' ו- = 1 1.c 2 = 3 c ג. h(k,i) = (h 1 (k) + ih 2 (k)) mod m :Double Hashing כאשר (k) h 1 כמו בסעיף א,' ו- (m 1)). h 2 (k) = 1+(k mod ציירו את הטבלה המתקבלת בכל אחד מהמקרים. שאלה 2: נתונה טבלת ערבול שבה התנגשויות נפתרות ע"י שרשור, תוך שימוש בשיטת החלוקה ובפונקצית הערבול.h(k) = k mod m הדגימו את הכנסת המפתחות 10,17,12,34,20,16,19,28,5 (מימין לשמאל) טבלה בגודל = 9.m ציירו את הטבלה המתקבלת. שאלה 3: נתונה טבלת ערבול בגודל n ופונקצית ערבול אחידה לטבלה סגורה. איברים המסומנים.(DELETED נניח שיש 5 איברים בטבלה (ואין א. נסמן את ההסתברות שהכנסת המפתח השישי תיקח בדיוק i ניסיונות ב-.pr(i) תנו נוסחה לתוחלת מספר הניסיונות להכנסת המפתח השישי. ב. חשבו ישירות (כלומר ללא שימוש בנוסחאות) את.pr(3) שאלה 4: א. נתונה טבלת ערבול בגודל m שבה התנגשויות נפתרות ע"י שרשור ופונקצית ערבול h. יהי U תחום המפתחות האפשריים. הוכיחו שאם U = m log n אז קיימת תת-קבוצה של log n מפתחות ב- U שכולם ימופו ע"י h לאותו תא בטבלה. ב.נניח עתה ש- h אחידה ושכל m log n המפתחות ב- U הוכנסו בעזרתה לטבלה. מה תהיה יעילות חיפוש מוצלח במקרה הטוב, במקרה הגרוע, ובמקרה הממוצע. הראו את חישוביכם (מותר להשתמש במשפטים שהוכחו בכיתה). שאלה 5: נתונות שתי רשימות משורשרות L, 1 L, 2 כאשר כל רשימה מכילה n נתונים, ונתון בנוסף מספר k. הציעו אלגוריתם שזמן הריצה הממוצע שלו טוב ככל האפשר, אשר בודק אם יש בדיוק k נתונים זהים בשתי הרשימות (k אלו לא חייבים להופיע באותו סדר). - 17 -

שאלה 6: נתון קלט של n מספרים ממשיים הלקוחים בהתפלגות שווה מהקטע (0,1). עליכם לבדוק אם יש בקלט שני מספרים x ו- y כך ש-. x 3 = y א. כתבו אלגוריתם יעיל ככל האפשר במקרה הגרוע. ב. כתבו אלגוריתם יעיל ככל האפשר במקרה הממוצע. בשני המקרים נתחו את יעילות האלגוריתם שלכם. - 18 -

ערימות : שאלה 1: נתונה ערמת מקסימום בגודל n כאשר מבנה הנתונים עבורה הוא (כרגיל) מערך ומשתנה המייצג את מספר האיברים בערמה. הניחו שאינדקסי המערך הם, n,1 במקום 1-n,,0 (שינוי זה נועד לפשט את חישוב מיקומו של הורה). תארו אלגוריתם key) PseudoInsert(KeyType המקבל מפתח key ומחזיר את המקום במערך אליו היה נכנס key בסופה של פעולת הערמה key) Insert(KeyType לו בצענו אותה. האלגוריתם PseudoInsert צריך לרוץ בזמן ((n. Ο log(log( הניחו לשם ביצוע האלגוריתם שחישוב כל חזקה של 2 לוקח (1)Θ זמן. הראו ( ) שהאלגוריתם שלכם רץ בזמן הנדרש. שאלה 2: נסתכל על האלגוריתם הבא למיון מערך A בעל n איברים מהגדול לקטן. n יכיל את כך שתת המערך A1,A1,...,A2 A n תת מערכים n A ל- נחלק את (i) A 2 יכיל את n האיברים הבאים ב- A, וכך A, תת המערך האיברים הראשונים ב- הלאה. : 1 i n,i לכל (ii).bubble sort בעזרת A i נמיין את A i אם < 4 o אחרת נמיין את Ai ברקורסיה. o,a1,...,a2 A למערך ממוין אחד בעזרת אלגוריתם n נמזג את תתי המערכים הממוינים (iii) k) = הבא: n למיזוג k מערכים ממוינים (אצלנו נכניס את האיבר הראשון מכל מערך (כלומר הקטן ביותר) לתור עדיפויות מקסימום a. בגודל k. נבצע n איטרציות כדלקמן: b. נוריד את האיבר המקסימלי בתור (בעזרת (DeleteMax ונדפיס אותו. נסמן את i. האיבר שהורדנו ב- y ונניח ש- y הגיע לתור מתת המערך A. j A j (אם נכניס לתור העדיפויות (בעזרת (Insert את האיבר שבא אחרי y ב-.ii קיים איבר נוסף ב- A). j הניחו שתור העדיפויות ממומש ע"י ערימת מקסימום, וששלב a ממומש בעזרת האלגוריתם של,Floyd הבונה ערימה בזמן ליניארי. חשבו חסם הדוק במונחי Θ לזמן הריצה של אלגוריתם המיון שתואר, לפי ההנחיות הבאות: כתבו נוסחת נסיגה לזמן הריצה ופתרו אותה על ידי עץ רקורסיה. יש לשרטט את העץ בצורה ברורה ולהראות את כל החישובים המתבצעים על העץ. - 19 -

שאלה 3: נתון עץ בינארי T שבקדקודים שלו יש מספרים שלמים. העץ ממומש על ידי מצביעים לילדים. כתבו אלגוריתם (T OrderedLayers(Tree שידפיס את תוכן הקדקודים של T, רמה אחרי רמה החל מהשורש, כאשר בכל רמה יודפסו המספרים בסדר יורד מהגדול לקטן. דוגמה: עבור העץ הבא יודפס הפלט הבא משמאל לימין,7.,9,3,10,8,5,12 4 7 9 3 8 10 5 4 12 לשם כתיבת האלגוריתם השתמשו בשני תורי קדימויות מקסימום,Q1 Q2 המכילים זוגות מהצורה (נתונים, מפתח), כאשר שדה הנתונים יכול להכיל קדקוד בעץ (או מצביע לקדקוד), ואילו המפתחות הם מספרים שלמים. סדר הקדימויות בכל תור נקבע כמובן לפי שדה המפתח. לכל תור קדימויות כזה מוגדרות הפעולות הבסיסיות הבאות: ) MakeEmpty( לרוקן את התור. ) ( IsEmpty מחזירה 1 אם התור ריק, 0 אחרת. data) Insert(KeyType key, TreeNod e מכניסה את הזוג data) (key, לתור הקדימויות. ) Max( מחזירה את הזוג data) (key, שהמפתח שלו מקסימלי מבין כל המפתחות בתור. ) DeleteMax( מורידה מהתור את הזוג data) (key, שהמפתח שלו מקסימלי מבין כל המפתחות בתור ומחזירה את הזוג כערך. בנוסף אתם יכולים להשתמש רק בזיכרון נוסף בגודל קבוע ) אין להשתמש ברקורסיה). נתחו גם את מקסימום. יעילותו של האלגוריתם במקרה הגרוע בהנחה שתורי הקדימויות ממומשים על ידי ערימת שימו לב, האלגוריתם שלכם ישתמש ב- Q1,Q2 ובפעולות המוגדרות עליהם כבקופסאות שחורות! שאלה 4: כתבו את הפונקציה key) SetKey(int index, KeyType שמשנה את ערך האיבר הנמצא בתא ה- index במערך המכיל ערימת מקסימום לערך.key הפונקציה תתקן כמובן את הערימה. מה יעילות הפונקציה? - 20 -

שאלה 5: נתונות שתי ערים A,B וביניהן יש p כבישים מקבילים (לא נחתכים), הממוספרים מ - 1 ועד p. במהלך הזמן בונים על הכבישים גשרים, כאשר על כל כביש יכול להיות מספר כלשהו (לא מוגבל) של גשרים, והגובה של כל גשר יכול להיות מספר ממשי חיובי כלשהו. דוגמה: במקרה זה יש = 3 p כבישים בין A ל - B, כאשר על כל כביש מצוירים הגשרים שנבנו עליו, וליד כל גשר רשום גובה הגשר. מספר הגשרים הכולל במקרה זה הוא 6. העירA 4 7 10 7 8 6 כביש 3 כביש 2 כביש 1 העירB עליכם לתכנן מבנה נתונים שתומך בפעולות הבאות: Init() אתחול מבנה הנתונים כך שיכיל p כבישים ללא גשרים עליהם. יעילות הפעולה צריכה להיות O(p)..i על כביש מספר h הוספת גשר שגובהו AddBridge(float h, int i) היעילות צריכה להיות (p O(log במקרה הגרוע. (h WhichRoad(float הפונקציה תחזיר מספר של כביש שבו יכולה לנסוע משאית שגובהה h (המשאית תיסע מתחת לגשרים ואסור לה כמובן להיתקל באף אחד מהגשרים שעל הכביש הזה. לכן גובה המשאית צריך להיות קטן ממש מגובה כל הגשרים שעל הכביש). אם יש כמה כבישים שבהם המשאית יכולה לעבור, יוחזר מספרו של אחד מהם. אם המשאית אינה יכולה לעבור באף כביש תחזיר הפונקציה 0. יעילות הפעולה צריכה להיות (1)Θ במקרה הגרוע. i. הפונקציה מדפיסה את הגבהים של כל הגשרים שנמצאים על כביש מספר Print(int (i יעילות הפונקציה צריכה להיות ליניארית במספר הגשרים שעל הכביש. תארו את מבנה הנתונים וכתבו אלגוריתם לכל אחת מהפעולות. הסבירו מדוע יעילות כל אחת מהפעולות היא כנדרש. - 21 -

קוד הפמן: שאלה 1: נתון קובץ שבו מספר סוגי התווים השונים הוא n (הקובץ יכול להכיל כמובן כל תו כמה פעמים). נניח שבנינו עץ הפמן לצורך קידוד הקובץ הנתון. כמה צלעות יהיו בעץ שבנינו כפונקציה של n? (שימו לב, אתם מתבקשים לתת תשובה מדויקת ולא במונחים של Θ). הוכיחו תשובתכם. שאלה 2: א. מצאו קוד הפמן עבור השכיחויות הבאות: 16:f :a.,2,2:b :c,4 :d,6 :e,10 מצאו גם את משקלו של הקוד. ב. הוכיחו או הפריכו את הטענה הבאה: נתון קוד הפמן עבור סדרה של שכיחויות ותווים. יהיו x,y שני תווים כך שאורך מילת הקוד של x קטן ממש מאורך מילת הקוד של y. אז בהכרח השכיחות של x קטנה ממש מהשכיחות של y. ג. הוכיחו או הפריכו את הטענה הבאה: נתון קוד הפמן עבור סדרה של שכיחויות ותווים. יהיו x,y שני תווים עם אותו אורך של מילת קוד. אז השכיחות של x שווה לשכיחות של y. - 22 -

קבוצות זרות: שאלה 1: נממש את טיפוס הנתונים המופשט (Union- Find) Disjoint Sets כפי שלמדנו בכיתה על ידי רשימות משורשרות כאשר כל איבר מצביע לאיבר הבא בקבוצה וכן מצביע לנציג הקבוצה, ונציג הקבוצה הוא האיבר בראש הרשימה. כמו כן הניחו שבפעולת Union מאחדים קבוצה קטנה לגדולה. כל הנתונים לקוחים מהתחום {n,,1,2. הראו דוגמה של סדרת פעולות MakeSet ו- Union אשר תיקח בסה"כ Ω(nlogn) זמן במבנה הנתונים הזה. שימו לב, הדוגמה צריכה להיות כללית ל- n כלשהו. שאלה 2: נתבונן במשחק הבא: נתון לוח משבצות A בגודל.n n מדי פעם צובעים משבצת בלוח בשחור. כתוצאה מכך נוצרות בלוח צורות שונות. אנחנו נאמר ששתי משבצות שחורות שייכות לאותה צורה בלוח אם אפשר להגיע מאחת המשבצות לשנייה על ידי סדרת משבצות שחורות הנוגעות זו בזו. נגיעה פרושה צלע משותפת; בדוגמה המשבצת (2,4) אינה נוגעת במשבצת (3,3). דוגמה: הלוח A הוא בגודל 4 4. יש בלוח שלוש צורות : (2,1),{(1,1), (2,4) (1,4),,{(1,3),.{(3,3) 1 2 3 4 1 2 3 4 הציעו מבנה נותנים שיתמוך בפעולות הבאות ביעילות טובה ככל האפשר:.O(n 2 ) אתחול המבנה כך שכל המשבצות יהיו לבנות, בזמן Init( ) y2) SameShape(x1, y1, x2, מחזירים 1 אם זוג המשבצות (x1,y1) ו- (x2,y2) שייכות לאותה צורה בלוח, ואחרת מחזירים 0. Color(x,y) צובעים בשחור את המשבצת,(x,y) כלומר המשבצת שנמצאת בשורה ה- x ובעמודה ה- y. תארו את מבנה הנתונים, וכמו-כן כתבו לכל אחת מהפעולות אלגוריתם, ונתחו את היעילות של כל פעולה במקרה הגרוע. שאלה 3: תארו מימוש של טיפוס נתונים מופשט לייצוג קבוצות זרות שאיבריהן לקוחים מתחום כלשהו (שימו לב שהמימוש שנתנו בכיתה הסתמך על כך שהנתונים הם מהתחום{ n,,1). היעילות הנדרשת לכל אחת מהפעולות (כולל (MakeSet היא (n O(log במקרה הגרוע. תארו את מבני הנתונים שבהם אתם משתמשים, כתבו במילים במדויק כיצד תתבצע כל אחת מהפעולות ונתחו את זמן הריצה שלהן. - 23 -

שאלה 4: ברצוננו לממש טיפוס נתונים חדש לייצוג קבוצות זרות שאיבריהן לקוחים מהתחום {n,...,1,2, כך שיתאפשר לבצע את הפעולות הבאות: Makeset(x) יוצרת קבוצה חדשה בעלת איבר יחיד. x האיבר x הינו נציג הקבוצה..x,y מאחדת את שתי הקבוצות שנציגיהן Union(x,y) x. מחזירה את נציג הקבוצה שאליה משתייך - Find(x) Deunion() - מבטלת את השפעתה של פעולת ה- Union האחרונה שבוצעה (לכן k קריאות לפונקציה יבטלו את k פעולות ה - Union האחרונות, בהנחה שבוצעו כמובן לפחות k פעולות Union קודם. אם לא בוצעו פעולות Union קודם לכן, אז הפונקציה Deunion לא תעשה דבר). תארו את מבני הנתונים שבהם אתם משתמשים, כתבו במילים במדויק כיצד תתבצע כל אחת מהפעולות ונתחו את זמן הריצה שלהן. - 24 -