פ ב ר ו א ר, בעיית בניין וכדור זכוכית. יש לנו בניין של N קומות ו- 2 כדורי זכוכית.צריך למצוא את הקומה הכי נמוכה שאם נזרק את הכדור הוא ישבר. חיפ

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

מבוא למדעי המחשב - חובלים

מבוא למדעי המחשב - חובלים

שיעור 1

Microsoft Word - tutorial Dynamic Programming _Jun_-05.doc

Tutorial 11

מבוא לתכנות ב- JAVA תרגול 7

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

תכנות דינמי פרק 6, סעיפים 1-6, ב- Kleinberg/Tardos סכום חלקי מרחק עריכה הרעיון: במקום להרחיב פתרון חלקי יחיד בכל צעד, נרחיב כמה פתרונות אפשריים וניקח

Microsoft Word - SDAROT 806 PITRONOT.doc

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

תאריך פרסום: תאריך הגשה: מבנה נתונים תרגיל 5 )תיאורטי( מרצה ומתרגל אחראים: צחי רוזן, דינה סבטליצקי נהלי הגשת עבודה: -את העבודה יש לה

הגשה תוך שבוע בשעת התרגול

תרגול 1

Microsoft Word - c_SimA_MoedA2006.doc

תכנון אלגוריתמים, אביב 1021, תרגול מס' 4 תכנון דינאמי תכנון דינאמי בתרגול זה נדון בבעיית הכפלת סדרת מטריצות (16.1.(CLR ראשית נראה דוגמא: דוגמא: תהינה

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

PRESENTATION NAME

Microsoft Word B

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

הטכניון מכון טכנולוגי לישראל אלגוריתמים 1 )443432( סמסטר חורף הפקולטה למדעי המחשב תרגול 9 מסלולים קלים ביותר תרגיל APSP - 1 עד כה דנו באלגור

Microsoft Word - c_SimA_MoedB2005.doc

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

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

שאלהIgal : מערכים דו מימדיים רקורסיה:

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Slide 1

שאלהIgal : מערכים דו מימדיים רקורסיה:

תוכן העניינים

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

הגשה תוך שבוע בשעת התרגול

תרגיל בית מספר 1#

ע 003 מרץ 10 מועד מיוחד פתרונות עפר

מועד: א בחינה סופית במתמטיקה דיסקרטית משך הבחינה: 2 1 שעות מרצה: פרופ' תאופיק מנסור תאריך: סמסטר: א תשע"ח m 2 הוראות לנבחן: )1( הבחינה מו

תרגול 1

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

תוכן העניינים

מבוא לתכנות ב- JAVA תרגול 11

Programming

שעור 6

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

תרגיל 9 מבוא ללוגיקה ותורת הקבוצות, סתיו תשע"ד 1. תהי L השפה בעלת סימן פונקצייה דו מקומי G, סימן פונקציה חד מקומי T, סימן יחס תלת מקומי.c, d וקבועים L

234114

מהוא לתכנות ב- JAVA מעבדה 3

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

מבוא למדעי המחשב

Algorithms Tirgul 1

דף נגזרות ואינטגרלים לשאלון 608 כללים למציאת נגזרת של פונקציה: n 1. y' n x n, y הנגזרת x.1 נכפול בחזקה )נרשום אותה משמאל ל- (. x א. נחסר אחד מהחזקה. ב

מקביליות

PowerPoint Presentation

עב 001 ינואר 12 מועד חורף פתרונות עפר

תרגול מס' 7 – חזרה על MST ואלגוריתם Dijkstra

. שאלה 1: ה אי x] T : R 4[ x] R 4[ אופרטור ליניארי מוגדר על-ידי T( ax bx cx d) bx ax cx c )13 נק'( א( מצאו את הערכים העצמיים, המרחבים העצמיים

Microsoft Word - אלגברה מעורב 2.doc

PowerPoint Presentation

Disclaimer מסמך זה הינו סיכום און-ליין של השיעור ולא עבר עריכה כלל. מצאת טעות? שלח/י לי מייל ואתקן: 07/05/2009 קורס: מערכות ה

תכנות מונחה עצמים א' – תש"ע

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

תכנון אלגוריתמים עבודת בית 4: תכנון אלגוריתמים תאריך הגשה: 02: , בצהריים,תא מספר 66 בקומת כניסה של בניין 003 מתרגל אחראי: אורי 0

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

שאלהIgal : מערכים דו מימדיים רקורסיה:

Slide 1

Slide 1

סדנת תכנות ב C/C++

