מבני נתונים - תרגול 3 מבני נתונים לינאריים

Like dokumenter
Hashing - לוברע :השורד תויכוביס : יללכה היעבה תרדגה

פתרונות לתרגיל 4. נתון עץ B עם פרמטר t א. מקסימלי של מפתחות שיכולים להיות בעץ )מהו n מקסימלי( כפונקציה של h ו- t. הראו את החישובים ונמקו.

ערימות מינימום - Minimum Heaps הגדרה: שימושים: מימושים: מבנה נתונים שמוגדרות עליו הפעולות הבאות: MakeHeap. בניית ערימה מתוך Insert(x) איברי קלט.

Nir Adar עמוד 1

מבני נתונים - תרגול 8 עצים

השאלות האיברים. אחרת נמיין את A i ברקורסיה.

תאור האלגוריתם הנחה שם Θ(c)

>0. < lim =0 +4 =0, + =0

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

תרגיל מספר 10 מבנים אלגבריים

תוכנה 1 אביב תשע"ה תרגיל מספר 8

הנושא: "דטרמיננטים " דטרמיננט מסויימים. האנכית. לדוגמה : המינור ה- לדוגמא: עבור הדטרמיננט הנתון: או ( ). ( ) לדוגמא: C = = =

ח'/אדר/תשע"ב אלגוריתמים שיעור 1# נכתב ע"י אדם שפר אתר הקורס.

מיונים: Θ(n²) Selection Sort. Θ(n²) WC. Insertion Sort. יהיו O(nlogn) השוואות) Θmax{n, k} = Θ(n + k) Counting Sort ההשוואת) Θ(k n) Radix Sort ההשואות)

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

אלגברה לינארית מספר יחידות לימוד

מתכונתבמתמטיקה 1 - כיתהיא'

פרופורציה, הרחבה, הכללה.

תיקונים לשאלון 807 א.מ. ספרי מתמטיקה עמוד, 9 פתרון דוגמא, 2 סעיף ג', שתי השורות האחרונות צריך להיות: חישוב הנפח: V = a a 3a 0.

התקנת Turbo C שלב אחר שלב :

הבעיה: CV, EV, AV עודף הצרכן CS השפעות תחלופה והכנסה לפי היקס וסלוצקי "תועלת" משינוי במחיר כשטח. x 2. x 1 2. x** הצרכן מקסם את רווחתו וכעת...

מבוא לרשתות - תרגול מס 4 Automatic Repeat request (ARQ) protocols: Go-Back-N, Selective-Repeat שאלה 1

הרצאות תוכן עניינים עקרונות בסיסיים של מניה... 3

שאלון 806 מבחן מס' 1

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

פתרון מבחן מתכונת מס' 21. פתרון שאלה 1 נסמן: x מהירות ההליכה של נועם. y מהירות ההליכה של יובל. נועם 2.5x 2.5 x יובל בתנועה יובל במנוחה משוואה I:

מספרים ראשוניים, מספרים טבעיים, מספרים שלמים, מספרים

Medline Ebsco 2016 ינוי

מרכז הלב היחידה לאלקטרופיזיולוגיה וקוצבי לב. מרכז הלב ע"ש לבייב The Leviev Heart Center פרפור פרוזדורים. חוברת מידע www. heart.sheba.co.

תרגילי חזרה באלקטרומגנטיות קיץ תשס"ז שאלה 1. נתונים: g, m, V. d, h.

חשמל ומגנטיות קרינה וחומר

פרק א: קינמטיקה - תנועה לאורך קו ישר

םוליצב ןמזו תוילקיסקדניא

"לא הבנת את אבא שלך" לילך ניישטט בורנשטיין פגיס והחידה האוטוביוגרפית

ד"ר פיליפ סלובוצקי מדריך למורה מתמטיקה 01 ספר לימוד ותרגול לפי תכנית הלימודים החדשה ל- 4 י"ל כולל המחשות ותרגול מקוונים בית הלומדה מדריך למורה

תוכנת VideoExp. פתח את תוכנת ה-.VideoExp לחץ על תפריט "קבצים" ואז על אופציית "פתח". פתח את

