Anda di halaman 1dari 7

Assignment 4

question 1
p<- new skiplist
p1<- s1.first
p2<- s2.first
while (p1!=null) and (p2!=null)
x<- min(p1, p2)// P2 P1 ‫מקבל מצביע למינימום מבין‬
//‫אם ערכי המצביעים שווים אז מחזיא את המצביע אם המגדל הכי גדול ומקדם את‬
//‫המצביע שמוחזר אם הם שווים מקדם את שניהם‬
link <- p.insert(x.value) //
build_tower(link, x) //
if (p1!=null)
temp<-p1
else
temp<-p2
while (temp=null)
duplicate remaining list(p,temp)

question 4
‫מבנה הנתונים יהיה עץ בינארי שיכיל פרט לתוכן התא גם שדה שאומר כמה צמתים יש‬
‫משמאל התא‬
Element(i)
root.element(i,0)

Element(i, smaller)
if (smaller + this.smaller = i-1)//there is i-1 elements smaller
return data
if (smaller+this. smaller<i-1)//there is no i-1 elements smaller
return right.element(i, smaller +this. smaller+1)
if (smaller+this. smaller>i-1)//there is more than i-1 element smaller
return left.element(i, smaller)
insert(a)
if empty_tree
root <- create node(a, 0)
else
root.insert(a)

insert(a)
if a> data
if right = null //creating the node
right <- create node (a,0)
else
right.insert(a, 0)//call recursively to the method
else
if left = null
left <- create node (a, 0)
smaller <- 1
else //call recursively to the method
smaller--
left.insert(a)

Delete(i)
p <- find(i)
f <- p.father
if f.left = p
if p is leaf
f.smaller <- 0
f.left <- null
else
if p has one sun
f. smaller <- 1
f.left <- p.sun // left or right
else
r<-find most right (p)
p.data <- r.data
erase r
update_up(this)
if p is a leaf or has one sun
erase p
else
l<-find most left (p)
p.data <- l.data
erase l
update_up(l)

update_up(node) //update all up node that the node was erase


f <- node.father
while f != null
if f.left = node
f.smaller --
node <- f
f <- node.father
else
node <- f
f <- node.father

average(x1,x2)
‫ את נקודת‬Z ‫ נציין ב‬Element ‫ לפי אותו האלגוריתם ב‬x2 ‫ ול‬x1 ‫נמצא את המסלול ל‬
‫ ונסכם את כל‬x2 ‫ נמשיך בסלול עד ל‬Z ‫ההתפצלות של המסלול ואז בפנייה ימינה מ‬
‫האיברים עד אליו ואת כל האיברים בתתי העץ השמאליים עד אליו כמו כן נספור את כל‬
‫באותה צורה נפנה שמאלה‬.‫התאים עד אליו ואת כל התאים בתתי העצים השמאליים‬
‫ ונסכם את כל האיברים עד אליו ואת כל האיברים בתתי העצים הימניים‬x2 ‫במסלול עד ל‬
‫בסוף נסכם את הסכומים משני הצדדים ונחלק במספר‬.‫כמו כן נספור גם את כמות האיברים‬
‫האיברים משני הצדדים וכך קיבלנו ממוצע‬

B.
insert (a)
s<-create stack
start.insert(a, s)

insert(a,s)
while this.next < a //find where a should be
this <- this.next
while this.below != null //go down
s.push(this)
this <- this.below
while this.next < a //find where a should be
this <- this.next
next <- this.next.next
this.next <- create element(a, next)//second parameter for next
//pointer
while random > 0.5 //randomize number 50 precent chance
up <- s.pop
next <- up.next.next
up.next <- create element (a, next, this. next)//third
//parameter for below
this <- up//update this to be upper element

delete (a)
while this.next < a
this <- this.next
while this.below != null
if this.next = a//find the element a
s.push(this)//insert the element into the stack
this <- this.below
while this.next < a
this <- this.next
while (!s.is_empty)//iteratively erase all the element in the tower
this <- s.pop
next <- this.next.next
this.next <- next