<4D F736F F D20F4F2E5ECE5FA20EEE5EEF6E0E5FA20312E646F63>

Slide 1

מבוא למדעי המחשב

מבוא למדעי המחשב

PowerPoint Presentation

מקביליות

Microsoft Word - ExamA_Final_Solution.docx

Homework Dry 3

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

מטלת מנחה (ממ"ן) 11 הקורס: חשבון אינפיניטסימלי II חומר הלימוד למטלה: יחידות 2,1 4 מספר השאלות: 7 משקל המטלה: נקודות סמסטר: ב 2007 מו

תוכן העניינים: פרק צמצומים ומימושים של פונקציות בוליאניות... 2 צמצומים של פונקציות באמצעות מפת קרנו:...2 שאלות:... 2 תשובות סופיות:... 4 צמצום

Slide 1

תרגול מס' 7: תרגילים מתקדמים ברקורסיה

מקביליות

Untitled

ע 001 ינואר 10 מועד חורף פתרונות עפר

תרגיל בית מספר 1#

Slide 1

Microsoft Word - vaidya.doc

Microsoft Word - solutions.doc

אי שוויונים ממעלה ראשונה לארבע יחידות

ex1-bash

Microsoft Word - hedva 806-pitronot-2011.doc

Slide 1

שם כיף עם ג'ף מאגר פעילויות חלק א' חוברת של פעילויות מתמטיות: העשרה, העמקה, משחקים ואתגרים כיתה

Slide 1

חשבונאות ניהולית שיעור תמחיר ABC תמחיר זה אומר כי בגלל שלאורך השנים יותר משמעותיות מאשר בעבר צריך למדוד אותן בצורה טובה יותר לוקחים את העלוי

Microsoft Word - 01 difernziali razionalit

פייתון

ðñôç 005 î

מבנים בדידים וקומבינטוריקה סמסטר אביב תשע"ט מספרי רמזי תרגול 11 הגדרה: (t R = R(s, הוא המספר הטבעי הקטן ביותר כך שבכל צביעה של צלעות הגרף וכחול(, קיים

rizufim answers

Microsoft Word - Questions Booklet Spring 2009

מבוא למדעי המחשב

אוניברסיטת תל אביב - בית הספר למדעי המחשב מבוא מורחב למדעי המחשב, אביב 2019 תרגיל בית מספר - 2 להגשה עד 02/04/2019 בשעה 23:55 קיראו בעיון את הנחיות הע

תמליל:

בעיית בניין וכדור זכוכית. יש לנו בניין של N קומות ו- כדורי זכוכית.צריך למצוא את הקומה הכי נמוכה שאם נזרק את הכדור הוא ישבר. חיפוש שלם)כאשר יש כדור ( - אופציה הכי פשוטה לעבור על כל הקומות אינדוקטיבית)לולאת )for אם נשבר מצאנו אם לא נעבור,אם לא. לקומה הבאה.בסיבוכיות - כאשר יש יותר מכדור אחד אפשר לחלק את הבניין לחצי אם הכדור נשבר נעבור עם הכדור השני בחיפוש שלם מ-.,סה"כ פעולות נשבר נזרוק מקומה ה- כך אפשר לחלק את הבניין ל-,ועם הכדור השני נעבור בחיפוש שלם מ- חלקים וכך הלאה...אך זה לא נכון להגיד שנחלק ל- חלקים את הבניין כי בעצם נחזור mi b b b b x x mi x x x x x x x, לסיבוכיות של. לכן השאלה היא לכמה חלקים לחלק את הבניין כך שיהיה לנו מס' פעולות מינמ'?. f x תשובה: כל פעם עושים x x כלומר נחלק את הבניין ל - חלקים.. ומס' פעולות יש להתייחס למצב כאשר יש כדורים אז אפשר. log להשתמש בחיפוש בינארי, בסיבוכיות אך מצב זה לא אפשרי בחיים האמיתיים. it Drop Bll(it X ){// X brek flse kom i while(kom <+){ if(brek = true ) retur (kom - ) + BS(kom -, kom) kom (kom + ) - i i++ BS(strt,ed){ brek flse for i strt to ed if(brek(i) = true) retur i נערך ע"י רעי סיון -