HP Deskjet 6980 series. Setup Guide

SUUNTO DIVE COMPUTER. Favor / Favor Lux / Favor Lux S / Fusion Lux S / Octopus II

äéâåìåéæéôåøè ìàå áåöé ì éìàøùéä âåçä THE ISRAEL WORKING GROUP ON PACING AND ELECTROPHYSIOLOGY CARDIOVERSION OF ATRIAL FIBRILLATION

מבוא "אישיות" תלותית. עישון. וכו' וכו' וכו'. רגיל להתנהג.

THE PINHAS SAPIR CENTER FOR DEVELOPMENT TEL AVIV UNIVERSITY

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

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

פרק 3 הזדמנויות. לשחק."

כל הזכויות שמורות נטתיק, היבואן הרשמי של DOD בישראל.

ניגוד העניינים אצל עורכי דין

גורמים )"טריגרים"( להתקפים

AGREEMENT BETWEEN THE GOVERNMENT OF THE STATE OF ISRAEL AND THE GOVERNMENT OF THE KINGDOM OF NORWAY REGARDING MUTUAL ASSISTANCE IN CUSTOMS MATTERS

כא"מ מושרה רשימת הציוד תיאור המערכת ורקע עיוני

מונחים בביולוגיה מולקולרית ומבוא להנדסה גנטית

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

Data Studio. Interfence_DoubleSlit.ds כרך: אופטיקה פיזיקלית ופיזיקה מודרנית

תיאור הפרויקט הפרויקטים של BCP בדיסלדורף. בתים טיפוסיים בשכונת גרסהיים Grafenberg

טרום הרדמה - סמי הרגעה, טשטוש ואופיאטים

לו ' ה גמב ירפה לדוגו לוביה תוסיו

דעו מ ילע דעו מ ילע לרב תיב תימדקאה הללכמה לש םיגחה ןולע

נהר הזמן של הטקסט האלפביתי

46-47 מאמ "תים LZM1 עד 160A

עקרונות הטיפול בקינזיולוגיה טייפינג

חובות עורך הדין בנוגע לתצהירים

דעדעלחיים

מצלמת וידאו HD דגמים HC-V100 HC-V100M

תוכנית אב לניקוז מפרץ חיפה, הקריות ועמק זבולון- חלק ב '

ספר איוב וחכמת המזרח הקדמון

2010 גג \ 22 1 בין דמויותיהם. מסה זו מנסה לפזר מקצת מן הערפל האניגמטי האופף את הספר טורים, ו, תרצ"ד 1933).

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

תיתביבס תוירחא חוד Corporate Environmental Responsibility Report 2007

חוברת הפעלה טלוויזיה PLASMA דגמים X-60

מה עוד תבקשי מאיתנו מכורה ואין ואין עדיין? יחידה ראשונה

AIGRENT ביטוח דיר ייחודי לשוכר ולמשכיר

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

תרפג ערב שבת קודש פרשת תצא

מדיח כלים רגיל דגם: DW-3000 מדיח כלים חצי אינטגראלי דגם: DW-3100

לפרוץ את הדרך שלך. לקבוע את אמות המידה שלך. לעשות מעל ומעבר. אלו הם רק כמה מעקרונות הליבה של מאזדה שהנחו את הפיתוח של המאזדה 2.

משרד הרווחה מציב רף: מספק שירותים לרגולטור

יחד בעשייה חברתית למען ילדים ונוער. ירושלים Jerusalem שולם P.P. שילוב והשתלבות

ממטרד למשאב ניהול והשבת מי נגר עירוני בעיר רגישת מים מדריך המרכז לערים רגישות מים יו"ר המכון: דני עטר. The Center for Water Sensitive Cities in Israel

הסכם לשירותי בריאות נוספים לחברי לאומית שירותי בריאות תוכן עניינים


- תיאור עסקי התאגיד לשנה שהסתיימה ביום 31 בדצמבר, הגדרות ומקרא תיאור פעילות התאגיד והתפתחות עסקיו... 3

נחשים ועולמם \ אהוד קלפון

טלוויזיה חכמה "65 תלת מימד,LED Smart TV ברזולוציית Ultra HD 4K עם פאנל,IPS אינדקס עיבוד תמונה 2700 PMI ועיצוב עוצר נשימה

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

"הואיל והיות הגוף בריא ושלם, מדרכי השם הוא. שהרי אי אפשר שיבין או ידע דבר מידיעת הבורא המברין והמחלימים" הלכות דעות רמב"ם

ינפל ןאולמב תוארוהה תא וארק אנ

מדריך השקעות לטווחים ארוכים מדריך 2013 מקצועי

טכנולוגיית הלוחמה הקיברנטית ובניין הכוח בישראל השפעת התפתחות טכנולוגיית הלוחמה הקיברנטית על שינויים בבניין הכוח בישראל

מכרז מסגרת לביצוע עבודות מיזוג אוויר ומערכות בקרה עבור אוניברסיטת חיפה

7 * * *

בית-הספר למדעי המעבדה הרפואית תואר ראשון (B.Med.L.Sc.)

)מיתקני חשמל בבריכה במתח שאינו עולה על מתח נמוך(, התשס"ג

לאומית כסף/זהב או 507* מטלפון נייד חפשו אותנו בפייסבוק.

910 Series Photo Jetprinter. Installationslösningar Installationsløsninger Asennusratkaisut Løse installeringsproblemer

IFRS 2. International Financial Reporting Standard 2. Share-Based Payment הבאות: הבאים לתקן דיווח כספי בינלאומי 2: מועד תחילה 1 בינואר 2010.

סניף רעננה רח התדהר 2 סניף ירושלים רח פייר קניג 40 א.ת. תלפיות סניף חיפה שד ההסתדרות 50 סוכנות חיפה סוכנות נצרת רח פאולוס השישי

תופי כבלים וכבלים מאריכים - הדרישות לאור התקינה החדשה

LWC 6100 W ראלקו מוצרי צריכה בע"מ, רח' המצודה 31, אזור מיקוד 58001

5200 Series All-In-One

בנק הפועלים דוח קיימות 2015 בדוח משולבים צילומים מהמרחב הישראלי, בו אנו נמצאים ופועלים

: םידחוימ םיכרצ םע םידלי םיתורישה ידי לע םיוסיכו םיכרצ תכרעה

Transkript:

מבני נתונים - תרגול 3 מבני נתונים לינאריים גלעד אשרוב 9 במרץ 2014 תקציר בתרגול זה נלמד על מבני נתונים לינאריים. נתרגל מערך, מחסנית, תור ורשימה מקושרת. 1 מבוא - מהו מבנה נתונים? מבנה נתונים הוא דגם המגדיר את היחסים בין הנתונים ואת הפעולות המבוצעות עליהם. אנו מראים אילו פועלות ניתן לבצע על מבנה הנתונים, וכיצד מנהלים אותו. אנו נפריד בין שני סוגים של פעולות על מבנה הנתונים "שאילתות",(queries) כלומר החזרת מידע על מבנה הנתונים, לבין פעולות "שינוי" operations) (modifying שבהם משנים את מבנה הנתונים עצמו. לאחר בניית מבנה הנתונים, אפשר להתחייס למבנה הנתונים כ דינאמי, כלומר - מגדירים כיצד יבוצעו פעולות השינוי, לעומת זאת, ניתן להתייחס למבנה נתונים סטאטי, שבו לא מגדירים פעולות שינוי, אלא מניחים שברגע שמבנה הנתונים כבר בנוי וכל הפעולות שיתבצעו עליו יהיה מהסוג - "שאילתות". לדוגמא, ניתן להגדיר את מבנה הנתונים S ועליו להגדיר את הפעולות הבאות: S. במבנה הנתונים x מחפש אחר האיבר Search(S, (x Min(S) מחזיר את האיבר ב S בעל המפתח הקטן ביותר. S. למבנה הנתונים x מכניס את האיבר Insert(S, (x.s ממבנה הנתונים x מוציא את Delete(S, x) נשים לב שהפעולות Insert, Delete הינן פעולות "שינוי", בעוד שפעולת Search ו Min אלו פעולות מסוג "שאילתות" (לפחות על פי הגדרה, אלו פעולות שלא משנות את מבנה הנתונים). על מנת לתאר את מבנה הנתונים, תחילה נתאר אותו באופן אבסטרקטי (מערכת הקשרים על הנתונים, ומהן הפעולות שיש לבצע על הנתונים). לאחר מכן, מגדירים את האלגוריתם לכל אחת מן הפעולות בפסאדו קוד. 1 בד"כ בשלב זה נרצה להעריך את סדר גודל כל פעולה שהגדרנו, ונרצה לשפר את מבנה הנתונים כך שיתאים בצורה אופטימלית לפעולות שאותן אנחנו ממשים. את שני השלבים האלה נעשה ברוב הקורס. לבסוף, בכדי להשתמש בפועל במבנה הנתונים, נצטרך לממש את מבנה הנתונים בשפת תוכנה מסוימת, לדוגמא ++C. שימו לב! זהו סיכום שהוכן והועלה לאתר לפני התרגול, וייתכן שבתרגול עצמו נעסוק בנושאים מעט שונים. מומלץ לבדוק לאחר התרגול האם הקובץ התעדכן. 1 כלומר, כותבים את הפתרון בצורה טכנית הנראית כמו קוד, אך לא מתייחיסים לפרטים קטנים ומעצבנים של מימוש בשפת תוכנה מסויימת. בעוד שקוד רגיל צריך לדעת לקרוא מחשב, את הפסאדו קוד צריכים לקרוא בני אדם, ולכן צריך לכתוב תוכנית בצורה שיהיה ברור מה מנסים לכתוב. 1

2 מערך לעומת רשימה מקושרת מערך הוא אוסף של פריטים שניתן לגשת אליהם בצורה ישירה באמצעות אינדקס (כלומר, גישה לאיבר מערך. זוהי ההגדרה גישה ישירה לכל איבר נקראת access''.''random הממוקם באינדקס ה- i נעשית ב-( O(1 ). האבסטרקטית של מבנה הנתונים. המימוש בפועל נעשה בעזרת רצף של תאים בזיכרון. כלומר, מגדירים בלוק שלם בזיכרון (רציף) שגודלו כגודל מספר האיברים שאותם רוצים לשמור, ושומרים מצביע לתחילת המערך. מכיוון שהנתונים שמורים כבלוק בזיכרון, מקומו בזיכרון של האיבר במקום ה i ניתן לחשב בעזרת i, המצביע לאיבר הראשון במערך וכמות הזיכרון הנצרכת לכל איבר.(sizeof) נעמוד על שתי תכונות עיקריות: 1. כאמור, גישה לאיבר ה- i במערך נעשית בזמן (1)O. 2. חוסר גמישות (1): קשה למחוק איברים במערך, תוך שמירת המקומות המנוצלים סמוכים זה לזה. ברגע שמוחקים איבר באינדקס i, נצטרך לבצע shift ולהזיז את כל האיברים לאחר האינדקס i, מקום אחד אחורה. במקרה הגרוע, פעולה זו לוקחת,O(n) כאשר n הוא גודל המערך. 3. חוסר גמישות (2): קשה להוסיף איברים חדשים. אם כל המערך מנוצל, אי אפשר פשוט להוסיף איברים חדשים, שכן כל המערך הוקצה כבלוק שלם בזיכרון, והמקומות בזכרון המופיעים לאחר המערך כבר הוקצו למטרה אחרת. לפיכך, יש צורך להקצות מערך חדש, ולהעתיק את כל הנתונים אליו. עלות זו עלולה להגיע ל-( O(n. 2 עלויות: חיפוש איבר. במערך ממויין - חיפוש איבר יעלה (n O(log בעזרת חיפוש בינארי. במערך לא ממויין אין ברירה אלא לסרוק את כל המערך, ועלות חיפוש היא.O(n) הוספת איבר. במערך ממויין, הכנסת איבר תוך כדי שמירה שיישאר ממויין תעלה.O(n) במערך לא ממויין, אם נתון מצביע למקום אותו רוצים להכניס את האיבר - העלות היא (1)O. הסרת איבר. במערך ממויין.O(n) במערך לא ממויין (בהינתן האיבר) (1)O. רשימה מקושרת. רשימה מקושרת הינו אוסף של איברים המפוזרים בזיכרון המחשב, כאשר בכל איבר מאוחסן המידע אותו רוצים לאחסן, ובנוסף - מצביע לאיבר הבא ברשימה. כלומר, כל צומת מורכב משני אלמנטים: הנתון עצמו, ומצביע לאיבר הבא ברשימה. נשמור מצביע מיוחד לראש הרשימה. בנוסף, האיבר האחרון ברשימה יצביע ל:.NULL בצורה זו, נקבל מעט יותר גמישות מאשר במערך: בהינתן מצביע לאיבר אותו רוצים ניתן להכניס ולהוציא ב( O(1. לעומת זאת, גישה לאיבר ה- i עולה כעת O(i) - שכן יש לעבור את כל המסלול מתחילת הרשימה ועד אליו. 3 מחסנית מחסנית היא אוסף סדור של פריטים. ההכנסה וההוצאה נעשית אך ורק דרך ראש המחסנית. הפריט שנכנס לראש המחסנית הינו זה שנמצא בראש המחסנית, ומדיניות ההכנסה וההוצאה של הפריטים במחסנית היא Last.In First Out - LIFO ניתן לבצע גישה במחסנית רק לאיבר הנמצא בראשה. פעולות אפשריות במחסנית: 2 בהמשך הקורס נראה מבנה נתונים הנקרא "מערך דינאמי", שבו ניתן לקבל את אותן התכונות כמו במערך (כלומר,,(random access ובנוסף, ננהל את ההכנסות בצורה חכמה כך שהעלות של הכנסה תעלה (1)O לשיעורין (כלומר, לפחות בשלב זה של הקורס, "בממוצע"). 2

דחיפה (x :push(s, הכנסת אלמנט למחסנית. ההכנסה תתבצע לראש המחסנית. שליפה :pop(s) הוצאת האלמנט שבראש המחסנית. אם המחסנית ריקה פעולה זו גורמת להודעת שגיאה :(exception) stack underflow (חמיקה). האם ריקה :isempty(s) מחזירה האם המחסנית S הינה ריקה. ראש: top(s) מחזירה את האיבר שנמצא בראש המחסנית (ולא מוציאה אותו; זוהי שאילתא). נעיר שעל פי ההגדרה גודל המחסנית אינו מוגבל, ולכן ניתן לבצע את הפעולה push כאוות נפשנו. אך, ייתכן ולפעמים באימלפמנטציות מסויימות נרצה להגביל את גודל המחסנית. במקרה שהמחסנית מלאה, ומישהו מבצע פעולת - push נקבל הודעת שגיאה שנקרא.stack overflow לעיתים ניתן לקבל גם הודעת,stack underflow הקורת במקרה שמבקשים להוציא מהמחסנית איבר כאשר המחסנית ריקה. בכדי להימנע מכך - לפני כל פעולת.false החזיר isempty ורק אם אך ונבצע את פעולת ה- pop,isempty נבצע את פעולת pop מימוש. נממש מחסנית בעזרת מערך או רשימה. ניתן לממש כך שעלות על אחת מהפעולות תהיה (1)O (איך?). 3.1 דוגמא לשימוש במחסנית - המרת ביטוי מייצוג infix לייצוג postfix ביטוי בצורה inf ix הינו ביטוי (לדוגמא) מהצורה: 4 + 3 כלומר, האופרטור (/,,,+) מופיע בין שני האופרנדים (4,3). דוגמא נוספת היא למשל: infix : (4 + 6)/5 postfix : 4 6 + 5 / infix : 4 + 6/5 postfix : 4 6 5 / + דוגמא נוספת: דוגמא נוספת: infix : 4 + 6/5 + 2/3 postfix : 4 6 5 / + 2 3 / + ביטוי בצורת infix יותר אינטואיטיבי לבני אדם, וכך אנו משתמשים ביום יום. ביטוי בצורת postfix הינו קל יותר למחשב בשביל לבצע אבלואציה - כלומר, בשביל לחשב את הביטוי (תראו בהרצאה שאכן קל לחשב ביטוי כאשר הוא נתון בצורת.(postfix נראה כעת איך ניתן להמיר ביטוי בצורת infix לביטוי ב.postfix האלגוריתם צריך להתייחס לקדימויות של אופרטורים, קדימויות של סוגריים, לסדר של האופרנדים, וכו'. האלגוריתם: 1: אתחל מחסנית ריקה S (מחסנית האופרטורים). 2: לכל סמל c בביטוי (משמאל לימין): 2.1: אם אופרנד (מספר / משתנה) הדפס c. 2.2: אחרת: (c אופרטור סימן) 2.2.1: כל עוד S לא ריקה ו top(s) קודם ל c: (קודם מבחינת סדר פעולות) :2.2.1.1 הדפס.pop(S).push(c,S) :2.2.2 3: כל עוד S לא ריקה הדפס pop(s) במימוש זה התעלמנו בסוגריים. נעיר שבכדי לדעת להעביר גם סוגריים צריך לבצע רקורסיה. 3

דוגמא. נראה דוגמא עבור 6 5 4 :3 המחסנית ריקה, מתבוננים באיבר הראשון 3 ומדפיסים אותו. הביטוי המתקבל: 3 רואים אופרטור ( ). המחסנית ריקה מכניסים את למחסנית. 3, 4 רואים אופרנד 4. מדפיסים אותו. מקבלים: רואים אופרטור ( ). בודקים את ראש המחסנית. מכיון שבראש המחסנית יש אופרטור בעל ייחס קדימות ( קודם ל ), מוציאים את מהמחסנית, ומדפיסים אותו. כעת המחסנית ריקה, ומכניסים לתוכה את. נקבל: 3, 4, 3, 4,, 5 רואים 5, מדפיסים אותו. נקבל: רואים ( ), בודקים את ראש המחסנית, קודם ל, ולכן רק מכניסים את למחסנית. רואים 6, מדפיסים אותו, ומרוקנים את המחסנית. נקבל: 3, 4,, 5, 6,, 4 תרגילים תרגיל 1. סדרה מעורבבת של 10 פעולות push ו- 10 פעולות pop בוצעה, כך שפעולת ה- push הכניסו למחסנית את הספרות מ- 0 ל- 9 לפי סדר. מה מבין הסדרות הבאות אינה אפשרית? (הסדרות משמאל מייצגות את הערכים שהוצאו בפעולות pop לפי סדר הוצאתם).4, 3, 2, 1, 0, 9, 8, 7, 6, 5.1.4, 6, 8, 7, 5, 3, 2, 9, 1, 0.2.2, 5, 6, 7, 4, 8, 9, 3, 1, 0.3.4, 3, 2, 1, 0, 5, 6, 7, 8, 9.4 פתרון: נסמן ב- פעולות.pop נקבל:.0, 1, 2, 3, 4,,,,,, 5, 6, 7, 8, 9,,,,,.1 4

.0, 1, 2, 3, 4,, 5, 6,, 7, 8,,,,,, 9,,,.2.0, 1, 2,, 3, 4, 5,, 6,, 7,,, 8,, 9,,,,.3.0, 1, 2, 3, 4,,,,,, 5,, 6,, 7,, 8,, 9,.4 תרגיל 2. נתונה רשימה מקושרת חד כיוונית. הצעיו דרך לטייל (קדימה ואחורה) על הרשימה החד כיוונית (כלומר, ישנן שתי פעולות - "טיול קדימה" ובצורה כזו מדפיסים את כל האיברים ברשימה לפי סדר, מהאיבר הרשון לאיבר האחרון), ו"טיול אחורה" שבו מתחילים מהאיבר האחרון ומדפיסים את הרשימה בסדר הפוך). הפתרון אמור להיות ללא שימוש ברשימה דו כיוונית. פתרון: בכל איבר, נשמור ככתובת "האיבר הבא" את תוצאת הXOR של כתובת האיבר הקודם וכתובת האיבר העוקב (כלומר, שומרים.(P REV NEXT כעת, בטיול "קדימה", יש לנו את כתובת האיבר הקודם - REV P. לכן, כאשר נחשב:,P REV (P REV NEXT ) = NEXT נקבל למעשה את הכתובת של האיבר הבא. כאשר נבצע "טיול לאחור", יש לנו את כתובת האיבר הבא -,NEXT וכאשר נחשב,NEXT (P REV NEXT ) = P REV נקבל את כתובת האיבר הקודם. תרגיל 3. ממשו תור באמצעות שתי מחסניות. פתרון: נחזיק שתי מחסניות. נקרא להן inbox ו- outbox. כאשר נדחוף לתור - נדחוף תמיד ל- inbox. כאשר נשלוף מהתור, נבצע את הפעולה הבאה: אם outbox ריקה: כל עוד inbox לא ריקה שלוף איבר ממחסנית inbox והשם במשתנה x דחוף את x ל outbox שלוף מהמחסנית outbox והחזר את התוצאה. תרגיל 4. ממשו מבנה נתונים השומר מטריצה של ביטים, ותומך בפעולות הבאות:.(O(n 2 ) יצירת מופע ריק של מבנה הנתונים (עלות נדרשת: :init 1..(O(1) - נדרשת (עלות.(i, j) - הפיכת הערך בתא :Flip(i,j).2 3. HasAllOnesRow - מחזיר האם יש שורה שכולה אחדות. 4. HasAllZerosRow - מחזיר האם יש שורה שכולה אפסים. פתרון: מבנה נתונים שלנו יכיל את השדות הבאות: 1. מערך דו מימידי. נקרא למערך המקום ה- i במערך יציין את מספר האחדות בשורה i. 2. מערך בגדול n של מספרים..numberOfOnesInRow 3. משתנה המציין את מספר השורות שכולן אחדים. נקרא למשתנה זה.numberOfAllOneRows 4. משתנה המציין את מספר השורות שכולן אפסים. נקרא למשתנה זה.numberOfAllZeroRows 5

בהתחלה, נאתחל את המערך הדו מימדי לכולו אפסים, נאתחל את כל התאים במערך numberofonesinrow לאפסים. את המשתנה numberofallonerows נאתחל ל- 0, ואת המשתנה numberofallzerorows נאתחל ל- n (מספר השורות). כעת, כאשר נקרא ל-,Flip(i,j) ניגש למקום ה ( j,i) במערך הדו מימידי ונחליף את תוכנו (נבצע 1 ). בנוסף נבצע: אם עברנו מ- 0 ל- 1, ייתכן שקיבלנו עכשיו שורת אחדות. ניגש ל[ numberofonesinrow[i ונגדיל אותו ב 1. אם הערך הנ"ל גדל מ- 1 n ל- n, קיבלנו שורת אחדות ולכן נקדם את ערך המשתנה numberofallonerows באחד. אם numberofonesinrow[i] גדל מ- 0 ל- 1, הייתה לנו שורת אפסים שביטלנו אותה. לכן, נקטין את numberofallzerorows באחד. בצורה דומה, נעשה עבור מעבר מ- 1 ל- 0. כאשר נישאל,HasAllOnesRow נחזיר פשוט האם numberofallonerows גדול מ- 0. כאשר נישאל,HasAllZerosRow נחזיר פשוט האם numberofallzerosrows גדול מ- 0. 1. רשימה מעגלית היא רשימה מקושרת שבה האיבר האחרון מצביע לאיבר הראשון. כלומר: תרגיל 5. x 1 x 2... x n x 1 x 2... הציגו אלגוריתם המקבל כקלט רשימה, ומחזיר האם היא מעגלית או רשימה רגילה (רשימה שבה האיבר האחרון מצביע ל.(NULL הציגו פסאדו קוד. האלגוריתם צריך לעבוד בזמן O(n) ולהשתמש בסיבוכיות זיכרון של.O(1) 2. רשימה חלקית מעגלית היא רשימה שבה האיבר האחרון מצביע לאיבר כלשהו ברשימה. כלומר, הרשימה נראית בצורה הבאה: x 1 x 2... x n x i x i+1... כאשר i n 1 (ולכן, רשימה מעגלית שהוגדרה בסעיף (1) היא מקרה פרטי של רשימה חלקית מעגלית). הציגו אלגוריתם המקבל כקלט רשימה, ומחזיר האם היא חלקית מעגלית או רשימה רגילה. הציגו פסאדו קוד. האלגוריתם צריך לעבוד בזמן O(n) וסיבוכיות זכרון של (1)O. יש להוכיח שזמן הריצה של האלגוריתם הוא.O(n) פתרון: הסעיף הראשון קל - נחזיק פוינטר לאיבר הראשון ברשימה, ופוינטר נוסף שירוץ על הרשימה. בכל שלב נבדוק אם הם נפגשים. אם הרשימה מעגלית הם ייפגשו. במקרה זה האלגוריתם יעצור ויחזיר "הרשימה מעגלית". אם היא אינה מעגלית הפוינטר השני יגיע לאיבר האחרון ברשימה שמצביע ל NULL. האלגוריתם יעצור ויחזיר "רשימה רגילה". הסעיף השני לא ניתן לעמוד עם הפוינטר הראשון במקום. גם הוא צריך לזוז. נעיר שקל מאוד למצוא אלגוריתם שעובד בזמן O(n) ובסיבוכיות מקום,O(n) (כיצד?). כמו כן, ברור כי החסם התחתון לאלגוריתם מבחינת זמן ריצה הינו O(n) (האלגוריתם חייב לרוץ על כל האיברים). אנו נראה אלגוריתם שמשתמש ב (1)O מקום, ולכן הוא האופטימלי ביותר לבעיה. נתחיל את הפתרון ברעיון אסטרקטי. נניח שצב וארנב מתחרים בתחרות ריצה. אם המסלול מעגלי, באחד מהסיבובים שניהם ייפגשו שוב, בנקודה כלשהי על פני המסלול. לעומת זאת, אם המסלול אינו מעגלי, הארנב יגיע קודם לקו הסיום, ולעולם שניהם לא יעמדו באותו המקום. מימוש הרעיון אצלינו ייעשה באופן הבא. נחזיק שני מצביעים, שזזים על הרשימה "בקצבים שונים": הראשון זז איבר אחרי איבר ("הצב"), בעוד השני זז בקפיצות של שני איברים ("הארנב"). הטענה היא שאם הרשימה היא חלקית מעגלית שני המצביעים ייפגשו. לעומת זאת, אם הרשימה אינה חלקית מעגלית (ולכן היא סופית, בפרט, האיבר האחרון מצביע ל NULL ), המצביעים לא ייפגשו, ולמעשה אחד מהם יגיע קודם לאיבר האחרון, ויידע שהגיע לסוף הרשימה (יידע להגיד "הרשימה אינה חלקית מעגלית"). בצורה מפורשת, האלגוריתם יעבוד בצורה הבאה: קלט: רשימה מקושרת. 6

פלט: האם הרשימה חלקית מעגלית. האלגוריתם: שמור מצביע p1 לראש הרשימה. שמור מצביע נוסף p2 לראש הרשימה. קדם את המצביע p1 באיבר אחד. קדם את המצביע p2 בשני איברים. כל עוד אחד מהמצביעים לא הגיע ל,NULL בצע: אם המצביעים מצביעים לאותו איבר (המצביעים שווים ממש): החזר 1 ("הרשימה חלקית מעגלית"). קדם את המצביע p1 באיבר אחד. קדם את המצביע p2 בשני איברים. החזר 0 ("הרשימה אינה חלקית מעגלית"). 7