רשימות דילוגים Skip Lists

Similar documents
רשימות דילוגים Skip Lists

Algorithms. Intro2CS week 5

סכום (סדרת ערכים) אחרת - דוגמא: סכום-ספרות (num) אם < 10 num החזר 1 או אם = 0 = num החזר 0 public static int numofdigits (int num)

מבוא למדעי המחשב תרגול 13: עצים בינאריים

Practical Session - Heap

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

Practical Session No. 14 Topological sort,amortized Analysis

תזכורת: עץבינארי מבוא למדעי המחשב הרצאה 24: עצי חיפוש בינאריים

רזח יליגרתו םי יראני ב ם

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

שאלה 1 מהו הפלט של התוכנית הבאה:

לתיכנות עם MATLAB Lecture 5: Boolean logic and Boolean expressions

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

ת ונכת סרוק תורשוקמ תומישר :יעישת רועיש 1

היצביט ומ - ןוכית ת וי נבת

תור שימושים בעולם התוכנה

ASP.Net Web API.

Programming for Engineers in Python

Programming for Engineers in Python

Communication Networks ( ) / Spring 2011 The Blavatnik School of Computer Science, Tel-Aviv University. Allon Wagner

Amortized Analysis, Union-Find,

תוכנה 1 סמסטר א' תשע"א

מבוא למדעי המחשב 2018 תרגול 7

תוכנה 1 תרגול 2: מערכים, מבני בקרה ושגיאות

מבוא למדעי המחשב תרגול 8 רשימה משורשרת כללית, Comparator

עצים. מבני נתונים Iterators רשימות מקושרות עצים "רגילות" רקורסיביות

Engineering Programming A

תרגול 7 רשימות משורשרות, רקורסיית

Chapter 11.2 Linked lists ( )

הנכות 1 תואיגש םע תודדומתהו תואלול,םי : כרעמ 2 לוגרת

הנכות 1 תואיגש םע תודדומתהו תואלול,םיכרעמ : לו 2 גרת

תוכנה 1 בשפת Java נושאים שונים בהורשה רובי בוים ומתי שמרת בית הספר למדעי המחשב אוניברסיטת תל אביב

ב ה צ ל ח ה! אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק מיועד לתלמידי : א'

Computer Programming A תרגול 9

לוגיקה סינכרונית. מרצה: יפתח גילעדי, פלאפון: מיל:

מבוא לתכנות בשפת C. Tzachi (Isaac) Rosen

הפלט אחרי הביצוע של ההוראה :what3(root)

תוכנה 1 תרגול 2: מערכים ומבני בקרה

מדעי המחשב 2 יחידות לימוד פתרון בחינת הבגרות פרק א. I x > a. פתרון 2: משפט switch

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Loop through Arrays. Array Creation and Initialization

מערכים שעור מס. 4 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

דף הדרכה ליצירת שרת/ לקוח עם GUI

תוכנה 1 מערכים. Array Creation and Initialization. Array Declaration. Array Creation and Initialization. Loop through Arrays

תוכנה 1 3 תרגול מס' מערכים ומבני בקרה

תרגילים ופתרונות בשפת - C הסתעפויות

מבני נתונים תכנות מונחה עצמים מבני נתונים. מחלקות אבסטרקטיות חבילות packages סיכום הרשאות גישה wrappers ADT מערך דינמי מחסנית

מצליחה. 1. int fork-bomb() 2. { 3. fork(); 4. fork() && fork() fork(); 5. fork(); printf("bla\n"); 8. return 0; 9. }

משתנים שעור מס. 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 1

תרגול 6 רקורסיה ותכנות מונחה עצמים

Graph Database, think different!

Practical Session #4 - ADTs: Array, Queue, Stack, Linked List

עקרונות שפות תכנות 2016 תרגול 8 Type Inference System. Substitution Interpreter.

Lecture 16: Linked Lists

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

תרגול 4 פונקציות. מבנה של פונקציה: public static <return value type> <function name> (<arg1 type> <arg1>, <arg2 type> <arg2>, ) { <function body> }

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