אלגוריתם של משחק המספרים. אסטרטגיה ראשונה היא לחשב את הסכום של האיברים הזוגיים ואי זוגיים ואת הסכום הכי גבוהה מאינדקס שלו להתחיל,השחקן הראשון מכריח את היריב לקחת כל פעם את הכי נמוך,זה אלגוריתם של מקס' לא להפסיד. האלגוריתם השני מבטיח לסיים בתוצאה טובה יותר,יש ליצור עץ אבל רק ליצור אותו זה מטריצה.קודם נמלא באלכסון את המערך הנתון ואח"כ נמלא עפ"י התנאי:,לכן נתכנת דינמי ע"י כך שנמלא F[i,j-] F[i,i] = mx F[i+,j], -ואז הרווח נמצא בפינה הימנית העליונה. נתבונן ב- קודקודים ראשונים של עץ החישובים של חיפוש שלם של המשחק.כדי למצוא פתרון אנו נחשוב בצורה רקורסיבית ונניח.,,,אנחנו מניחים שיש לנו רווח בקודקודים, i שיש פתרון.כדי לדעת רווח של שחקן בקודקוד את המימוש של האלגוריתם נעשה בצורה אינדוקטיבית. אתחול מטריצה)אתחול אינדוקציה(,וב- for i (-) to for j (i+) to F[i,j] = mx F[i+,j], F[i,j-] i j for i to F[i,i] = i j - שחקן שחקן כדי לקבל/למצוא את המסלול נשאל את השאלה הבאה: while(i<j) if([i]-f[i+,j]>[j]-f[i,j-]) syso("my choose is:"+[i]) i++ syso("my choose is:"+[j]) j--. מי שנכון לוקחים.בסיבוכיות אז סה"כ הסיבוכיות דוגמא:, mx,,, F F F בעיית תת הריבוע הגדול ביותר של אחדות. כקלט אנו מקבלים מטריצה וכפלט מחזירים גודל של תת הריבוע הגדול ביותר,ומיקום קודקוד ימני עליון,נפתור בעיה זו ע"י תכנות דינאמי ב- בעל מקדם. נעתיק את השורה והעמודה הראשונה של המטריצה המקורית ואת כל האפסים שלה ונמלא את המטריצה ע"י החוקיות הבאה: M S. f i j submtrixof(it [][] M){ העתקת הדפנות// for i to S[,i] = M[,i] S[i,] = M[i,] מילוי המטריצה // for i to for j to if(m[i,j] ) S[i][j] = mi(s[i-][j],s[i-][j-],s[i][j-])+ if(s[i,j]>mx) mx = S[i][j] imx = i,jmx = j syso("+mx+",["+imx+","+jmx+"]", נערך ע"י רעי סיון -. f = mi x, y, z כמובן יש קודם לבדוק האם

