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

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

Algorithms. Intro2CS week 5

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

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

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

Practical Session No. 14 Topological sort,amortized Analysis

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

Practical Session - Heap

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

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

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

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

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

Amortized Analysis, Union-Find,

Programming for Engineers in Python

Programming for Engineers in Python

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

ASP.Net Web API.

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

Chapter 11.2 Linked lists ( )

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

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

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

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

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

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

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

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

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

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

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

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

Engineering Programming A

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

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

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

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

Computer Programming A תרגול 9

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- MEAN Stack חזרה. MongoDB - as the database Express - as the web framework AngularJS - as the frontend framework NodeJS- as the server platform

גירסה

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

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

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

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

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

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

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

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

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

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

Operating Systems. Practical Session 4 Threads

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

תרגול מספר 3: מערכים

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

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

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

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

Introduction to Programming in C תרגול 8

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

מחרוזות ב Java ותכנות מונחה בדיקות )Test Driven Development(

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

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

The single cycle CPU

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

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

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

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

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

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

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

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

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

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

Object-Oriented Analysis and Design

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

מבוא למדעי המחשב תרגול 10 Comparator, Comparable, Binary Trees

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

מבוא למדעי המחשב תירגול 3:

#1 - Introduction. Agenda

Exams questions examples

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

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

Graph Database, think different!

מבוא למדעי המחשב תרגול 10 הממשקים Iterator, Iterable Binary trees

LaserJet Enterprise M506

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 עצים מאוזנים, שנלמדו בשני השעורים הקודמים, משמשים למימוש פעולות המילון )חיפוש, הכנסה, הוצאה( בזמן (n O(log במקרה הגרוע ביותר. מימוש הפעולות אינו טריוויאלי, במיוחד כאשר יש צורך לתמוך גם בפעולות הדורשות לשמור בכל צומת אינפורמציה ייחודית )כמו )rank ולעדכן אותה. נלמד כעת מבנה נתונים בעל מימוש פשוט מאוד, שלא דורש איזונים של מבנה הנתונים לאחר הכנסה/הוצאה. בתמורה : בצוע פעולות המילון יעשה בזמן (n O(log בממוצע. כמו כן ההסתברות שזמן בצוע פעולה יחרוג בצורה משמעותית )נאמר פי 3( מהזמן הממוצע היא זניחה )פחות מ- 1 ל 100,000,000). cs,technion

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

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

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

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

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

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

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

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

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

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

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

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

29 הטלת מטבע נניח שלמטבע הסתברות p לצאת "זנב" )נסמן צד זה באפס( לצאת "ראש" )נסמן צד זה באחד(. כמה פעמים בממוצע L יש להטיל את המטבע עד שנקבל והסתברות 1-p "ראש"? i נסמן ב- Q i את ההסתברות שנקבל התפלגות גאומטרית(. "ראש" לראשונה בהטלה ה- )נקרא

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

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

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

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

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

35 מהו אורך מסלול חיפוש ממוצע? משפט: האורך הממוצע L של מסלול חיפוש ברשימת דילוגים עם מקיים + 2 (n).l 2log 2 n מפתחות הוכחה: נסתכל על מסלול חיפוש מנקודת הסיום אחורנית לנקודת ההתחלה. המסלול מורכב מתנועה מעלה )כשאפשר( ותנועה שמאלה )כשחייבים(. כאשר מגיעים לקצה השמאלי ביותר, התנועה ממשיכה כלפי מעלה בלבד.

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

37 מהו אורך מסלול חיפוש ממוצע? משפט: האורך הממוצע 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) לפיכך:

38 מהו אורך מסלול חיפוש ממוצע? משפט: האורך הממוצע 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

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

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

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

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

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

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

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

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

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

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 51 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 45 דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 52 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 45 דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 53 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 45 דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 54 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 45 T דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 55 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 45 T דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 56 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 45 T דוגמא: הכנס 17 5 11 13 15 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 57 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 45 T דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 58 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 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 59 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 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 60 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 q 20 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 61 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 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 62 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 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 63 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 45 דוגמא: הכנס 17 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 64 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 45 דוגמא: הכנס 17. הפעולה הסתיימה. 5 11 13 15 17 20 23 32 35 45 47 cs,technion

תוכנית להכנסה ברשימת דילוגים דטרמיניסטית 65 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 45 דוגמא: הכנס 17. הפעולה הסתיימה. 5 11 13 15 17 20 23 32 35 45 47 cs,technion הערה: במידה והרמה העליונה היתה מכילה שני מפתחות אז היה צורך להוסיף רמה חדשה.

66 הקשר לעצי 3-2 נראה כעת כיצד עץ 3-2 הופך להיות רשימת דילוגים דטרמיניסטית. הטרנספורמציה שנראה נועדה להדגים את הקשר בין שני מבני הנתונים שלמדנו. בשום מצב אין צורך לממש טרנספורמציה זו בתוכנית מחשב. cs,technion

רשימת דילוגים דטרמיניסטית בהקשר לעצי 3-2 67 עץ 3-2 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 cs,technion

רשימת דילוגים דטרמיניסטית בהקשר לעצי 3-2 68 עץ 3-2 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 מימוש עץ 3-2 כעץ בינרי: 11, 20 45 5 13, 15 23 32, 35 47 cs,technion 2 5 11 13 15 20 23 32 35 45 47

69 רשימת דילוגים דטרמיניסטית )המשך( מימשנו עץ 3-2 כעץ בינרי. 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 שינוי ערכי הצמתים הפנימיים וחבור 2 הצמתים בכל רמה נותן.skip list 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47

70 רשימת דילוגים דטרמיניסטית )המשך( מימשנו עץ 3-2 כעץ בינרי. 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 שינוי ערכי הצמתים הפנימיים וחבור 2 הצמתים בכל רמה נותן.skip list 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47

71 רשימת דילוגים דטרמיניסטית )המשך( מימשנו עץ 3-2 כעץ בינרי. 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 שינוי ערכי הצמתים הפנימיים וחבור 2 הצמתים בכל רמה נותן.skip list 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47

72 רשימת דילוגים דטרמיניסטית )המשך( מימשנו עץ 3-2 כעץ בינרי. 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 שינוי ערכי הצמתים הפנימיים וחבור 2 הצמתים בכל רמה נותן.skip list 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47

73 רשימת דילוגים דטרמיניסטית )המשך( 2 2 חבור הצמתים בכל רמה ושינוי ערכי הצמתים הפנימיים נתן.skip list 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47 2 הוספת איבר ראשון ואיבר סופי. 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47

74 רשימת דילוגים דטרמיניסטית )סיכום( העץ המקורי. 11, 20 45 5 13, 15 23 32, 35 47 2 5 11 13 15 20 23 32 35 45 47 2 רשימת דילוגים אקוויוולנטית. 2 2 11 20 45 2 5 11 13 15 20 23 32 35 45 47