else if (p.getinfo().getvotes() < c1.getvotes()) { c1 = p.getinfo()

מבוא למדעי המחשב תרגול 12 מחסנית )Stack( memoization

עבודה עם STL. )Dmitry Korolev

Introduction to Programming in C תרגול 8

קורס תכנות שיעור שני: שימוש במשתנים,

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

תוכנה 1 תרגול מספר 13

תוכנה 1 תרגול מספר 13

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

ספרית התבניות הסטנדרטית (STL) כתיבת אלגוריתמים גנריים מצביעים חכמים. .vector. list iterator נכיר תחילה את האוסף הפשוט ביותר בספריה

Chapter 19a Pronominal Suffixes Introduction

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

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

תרשים המחלקות ותרשים העצמים

מבוא לתכנות מערכות מבחן מועד א' סמסטר חורף

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

פתרון מוצע לבחינת מה"ט ב_שפת c מועד אביב תשע"ח, פברואר 8102 מחבר: מר שייקה בילו, מכללת אורט רחובות

הקלחמ ה תמרב ת ונ וכ ת (static members ) יליזרב דהוא Java תפשב ם דקת מ תונכת ביבא ל ת תטיסרבינוא

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

תכנות מתקדם בשפת C משתנים

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

תוכנה 1. תרגול מספר 11: Static vs. Dynamic Binding מחלקות מקוננות Nested Classes

תוכנה 1 * לא בהכרח בסדר הזה

תוכנה 1 * לא בהכרח בסדר הזה

Advanced Lab in Computer Communications Meeting 1 Layers Model, Codes, Ethernet. Instructor: Tom Mahler

מבוא לתכנות תוכנית שעור מס. 1 1 דר' דרור טובי, המרכז האוניברסיטאי אריאל בשומרון.

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

Exams questions examples

LaserJet Enterprise M506

Java פעולות עוברות בירושה סביבת יסודות מדעי המחשב נספח הורשה

כתבו קוד ב- 3 קבצי ה hpp (כתבו כהערה את שם הקובץ מעל) כך שהקוד יהיה תקין ובסגנון טוב. אין חובה