m,כיוון שאנו שהיא בסדר למסלול קצר. בעיית המטוס המסלול הקצר ביותר. ישנן שתי שיטות לפתרון: ע"י חיפוש שלם אך בסיבוכיות של במקרה זה נבצע חישוב ביניים ונראה מה המסלול העדיף בכול תנועה.סיבוכיות המילוי של המטריצה היא - כל פעם מתקדמים במסלול אחד,אך עוברים על כל הנקודות של המטריצה. m,כי בכול מסלול חזרה שנבחר אנו נעבור ב-,m צלעות. סיבוכיות החזרה היא - נפתור זאת ע"י מטריצה שכל איבר בה הוא מסוג Node,המכיל שדות.etry,x,y נמלא את השורה התחתונה והעמודה השמאלית. נמלא את שאר הטבלה ע"י התנאי הנ"ל,התשובה תהיה מס' המסלולים האופטימאליים בפינה הימנית העליונה. על מנת למצוא את המסלול,נחזור מהפינה הימנית העליונה ע"י נכונות התנאי.)עפ"י התוצאה הנמוכה ביותר(. clss Node { it _x,_y,_etry public Node(it x,it y) _x = x _y = y _etry= priceofcheepestpths(){// = mtrix.legth mtrix[,]._etry = for i to // mx m, M[,i]._etry M[,i-]._etry + M[,i-]._x; M[i,]._etry M[i-,]._etry + M[i-,]._y מילוי המטריצה// for i to // for j to m // m M[i-,j]._etry + M[i-,j]._x b M[i,j-]._etry + M[i,j-]. y M[i,j]._etry Mth.mi(, b) retur mtrix[-,-]._etry מחזיר את המסלול הקצר ביותר // pritpth() Strig Strig S "("++","++")" i - j - while(i> && j>){ = mtrix[i][j-]._etiry; b = mtrix[i-][j]._etiry; if(>b) S = S+"-->["+(i-)+","+j+"]"; i--; S = S+"-->["+i+","+(j-)+"]"; j--; retur S+"-->[,]";.. אם מבקשים את מס' המסלולים המינמ' או המקס' בעצם נוסיף ל - Node עוד משתנה it dis דיפולטיבי)שווה ל (, ותנאי חזרה לפי בקשת השאלה מינמ' או מקס'. שהוא בעצם אורך המסלול שהוא if( = b) mtrix[i][j].dis mtrix[i-][j].dis + mtrix[i][j-].dis if( < b) mtrix[i][j].dis mtrix[i-][j].dis mtrix[i][j].dis mtrix[i][j-].dis. m m m סה"כ הסיבוכיות היא - נערך ע"י רעי סיון -

mi Mth.mi(rr[],rr[]) mix Mth.mx(rr[],rr[]) for i to rr.legth-//i=+ if(rr[i]>rr[i+]) if(rr[i]>mx) mx rr[i] if(rr[i+]<mi) mi rr[i+] if(rr[i+]>mx) mix rr[i+] if(rr[i]<mi) mi rr[i] retur {mi,mx בעיית.MiMx נשווה את שני האברים הראשוניים ונחלק אותם ל.mi,mx i i mx mx i. i mi mi i i, השוואות נחלק את המערך לזוגות וכל פעם נבדוק זוג - זוג ואם גדול מהמקס' נחליף למקס' וכך גם ההפך למינמ' - במקרה שהמערך ממוין אז זה לכן לא חשוב מה הסיבוכיות היא -,במקרה שלא זה השוואות. - בעיית.MxMx קיימים פתרונות אינדוקטיבי והשוואות.. אינדוקטיבי נקבל מערך ונהפוך אותו לרשימה מקושרת שבה נבדוק בין צמודים,כל איבר בה יהיה מסוג Node המורכב מ- שדות: it,כל um,ext אובייקט מחזיק מס' שהוא המקס' שלו וגם מחסנית שבה יש אברים פוטנציאלים להיות מקס'. נחלק לזוגות ונבדוק מי יותר גדול,את הקטן מבניהם נכניס למחסנית של הגדול ונמחק אותו מהרשימה ובסופו של דבר יהיה לנו איבר ברשימה שהוא.Mx נעשה חיפוש שלם על המחסנית שלו) Mx ( ונמצא את. Mx Iductio List list; for i to rr.legth list.dd(rr[i]) while(list.size()>) if(list.get[i]>list.get[i+]) list[i].s.push[i+].um remove list[i+] list[i+].s.push[i].um remove list[i] i++ if(i==list.size() i==list.size()-) i = ; Mx list[].um syso("mx is"+mx) Mx list[].s.pop while(!list[].s.isempty){ if(list[].s.pop>mx) Mx list[].s.pop syso("mx is:"+mx) סיבוכיות הכנסת אברי המערך לרשימה היא.. log השוואת האברים היא -. log Recursio לכן it mxmx(it low, it high){ if (low < high) idex middle (low + high)/ i mxmx(low, middle) j mxmx(middle+, high) if(rr[i].um>rr[j].um) rr[i].st.push(rr[j].um) idex i rr[j].st.push(rr[i].um) idex j retur idex retur low רקורסיבי גם כאן הופכים את המערך לרשימה מקושרת ולכל איבר בה מסוג Node שיש לו מחסנית ההבדל הוא רק בצורת החילוק.. נערך ע"י רעי סיון -

if(rr[]>rr[]) mx rr[] mx rr[] mx rr[],mx rr[] for i to rr.legth //i=+ if(rr[i]>rr[i-]) if(rr[i]>mx) if(rr[i-]>mx) mx rr[i] mx rr[i-] mx mx mx rr[i] //rr[i]<mx if(rr[i]>mx) mx rr[i] //rr[i]<rr[i-] if(rr[i]>mx) if(rr[i-]>mx) mx rr[i-] mx rr[i] mx mx mx rr[i-] //rr[i-]<mx if(rr[i-]>mx) mx rr[i-] retur mx,mx,ישנן דרכים רקורסיבי ואינדוקטיבי. נעביר את הדוגמא של mi/mx לשלנו ניקח שני אברים. i i i,,ונבדוק את היחס בניהם i ראשוניים mx i.. X x x x... x, השוואות שזו סיבוכיות של X X or X X... for exmple: 8 X X X /** * O(log) * Recursio */ double powerrecursio(double x, it ){ double result ; if( == ){// exit of recursio retur ; if(% == ){// is eve retur powerrecursio(x*x, /); {// is odd retur x*powerrecursio(x*x, ( - )/); mx i. ונבצע השוואות לזוג מספרים. ולכן יש לנו כאן חישוב חזקה. השיטה הפרימיטיבית היא ב - העיקרון לשיטה החכמה הוא: /** * O(log) * Iductive */ double poweriductive(double x, it ){ double result ; while(!=) if(% == ) result result*x; x x*x; /; retur result; נערך ע"י רעי סיון -

. it mx(it rr[],it k){ mx rr[] for i to k if(rr[i]>mx) mx rr[i] retur mx; it HELF(it []rr){ Arrys.sort(rr); HF rr[rr.legth/] retur HF; בעיית החציון. כאשר נבדוק את המערך ה- ההסתברות שהחציון הוא המס' ה mx היא 99.999%. במקרה שלנו בחרנו במספר =K. ישנו מצב מעניין שההסתברות לטעות במידה והמערך רנדומאלי היא / k הסתברות להצלחה =k / = / (/*/) = / k / יותר קטן מטווח הטעות של המחשב.. k הסיבוכיות - if(==)retur s for i to s s*i retur s. חישוב עצרת באינדוקציה. ברקורסיבי חישוב עצרת עולה לנו חישוב מספרי פיבונצ'י.,לכן עדיף להשתמש האינדוקציה שהסיבוכיות של היא /** * Recursive * O[log()] */ public sttic it FibFibRecursio(it ){ it[][]m {{,,{,; it[][]s FibRecursio(m,); retur s[][]; public sttic it[][] FibRecursio(it M [][], it ){ it [][] result {{,,{,; if ( == ){// exit of recursio retur result; if (% == ){// is eve retur FibRecursio(M X M, /); {// is odd retur M X FibRecursio(M X M,(-)/); בעצם כדי להגיע לסיבוכיות זו אנו לוקחים A,וכשנכפיל אותה מטריצה F F ב- פעמים נקבל,שזוהי F F בעצם נוסחת פיבונצ'י. נוכיח באינדוקציה הנחת האינדוקציה : F F F F F F F F נערך ע"י רעי סיון -

/** * Iductive * O[log()] */ public sttic it Fib(it ){ it[][]m = {{,,{,; it [][]result = ew it[][]; result[][] = ; result[][] = ; result[][] = ; result[][] = ; while (!=) if(%!= ) result = result X M M = M X M = /; שלב האינדוקציה: F F F F F F F F F F F F F F. log מ.ש.ל. סיבוכיות - retur result[][]; בעיית החניון. נתון לנו מערך מעגלי של מכוניות איך נספור את כמות המכוניות במערך? נתחיל לספור )נשמור את האינדקס שממנו התחלנו(,עד שהגענו לאותו ערך)נשמור את מס' הצעדים(. נשנה את אותו ערך לסימון שמוכר לנו.ואז נחזור חזרה כמס' הצעדים שלנו. אם הגענו לערך שממנו התחלנו נחזור חזרה מאיפה שהפסקנו ונמשיך לספור,אם הגענו לסימון שלנו מכאן שעשינו הקפה שלמה. void robot(it strt,it rr[]){ cout Mrk - for i strt+ to rr.legth if(rr[i]==rr[strt]) rr[strt] Mrk; if(rr[i]==rr[i-(cout%rr.legth)]) brek cout++; if(i>rr.legth-) strt Mrk System.out.pritl(cout) PritArry(rr,cout). הסיבוכיות - נערך ע"י רעי סיון - 7

LCS המחרוזת המשותפת הארוכה ביותר. בעצם אנחנו מחפשים את מידת ההתאמה בין מחרוזות.ישנן שיטות חיפוש שלם,אלגוריתם חמדני,ותכנות דינאמי.. חיפוש שלם כאן נסרוק את כל תתי המחרוזות בראשונה ובשנייה ומשווה כל פעם שיש התאמה.אבל יש מחרוזות בעלות אברים ולהן יש תתי קבוצות,)כי לאות אחת יש תתי קבוצות האות עצמה וקבוצה ריקה ולכן כל אות שנוסיף תיצור פי תתי m, m mi,אלגוריתם זה טוב למחרוזות באורך,לא יותר. קבוצות(,ולכן נגיע לסיבוכיות של - אלגוריתם חמדני כאן נעבור על המחרוזות הקצרה ביותר וניצור מערך שבו כל אינדקס מסמל אות מה ABC ובכול תא כזה יופיע m m,במקרה הגרוע ביותר. מס' הפעמים שאותה אות מופיעה במחרוזות.סיבוכיות של -. Strig greedy(strig X, Strig Y){ Strig res ""; it id, idex, beg ; while (id < X.legth()){ idex fidelemet(beg,y,x.chrat(id)); if(idex!= -){ res res + X.chrAt(id); beg idex+; id id + ; retur res; b c d דוגמא להרצת האלגוריתם: X b c b d b 7 help x help x help x help x help x help x help x help x help x help x help x help x help x7 help x אם בממוצע החמדני לא יקטין את היעילות לכן נבחר שיטה אחרת. תכנות דינאמי נבנה מטריצה נמלא את השורה והעמודה הראשונה באפסים ונבצע השוואות בין האותיות עפ"י התנאים הבאים:.,,, mx,,, F i j F i j b. F i j F i j F i j b בניית המטריצה: // build mtrix of umbers it[][] buildmtrix(chr[]x,chr[]y){// X, Y m +,m+ כי מוסיפים שורות אפסים // row + col m + M[][] ew it[row][col] מילוי שורה ראשונה באפסים // for i to row M[i][]= מילוי עמודה ראשונה באפסים // for j to col M[][j]= מילוי המטריצה עפ " י החוקיות // for i to row // for j to col // m if(x[i-]==y[j-]) M[i][j] M[i-][j-] + אם. m. הסיבוכיות היא - M[i][j] Mth.mx(M[i-][j],M[i][j-] retur M נערך ע"י רעי סיון - 8

מחזיר את המחרוזת המשותפת הארוכה ביותר: returs mx commo sequece legth it mxseqlegth(chr[]x,chr[]y){// X, Y m M[][] buildmtrix(x,y) retur M[][m] returs mx commo sequece chr[]mxsequece(chr[]x,chr[]y) M[][] buildmtrix(x, Y); seqlegth M[-][m-] result[] ew chr[seqlegth] i - j m- cout seqlegth- while(i>&&j>) if(x[i-]==y[j-]) result[cout--] X[i-] i-- j-- if(m[i][j]== M[i-][j]) i-- j-- retur result X F X b c b d 7 b i i+ Y F " "," b" דוגמא למימוש האלגוריתם: Y b j j+ b d c b b, b, mx seq le = b, d,, b whe x(i)=y(j) F()+= whe x(i)!=y(j) mx(,)= Vector<Strig> combitios(strig s, it k) { Vector<Strig> vec = ew Vector<Strig>() combitios(s, "", k, vec) retur vec void combitios(strig s,strig prefix,it k,vector<strig>vec) if (s.legth()<k) retur; if(k == )vec.dd(prefix) combitios(s.substrig(),prefix + s.chrat(),k-,vec) combitios(s.substrig(),prefix,k,vec) אלגוריתם רקורסיבי למציאת כל תתי קבוצות בגודל K. נערך ע"י רעי סיון - 9

d - LIS חיפוש של תת המערך הממוין הארוך ביותר. נפתור זאת ע"י תכנות דינאמי. legth. M.,ומערך נבנה מטריצה בגודל legth שהוא האלכסון של המטריצה. נעתיק את האיבר הראשון מהמערך למטריצה ול - d,עוברים על כל איבר ב - שיפור מכניסים אותו לאלכסון ומשמאלו מעתיקים את השורה שמתחתיו. דוגמא לרצת האלגוריתם:,ומחפשים מה אפשר לשפר באלכסון d,אחרי שמוצאים = {,,,,,,,,7,8 it[] LIS(it [] A){// A //copy M[][] ew it[][] d[] ew it[] M[][] A[] d[] A[] ed for i to // מחזיר את האינדקס של האיבר מהמערך למערך - d //. מחזיר LIS בסיבוכיות idex biryserchbetwee(d,ed,a(i))// log M[idex][idex] rr[i] for j to idex// M[idex][j] M[idex-][j] d[idex] A(i); if(idex>ed) ed++ it s[] ew it[ed+]; for j to ed s[j] M[ed][j] retur s נערך ע"י רעי סיון -

אם נרצה רק את הגודל נעשה חיפוש על המערך אבל המערך ממוין לכן נעשה חיפוש בינארי שזה. log log פונקצית עזר בבעיית.LIS מחזיר את האורך של LIS בסיבוכיות it LISLegth(it[]rr){ size rr.legth d[] ew it[size] d[] rr[] ed for i to size// idex biryserchbetwee(d, ed, rr[i])// log if(idex<=ed) d[idex] rr[i]; { ed++; d[ed] rr[i]; retur ed+; /*ממוין מערך בתוך המספר מיקום של בינארי חיפוש **/ it biryserchbetwee(it []rr, it ed, it vlue){ it low =, high = ed; if (vlue<rr[]) retur ; if (vlue>rr[ed]) retur ed+; while (low <=high){ it middle = (low + high)/; if (low == high) { if (rr[low] == vlue) retur low; retur low; { if (rr[middle] == vlue){//vlue ws foud retur middle; // vlue suppose to be left if (vlue < rr[middle]){ high = middle; // vlue suppose to be right { low = middle+; retur -; נערך ע"י רעי סיון -

.Y, LIS C. LCS A B בעיית LCS בעזרת.LIS המטרה קיימות מחרוזות ואנו צריכים לייצור איזו סדרה C במטרה לשפר את הסיבוכיות, האלגוריתם מחולק לכמה חלקים: ראשית ניצור מערך עזר שהוא מערך של מחסניות)לפי,b,c סה"כ אברים(, שמייצג אינדקסים של כל אות במערך )כל אות ב.),b,c שנית ניצור מערך A.עוברים על כל אות במערך X ל.A אנו מפעילים LIS על מערך A. ומוציאים את כל האינדקסים שהאות שלהם מופיעה במערך עזר ומוסיפים אותם For i to Z Y i push i Z: b c d e f A :,,,,,,,,.... X :, b,, c, u, X m Y : b,,, b, c,, Y..... הסבר של הקוד: עוברים על כל איבר במערך Y,ומכניסים את האינדקסים של האות למחסנית המתאימה במערך עזר Z. u... z A[] r For i to m rlog r ANS if! Z X i. empty( ) A A Z X i LISLegth A עוברים על כל איבר במערך X ניגשים למקום הנכון במערך מחסניות Z ומוסיפים את כל האברים של אותה מחסנית למערך A. מפעילים LIS על Aומקבלים תוצאה)המספרים שיוצאים הם האינדקסים שיוצרים LCS ביו המחרוזות(. m r r r r r. mi, log log הסיבוכיות היא - נערך ע"י רעי סיון -

מערך עזר() buildhelpz -- בניית // O(Y.legth) it idex for i to //i-- idex Y[i]-'' Z[idex].st.push(i) buildclustera //() O( A *log A ) מערך אשכולות -- בניית it idex, cout for i to m idex X[i]-'' if (!Z[idex].st.empty()) for j to Z[idex].st.size() A[cout] Z[idex].st.get(j) System.out.prit(A[cout]+",") cout++ It LogestCommSeq(A){ המחרוזת המשותפת הארוכה ביותר --חישוב rlog r buildhelpy(); buildclusterarr(); S LIS(A) retur S. legth r שברים עשרוניים אינסופיים מחזוריים. נכתוב פונקציה שמקבלת שבר פשוט כשני מספרים שלמים, כך שהראשון m הוא מונה והשני הוא מכנה. הפונקציה מחזירה מחרוזת של שבר עשרוני עם =N ספרות אחרי נקודה עשרונית. הנחה: המונה קטן ממכנה. Strig Frctio(Strig s,it m,it ){. הסיבוכיות - idex s "" moe m* N shrit m s "." for i to N if(moe>=) shrit moe% s s+shrit idex++ moe moe/ s s+moe moe shrit moe moe* retur s shrit moe % s s+shrit idex++ moe shrit moe moe* s s+"" נערך ע"י רעי סיון -

A,,...,,ועפ"י חוקיות נתונה בעיית בדיקת מיון המערך ע"י חוקיות מסוימת. נתונה לי סדרה מסוימת ממוינת יש לבנות סדרה חדשה ולבדוק האם היא ממוינת. Check(A){ סיבוכיות -. B A[] temp B s true; for i to B B + if(temp<b) temp B s flse brek ed for retur s fuctio it smllest/bigest(it[]x){// x it strt x[] it fiish it middle הסבר: - temp תמיד משתנה שבעל ערך קודם ל B. B משתנה שמקבל כל פעם את האיבר הבא בחישוב. As משתנה המראה אם הסדרה ממויינת. אנחנו סוכמים כל פעם את המשתנה B ובודקים אם הוא יותר גדול מ temp.. boole flg flse while(flg==flse) if(x[midle-]>x[midle]<x[midle+]) flg true s x[midle] for mi s x[midle-] for mx if(x[midle]<x[]) fiish midle- if(x[midle]>x[]) strt midle+ midle (strt+fiish)/ ed while retur s ed fuctio log הוצאת mi/mx הסיבוכיות ממערך מעגלי ב סיבוכיות של באה כי אנו log משתמשים באלגוריתם חיפוש בינארי. הרעיון של השימוש הוא כי הסדרה ממוינת מעגלית שזה אומר של איבר שבא אחרי X i הוא יותר גדול וההפך. העוגן שלנו הוא תמיד לכיוון של מהקטן ביותר לגדול ביותר או להפך. נערך ע"י רעי סיון -

בעיית המטבעות. בעיה זו דומה מאוד לבעיית המטוס,אנו נבנה מטריצה ונמלא רק חצי,כל צעד יכול להיות למעלה או שמאלה)לא ימינה(. ולאחר שנמלא אותה נחזיר את המסלול המקס' במקום המינמ'. עבור = נבנה מטריצה X ונמלא רק חצי שלכל איבר בה יש את סכום המטבע ואת ה etry של הסכום שצבר עד כה. for i to,כי ממלאים את ה etry בכול הסיבוכיות היא - for j to [i-][j].etry + [i-][j] איבר במטריצה. b [i-][j-].etry + [i][j] if(>b) the [i][j] = [i][j] = b retur [i][j].etry בשביל לקבל את במסלול הולכים לקודקוד העליון ובודקים עפ"י התנאי הבא: p p + "["++","++"]" i j if(([i][j].etry - [i][j])== [i][j-]) p p + "->["+(i)+","+(j-)+"[" j-- p p + "->["+(i-)+","+(j-)+"]" j--,i-- syso("the mx pth:"+p) 7 8 נערך ע"י רעי סיון -

פ ב ר ו א ר, משחק המספרים במערך מעגלי. בעצם לשחק הראשון יש אפשר לבחור בין כל אחד מהמספרים מהמערך ולכן לכל מס' שייקח השחקן הראשון יש מערך משחק שונה, לכן שי מערכי משחקים. לכן נכניס את כל ה מערכי משחקים למטריצה: GeerteSubGmes(A) Mtrix[][]SubGmeArry כל שורה במטריצה מציינת מערך של משחק. ולכל מערך משחק כזה יש מטריצת משחק משלו,לכן יש מטריצות בגודל [-][-],נכניס למערך תלת מימדי. Arry[][][]GmeMtrix ew Arry[][-][-] יש מערכי משחקים שלכל משחק יש מטריצת המשחק בגודל.[-][-] profit secod plyer: profit first plyer: - לאחר מכן נבנה את מטריצות המשחק לכל תתי המשחקים,ונבנה מערך של רווחים ונכניס אליו את כל הרווחים מכל המשחקים. הרווחים הם של השחקן השני. for i to GmeMtrix [i][][] BuildMtrix(SubGmeArry[i][]) profitarry[i] GmeMtrix[i][][-] ed for אבל אנחנו רוצים את הרווח של השחקן הראשון לכן נמצא את הרווחים של השחקן הראשון. for i to profitarry[i] A[i] profitarry[i] ed for לאחר מכן נמצא ממערך הרווחים של השחקן הראשון את הרווח המקס'. idex GetMx(profitArry) Prit(A[Idex]) // prit plyer choose pritgmestrtegy(gmemtrix[idex][][]) נערך ע"י רעי סיון -

Numbers Gme i Circle Arry : ונדפיס את הדרך האופטימאלית לניצחון של השחקן הראשון. Fuctio CircleNumbersGme(it[]A) it A.legth // crete rrys of ll subgmes Mtrix [][] SubGmeArry GeerteSubGmes (A) //crete D rry. Mes rry of gme mtrices. Arry [][][] GmeMtrix ew Arry [][-][-] Arry [] ProfitArry ew Arry[] fill the gme mtrices. For mx differece i profit d stck ll profits i profitarry for i to GmeMtrix [i][][] BuildMtrix(SubGmeArry[i][]) profitarry[i] GmeMtrix[i][][-] ed for // evlute totl profit for ll subgmes for i to i profitarry[i] ed for //fid the mx profit idex. It would be our strtegy. idex GetMx(profitArry) Prit(A[Idex]) // prit plyer choose pritgmestrtegy(gmemtrix[idex][][])prit the whole gme strtegy fter first move ed fuctio profitarry[i] בניית המטריצה מתבצעת עפ " י הכללים שלמדנו // Fuctio BuildMtrix(Arry[]A) Mtrix [][] M ew Mtrix[][] for i to A.legth M [i][i] for i (-) to for j (i+) to retur M Ed BuildMtrix i M[i][j] Mx( -M[i+][j], Fuctio pritgmestrtegy( Mtrix M [][] ) i, j M[].legth for k to X [i]-f[i+,j] Y [i]-f[i,j-] if(x>y) prit A[i] i i+ prit A[j] j j- ed for Ed pritgmestrtegy i j M[i][j-] ) נערך ע"י רעי סיון - 7