Question 5
(Rearrange(T1, T2
‫ אז‬T1 =! NULL ‫אם‬
T2 ‫ ב‬T1 ‫מצא את השורש של‬
(* ‫ מוסבר למטה‬,‫והעלה אותו לשורש ראשי )בבעבוע‬
(Rearrange (T1.left, T2.left
(Rearrange (T1.right, T2.right
‫ מצביעים לצמתים‬T1, T2 ‫ כאשר‬//

‫•בעבוע‬

:‫ בצע‬X =! T1 ‫כל‬
2T -> X ‫ ב‬T1 ‫נחפש את השורש‬
'‫ למעלה לפי מקרים א' או ב‬X ‫העלה את‬

'‫מקרה ב‬ '‫מקרה א‬
Qusetion 6

pred(x)
x<-search(k)
//‫ אמור להיות‬K ‫ נמצא בו או איפה ש‬K ‫מחזיר מצביע ש‬
if x is a leaf
if x has left sibling
return x.leftsibiling
else
if x has left parent
return x.left_parent
else
return strictly_left_up_parent
else
rightest_lowest_sun(x.leftsun)

rightest_lowest_sun(x)
if x is leaf
if x has rightsibling
return x.rightestsibling
else
return x
else
return rightest_lowest_sun(x.rightest_sibling)

strictly_left_up_parent(x)
while(x.parent don’t have left sibling)
x<-x.parent
return left node //the left node that x is his right sun

greater(k)
h<-tree height // return tree height O(log n)
x<-root // points to the leftmost sun in level zero
i<-0
sval_max<-0
sval_min<-0
while(k!=x.value)
while(x.next!=null and x.next.value<k)
x<-x.next
sval_max<-sval_max+max(h-i)
sval_min<-sval_min+min(h-i)
I if (x!=k and x.right!=null)
x<-x.rigth_sun
‫‪i++‬‬
‫‪upperbound<-max_number_of_sun_in_level_zero * max(h)-sval_min‬‬
‫‪lowerbound<-min_number_of_sun_in_level_zero*min(h)sval_max‬‬

‫)‪ValueAt(i‬‬
‫)‪return root.valueAt(i,0‬‬

‫)‪valueAt(Index, j‬‬
‫‪k<-0‬‬
‫‪j<-j+A[k].size_of_left_sun‬‬
‫)‪while (j<index‬‬
‫‪k++‬‬
‫‪j<-j+1+A[k].size_of_left_sun‬‬
‫)‪if (j=i-1‬‬
‫‪return A[k].key‬‬
‫‪else‬‬
‫;)‪retuen A[k].left_sun.ValueAt(index, j‬‬

‫‪Qusetion 7‬‬

‫נחזיק שני עצי ‪,AVL‬‬


‫בראשון‪ :‬נחזיק את הערכים "האמיתיים" וגם‪ ,‬לכל צומת נחזיק ‪ Pointer‬ל ‪OBJ‬‬
‫)מוגדר בהמשך( וגם את סכום תתי העצים הימניים והשמאליים )בנפרד(‪ ,‬ובנוסף נחזיק גם‬
‫מספר הצמתים בתת העץ הימני והשמאלי )בנפרד(‬
‫בשני ‪ :‬נחזיק את האובייקט הבא ‪ OBJ‬עם המפתח ‪general_index‬‬
‫בנוסף נחזיק את המשתנים הבאים‬
‫משתנה אינדקס הכנסה כללי‪ ,‬מתעדכן בכל‬ ‫‪general_i‬‬
‫הכנסה‬
‫משתנה אינדקס הכנסה לא"ז‪ ,‬מתעדכן בכל‬ ‫‪odd_i‬‬
‫הכנסה של אי זוגי‬
‫משתנה אינדקס הכנסה לזוגיים‪ ,‬מתעדכן‬ ‫‪even_i‬‬
‫בכל הכנה של זוגיים‬

‫‪ OBJ‬מכיל את השדות‪:‬‬

‫אינדקס כללי של הכנסה‬ ‫‪general_index‬‬


‫אינדקס הכנסה של הא"ז‪ ,‬אם ‪ OBJ‬נבנה‬ ‫‪odd_index‬‬
‫עבור ערך זוגי ‪-odd_index = 1‬‬
‫אינדקס הכנסה של זוגיים‪ ,‬אם ‪ OBJ‬נבנה‬ ‫‪even_Index‬‬
‫עבור ערך א"ז ‪-even_index = 1‬‬
‫מצביע לאיבר המתאים בעץ ‪1‬‬ ‫‪pointer‬‬

‫‪()Init‬‬
‫מאתחל את שני העצים‪ ,‬ואת כל השתנים להיות אפס‪.‬‬
‫‪(Insert(x‬‬
‫בניית האובייקט ‪ OBJ‬עבור ‪(X ((1)O‬‬
‫הכנסת ‪ X‬לעץ הראשון ))‪ ,(O)logn‬הכנסה של ‪ OBJ‬לעץ ‪2‬‬
‫‪(Delete(x‬‬
‫חיפוש ‪ X‬בעץ מס ‪) 1‬ומציאת מצביע מתאים לעץ ‪ ,(2‬מחיקה של ה ‪OBJ‬‬
‫המתאים‪ .‬מחיקה של ‪.X‬‬
‫)העצים הם עצי ‪ AVL‬ולכן כל החיפוש ‪ +‬מחיקה ))‪(O(longn‬‬
‫‪(Delete_By_Index(i‬‬
‫חיפוש ‪ i‬בעץ מס ‪) 2‬ומציאת מצביע לאיבר התאים בעץ ‪ ,(1‬מחיקה מעץ ‪ .1‬מחיקה‬
‫מעץ ‪) .2‬מאותם סיבות גם זה ‪((O(logn‬‬
‫‪(Get_Index(x‬‬
‫חיפוש בעץ מס ‪ 1‬לפי ‪) ,X‬ומציאת מצביע לאיבר מתאים בעץ מס ‪(2‬‬
‫אם ‪ X‬זוגי החזר את ‪ even_Index‬אם ‪ X‬א"ז החזר את ‪odd_index‬‬
‫‪(Average(x1, x2‬‬
‫נבדוק את המסלולים של ‪ x1, x2‬ונסמן את נקודת הפיתול ב ‪.Z‬‬
‫נסכום את הערכים במסלול מ ‪ Z‬עד ‪ X1‬וגם של תתי העצים הימניים ובנוסף‬
‫נספור גם את מספר הצמתים שנבקר בהם וגם של תתי העצים הימניים‪ ,‬באותו אופן עבור‬
‫המסלול מ ‪ Z‬ל ‪ x2‬כאשר נסכום על תתי העצים השמאליים ‪ +‬צמתים‪ .‬ונחזיר את סכום‬
‫הערכים הכולל לחלק למספר הצמתים הכולל‪ ,‬וזהו הממוצע בין ‪ x1‬ל ‪.x2‬‬

Anda mungkin juga menyukai