סעיף ב )11 נקודות( public synchronized void advance(staircase staircase) throws InterruptedException staircase!

Practical Session 2 Constants Don t Matter!!!

Operating Systems. Practical Session 4 Threads

גירסה

תוכנה 1 מבני נתונים גנריים

הנכות 1 םוכיס לוגרת 13 1

Smart Pointers Nir Adar

הנכות 1 םוכיס לוגרת 13 1

מבוא לתכנות ב- JAVA תרגול 5. Ipc161- practical session 5

מבוא למדעי המחשב תירגול 2: מבוא למדעי המחשב מ' - תירגול 2

תרגול 12. Standard Template Library כתיבת אלגוריתמים גנריים מצביעים חכמים

<exp> ::= <define> <cexp> <define> ::= ( define <var-decl> <cexp> ) / DefExp(var:VarDecl, val:cexp)

Transcription:

Lecture6 of Geiger & Itai s slide brochure www.cs.technion.ac.il/~dang/courseds רשימות דילוגים Skip Lists Skip lists: A probabilistic Alternative to Balanced Trees, William Pugh, Communications of the ACM, 33(6):668-676, 1990. המאמר נמצא גם באתר הקורס תחת skip list animation וכן באתר: www.cs.umd.edu/users/pugh (selected publications) Geiger & Itai, 2001

רשימות דילוגים Skip Lists 2 עצים מאוזנים, 2-3 ו- AVL שנלמדו בשני השעורים הקודמים, מ מ מ ש ים את פעולות המילון )חיפוש, הכנסה, הוצאה( בזמן (n O(log במקרה הגרוע ביותר. מימוש הפעולות אינו טריוויאלי, במיוחד כאשר יש צורך לתמוך גם בפעולות הדורשות לשמור בכל צומת אינפורמציה ייחודית )כמו )rank ולעדכן אותה. נלמד כעת מבנה נתונים בעל מימוש פשוט מאוד, שלא דורש איזונים של מבנה הנתונים לאחר הכנסה/הוצאה. ב ת מ ור ה: בצוע פעולות המילון )חיפוש, הכנסה, הוצאה( יעשה בזמן (n O(log בממוצע. למרות זאת, ההסתברות שזמן בצוע פעולה יחרוג בצורה משמעותית )נ אמ ר פי 3( מהזמן הממוצע היא זניחה )פחות מ- 1 ל 100,000,000). cs,technion

מהו Skip lists "ממוצע"? ראינו כבר )בשיעור 3( שעצי חיפוש ללא פעולות איזון יכולים לשמש למימוש פעולות המילון בזמן (n O(log ב"ממוצע". מהו הממוצע הזה? בניתוח שעשינו הנחנו שהוכנסו n איברים כך שההסתברות לכל אחת מ-!n הפרמוטציות להכנסתם אחידה. הממוצע של גובה!n העצים שנוצרו הוא (n.o(log אבל ההנחה שעשינו הינה על הקלט! הבעייתיות בניתוח זה: ההסתברות להופעת פרמוטציה בקלט אינה ידועה ואין שום סיבה להניח יוניפורמיות. אנו מעוניינים במבני נתונים + הבטחות ביצועים ללא תלות בהנחות מ פ ק פ ק ות על הקלט. בפרט היינו מעוניינים להיות ח ס ינ ים ל-"יריב" המעוניין להאיט את ריצת האלגוריתמים. 3 cs,technion

4 ברשימות דילוגים, שעליהן נלמד היום, נקבל ביצוע בזמן O(log n) בממוצע. אולם: המבנה וזמן ביצוע הפעולות תלויים בהגרלות שעושה המחשב ולא בסדר הכנסת הנתונים. הממוצע מחושב לפי ההגרלות ולא לפי הנחות על הסתברות הקלטים. אלגוריתם כזה נקרא אלגוריתם רנדומלי. cs,technion

הרעיון המרכזי חיפוש איבר בסוף רשימה הוא יקר. 5 5 11 13 15 17 20 23 31 32 35 45 47 כדי לזרז את החיפוש )פי שניים( נוסיף מ ד ר י ך תת רשימה של כל איבר שני: 5 13 17 23 32 45 5 11 13 15 17 20 23 31 32 35 45 47 n מהו זמן החיפוש המינימלי? n 2 n O n זמן חיפוש cs,technion

6 כדי לזרז את החיפוש במדריך נוסיף רמה נוספת: 5 17 32 5 13 17 23 32 45 5 11 13 15 17 20 23 31 32 35 45 47 3 n מהו זמן החיפוש המינימלי עם שני מדריכים? 3 n 3 3 3 n O n n תרגיל: זמן חיפוש cs,technion

Skip lists נוסיף מ ד ר י ך איבר שני כל 7 5 17 32 5 13 17 23 32 45 5 11 13 15 17 20 23 31 32 35 45 47 n 4 n 2 n וכך הלאה עד לרמה log n ובה איבר בודד. מספר האברים n + n 2 + n 4 + + 1 2n cs,technion

נניח שמחפשים מפתח x. נתחיל משורש המבנה. אלגוריתם החיפוש 8 בכל רמה נצעד ימינה כל עודהמפתחות שנסרקים קטנים או שווים ל- x. עם מיצוי הרמה נרד רמה אחת, וכו'. שורש 5 32 5 17 32 5 13 17 23 32 45 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

9 אורך מסלול החיפוש נסתכל על מסלול החיפוש מצומת הסיום ועד צומת ההתחלה. במעבר מרמה לרמה אנו עוברים על פני 2 מצביעים לכל היותר..2log n 5 32 לפיכך אורך המסלול הוא 5 17 32 5 13 17 23 32 45 5 11 13 15 17 20 23 31 32 35 45 47 הבעיה שנותר לפתור היא כיצד לשמור על המבנה שיצרנו בעת הכנסה והוצאה מבלי שיהיה צורך לארגן את כל הרמות מחדש. cs,technion נשים לב שאלגוריתם החיפוש נכון גם אם מספר הצמתים של רמה i צמתים של רמה 1-i אינו קבוע. בין כל שני

10 צעדים להכנסת מפתח k. הכנסה באמצעות הטלת מטבע חפש את k. אם k נמצא סיים. הוסף צומת חדש עם מפתח k ברמה התחתונה ביותר )במקום המתאים!(.1.2 לפי סדר הרמות מלמטה למעלה: הגרל מטבע ).toss( אם יוצא 0: הוסף צומת חדש מעל הרמה הנוכחית וקבע את המפתח בו להיות k. אם יוצא 1, עצור. אם ברמה העליונה הוגרל 0, הוסף רמה חדשה. הגרלה.3.4 1 5 17 32 הכנס 31: 0 5 13 17 23 31 32 45 cs,technion 5 11 13 15 17 20 23 31 32 35 45 47

11 הוצאה מרשימת דילוגים מצא את האיבר בעל המפתח k. הוצא איבר זה מכל הרמות בהם הוא מופיע..1.2 17 הוצא 31 :17 11 17 20 31 45 5 11 13 15 17 20 23 31 32 35 45 47 31 11 20 31 45 5 11 13 15 20 23 31 32 35 45 47

צומת לרשימת דילוגים typedef struct node { הגדרת צומת ופרוצדורת עזר ליצירתו. Key value ; struct node *next, *down ; next value NODE ; down NODE *top ; 12 cs,technion NODE *new_node (KEY k, NODE *n, NODE *d) { NODE *p ; p = (NODE *) malloc( sizeof ( NODE )) ; p value = k ; p next = n ; p down = d ; return p ;

הערות לגבי התוכניות נוח להוסיף בכל רמה צומת אחד בהתחלת הרשימה שמפתחו - בסוף שמפתחו.)sentinel( + וצומת אחד 13 תוכנית ההכנסה רקורסיבית אך ניתן לכתוב אותה גם ללא רקורסיה בקלות רבה.,p באתר הקורס תחת בשפת ++C ובשפת skip list animation קיים קוד לא רקורסיבי.Java יש הבדלים מסוימים בין התוכניות השונות. הפרוצדורה add_after(k,p) מוסיפה צומת חדש בעל מפתח k אחרי ומחזירה מצביע אליו. הפרוצדורה ) toss( מחזירה 0 או 1 בהסתברות שווה. p k=17 add_after(k,p) 17 cs,technion

תוכנית חיפוש ברשימת דילוגים 14 NODE *search (KEY k, NODE *p) { /* returns a pointer p to last node k */ while(1) { for ( ; p next value <= k ; p = p next) ; if ( p down = = NULL) break; /* final level */ p = p down ; return p ; p 31 מצא 17: לא נמצא. 11 20 31 45 5 11 13 15 20 23 31 32 35 45 47 cs,technion

להכנסה ברשימת דילוגים NODE *insert1 (KEY k, NODE *p) תוכנית Skip lists 15 { /* returns a pointer to the added node */ NODE * deeper, *new_node; for ( ; p nextvalue <= k ; p = pnext) ; if ( p down = = NULL) return add_after(k,p) ; /* final level */ deeper = insert1(k, pdown); if (( deeper == NULL toss( ) ) then { return NULL; else { new_node = add_after(k,p) ; new_node down = deeper ; return new_node; 17 הכנס 31 :17 p p down new_node deeper 11 17 20 31 45 k הפרוצדורה add_after(k,p) מוסיפה צומת חדש בעל מפתח ומחזירה מצביע אליו. אחרי p, 0 5 11 13 15 17 20 23 31 32 35 45 47

16 הכנסה ברמה העליונה NODE *insert (KEY k, NODE *old_list) { /* returns a pointer to the added node */ NODE * deeper ; deeper = insert1(k, old_list); if (( deeper == NULL toss( ) ) return old_list ; return new_node(-infinity, inf-addrs, old_list); 17 31 הכנס 17: 11 17 20 31 45 5 11 13 15 17 20 23 31 32 35 45 47

Insert(50) אלגוריתם הכנסה לא רקורסיבי ברשימת דילוגים 90 44 90 13 30 44 50 57 66 90 + Delete(57) 1

Insert(56) 90 44 90 + 13 30 44 50 56 66 90 0

90 44 56 90 + 13 30 44 50 56 66 90 01

20 בכמה רמות בממוצע מופיע כל מפתח? בכל רמה האלגוריתם מטיל מטבע כדי לקבוע אם יוצר העתק נוסף מעליה. מספר הרמות הממוצע למפתח שווה למספר הפעמים הממוצע שיש להטיל מטבע ה וג ן עד שיצא 1. מספר הפעמים הממוצע שיש להטיל מטבע הוגן עד שיצא 1 הוא 2. )הוכחה בשקף הבא. אינטואיציה:בממוצע מטבע נופל פעם על צד 0 ופעם על צד 1(. 31 11 17 20 31 45 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion מסקנה )לא פורמלית(: מספר הצמתים הממוצע הוא 2n כאשר n הוא מספר המפתחות במבנה )כל מפתח מופיע בממוצע פעמיים(.

21 מהו אורך מסלול חיפוש ממוצע? משפט: האורך הממוצע L של מסלול חיפוש ברשימת דילוגים עם מקיים + 2 (n).l 2log 2 n מפתחות הוכחה: נסתכל על מסלול חיפוש מנקודת הסיום א ח ור נ ית לנקודת ההתחלה. המסלול מורכב מתנועה מעלה )כשאפשר( ותנועה שמאלה )כשחייבים(. כאשר מגיעים לקצה השמאלי ביותר, התנועה ממשיכה כלפי מעלה בלבד. נסמן ב- c(k) מתקיים: הסבר: את אורך המסלול הממוצע ה מ ט פ ס רמות. k c(0) = 0 c(k) ½ (1+ c(k)) + ½ (1 + c(k-1)) צעד שמאלה בהסתברות ½ )אם אפשר( וצעד מעלה בהסתברות ½. c(k) 2 + c(k-1) לפיכך: c(k) 4 + c(k-2) 2k ולכן: כלומר אורך מסלול ממוצע מרמה 1 לרמה (n) log 2 מקיים: (n)-1) L 2(log 2

22 אורך מסלול חיפוש )המשך( המשך ההוכחה: נותר לקחת בחשבון את המקרים שבהם מספר הרמות גדול מ-.log 2 (n) מספר הצמתים ברמה 1 הוא n... n 4 ברמה 3 n 2 בממוצע בממוצע ברמה 2 ניתן להראות שמספר הרמות המקסימלי הממוצע עבור רשימת דילוגים עם n איברים קטן מ- + 2 (n) log 2 כלומר מספר הצעדים הממוצע כלפי מעלה מעל הרמה (n) log 2 הוא 2. לפיכך סך אורכו הממוצע של מסלול חיפוש מקיים: 4+(1-(n) L 2(log 2 כמצוין במשפט. cs,technion

23 זמן בצוע הפעולות מסקנה מהמשפט: חיפוש, הכנסה, והוצאה מרשימת דילוגים נעשים בזמן ממוצע (n O(log כיון שבכל צעד על מסלול החיפוש מתבצעים (1)O צעדים.

24 הטלת מטבע נניח שלמטבע הסתברות p לצאת "זנב" )נסמן צד זה באפס( והסתברות p-1 לצאת "ראש" )נסמן צד זה באחד(. כמה פעמים בממוצע L יש להטיל את המטבע עד שנקבל "ראש"? נסמן ב- Q i את ההסתברות שנקבל "ראש" לראשונה בהטלה ה- i. Q i = p i-1 (1-p) Q 0 =0 מתקיים: L i1 i i Qi i p (1 p) p 1 ( 1 ) i p 2 i1 i1 i1 1 p 1 p L 1 1 1 p p 1 כלומר בממוצע נדרשות הטלות עד שמקבלים "ראש". ועבור מטבע הוגן, ½ = p כאשר,נדרשות 2=L הטלות בממוצע.

25 שימוש במטבע מ ט ה כאשר משתמשים במטבע עם הסתברות לקבלת "זנב" p, אזי מספר ההעתקים הממוצע לכל מפתח הוא (p-1)/1 ומספר הרמות הממוצע הוא (n).log p/1 הכללת המשפט: האורך הממוצע L של מסלול חיפוש ברשימת דילוגים עם n מפתחות כאשר למטבע הסתברות p לצאת זנב" מקיים.)1/p 2 מוחלף ב- )כלומר.L 1/plog 1/p (n) + 1/p לפיכך, לפרמטר p חיפוש. אין השפעה גדולה )בגבולות ס ב יר ים( על האורך הממוצע של מסלול

רשימת דילוגים דטרמיניסטית Deterministic Skip List נראה כעת כיצד לממש skip list דטרמיניסטי. מבנה נתונים זה מאפשר פעולות חיפוש/הכנסה/הוצאה כמו בעצים מאוזנים )ובסיבוכיות זמן זהה(. נתאר כעת בפרוטרוט את פעולת ההכנסה. 26 T 11 20 31 45 5 11 13 15 20 23 31 32 35 45 47 31 cs,technion

27 הרעיון העיקרי יש לשמור שמספר הצמתים של רמה i בין כל שני צמתים של רמה 1-i יהיה 1 או 2. אם מספר הצמתים הוא 3, מוסיפים צומת ברמה ה- (1-i). 15 31 11 15 20 31 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 הערה: בניגוד לרשימת דילוגים )רנדומלית( המפתח שמוכנס אינו בהכרח המפתח שמשוכפל ברמה מעל. בדוגמא הוכנס 17 אך שוכפל המפתח 15. cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 28 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 29 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 30 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 31 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 32 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 33 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 34 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 35 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 36 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 31 דוגמא: הכנס 17 5 11 13 15 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 37 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; 17 T->next חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 38 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; cs,technion חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 5 11 13 15 17 20 23 31 32 35 45 47 31 דוגמא: הכנס 17

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 39 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; cs,technion חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 20 31 45 T 5 11 13 15 17 20 23 31 32 35 45 47 31 דוגמא: הכנס 17

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 40 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 q 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 41 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 q 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 42 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T 15 q T->next חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 q 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 43 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 44 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 45 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T q חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 46 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T 15 q חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 20 31 45 31 דוגמא: הכנס 17 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 47 int insert1(int x, NODE *T) { /* returns 1 iff new node allocated on this level */ NODE * q ; for ( ; T next value <= x ; T = T next) ; if (T down = = NULL){ /* a leaf */ T next = get_node(x, T next, NULL); return 1; if (!insert1(x, T down) ) return 0; /* check if as result of insertion, there are three nodes between T down and T next down */ q = T down next next ; if ( q next value < T next value ) { T next = get_node(q value, T next, q); return 1 ; return 0 ; T 15 חיפוש ברמה נוכחית. הוספה ברמה תחתונה. קריאה רקורסיבית. חזרה מקריאה רקורסיבית. 11 15 20 31 45 31 דוגמא: הכנס 17. הפעולה הסתיימה. 5 11 13 15 17 20 23 31 32 35 45 47 cs,technion הערה: במידה והרמה העליונה הכילה שני מפתחות אז יש להוסיף רמה חדשה.

הכנסה והוצאה דטרמיניסטית לא רקורסיבי 90 44 56 90 + 13 30 44 50 56 66 90 2 1 1 Insert(77)

T 90 44 56 90 q + 13 30 44 50 56 66 77 90 q = T->down->next->next T->next->down is q->next or q 2 Insert(80)

T 90 44 56 90 q + 13 30 44 50 56 66 77 80 90 q = T->down->next->next T->next->down is q->next or q

T q 90 44 56 77 90 + 13 30 44 50 56 66 77 80 90 q = T->down->next->next T->next->down is q->next or q

Delete(77) 56 90 44 56 77 90 + 13 30 44 50 56 66 77 80 90

Delete(77) 56 90 44 56 77 90 + 13 30 44 50 56 66 77 80 90

56 90 44 56 77 90 + 13 30 44 50 56 66 80 90

Delete(56) 56 90 44 56 90 + 13 30 44 50 56 66 80 90

Delete(56) 56 90 44 56 90 + 13 30 44 50 56 66 80 90

56 90 44 56 90 + 13 30 44 50 66 80 90

66 90 44 66 90-13 30 44 50 66 80 90