Transcript שאלה

Slide 1

4 ‫תרגול‬

ADTs: Array, Queue, Stack,
Linked List


Slide 2

‫ – מבנה נתונים אבסטרקטי‬ADT
:‫דוגמאות‬
A linear sequence of elements that supports access to its elements by their
indexes.
A vector ADT supports the following basic methods:
 elementAt(i) – returns the element at index i
 replaceAt(i, element) – replace and return the element that in index i
Vector
with new given element.
 insertAt(i, element) – insert new element at index i
 removeAt(i) – remove the element in index i
 size() – returns the size of the vector
 isEmpty() - returns true if the vector is empty


Slide 3

‫ – מבנה נתונים אבסטרקטי‬ADT
:‫דוגמאות‬
FIFO - First In First Out
ADT that supports the following operations:
Queue





Enqueue - insert new element at the tail of the queue
Dequeue - remove element from the head of the queue
isEmpty - returns true if the queue is empty

LIFO - Last In First Out
ADT that supports the following operations:
Stack





Push - add element to the head of the stack
Pop - remove element from the head of the stack
isEmpty - returns true if the stack is empty


Slide 4

‫ – מבנה נתונים אבסטרקטי‬ADT
:‫דוגמאות‬
Linked List

A data structure with linear access to the elements in it.
Each element has a pointer to the next element in the list

A data structure with linear access to the elements in it.
Doubly-Linked
Each element has 2 pointers, one to the next element in the list and
List
the other to the previous element

‫ מבני גישה אבסטרקטיים‬:‫הערה חשובה‬
.‫ניתן לממש בכמה דרכים שונות‬


Slide 5

1 ‫שאלה‬
.)‫ נתון‬n( ‫ איברים‬n ‫ קבוצה עם לכל היותר‬S •
.‫ ואין שני איברים עם אותו מפתח‬,[0…n-1] ‫• לכל איבר יש מפתח בתחום‬
:‫ התומך בפעולות הבאות בזמנים הנתונים‬O(n) ‫• מצאו מבנה נתונים בגודל‬

Init(n)

Operation

Time

Initialize S (S is an empty set at the beginning)

O(n)

isElement(k) Check if S has an element whose key equals to k

O(1)

Insert(x)

Add element x to S

O(1)

Remove(k)

Remove element whose key equals to k

O(1)

isEmpty()

Check if S is empty

O(1)

hasAll

Check if S contains all the elements whose keys are
O(1)
in the range [0...n-1]


Slide 6

1 ‫שאלה‬
)‫ בעזרת מיון ישיר (מערך‬:‫• פתרון‬

Init (n)
for (i=0 ; iA[i] = null;
count = 0;

...

1. Array A[1..n] of pointers to elements.
if A[k] == null, the element whose key is k is not in S.
2. count = number of elements in S
Null
Null
Null
Null
Null
Null

COUNT = 0

...


Slide 7

1 ‫שאלה‬
)‫ בעזרת מיון ישיר (מערך‬:‫• פתרון‬

isElement (k)
return (A[k] != null);

k-1
k
k+1

Null
Null
Null
Null
Null
Null

...

Insert (x)
If(!isElement (x.key){
A[x.key] = x;
count++; }

...

1. Array A[1..n] of pointers to elements.
if A[k] == null, the element whose key is k is not in S.
2. count = number of elements in S

0
COUNT = 1

X
Key=
k


Slide 8

1 ‫שאלה‬
)‫ בעזרת מיון ישיר (מערך‬:‫• פתרון‬
1. Array A[1..n] of pointers to elements.
if A[k] == null, the element whose key is k is not in S.
2. count = number of elements in S

Remove (k)
If(isElement (k){
A[k] = null;
count--; }

isEmpty ()
return (count == 0);
hasAll ()
return (count == n);


Slide 9

‫שאלה ‪2‬‬
‫שאלה‪ :‬הציעו כיצד לממש תור בעזרת ‪ 2‬מחסניות‪.‬‬
‫פתרון‪:‬‬
‫‪x‬‬

‫‪a‬‬

‫‪b‬‬
‫‪c‬‬
‫‪d‬‬


Slide 10

2 ‫שאלה‬
.‫ מחסניות‬2 ‫ הציעו כיצד לממש תור בעזרת‬:‫שאלה‬
:‫פתרון‬
Enqueue (x)
moveElements(A,B);
A.Push(x);
moveElements(B,A);
Dequeue ( )
element = A.Pop();
return element;

isEmpty ( )
return A.isEmpty();

moveElements(X,Y)
while (! X.isEmpty())
{
temp = X.Pop();
Y.Push(temp) ;
}


Slide 11

2 ‫שאלה‬
.‫ מחסניות‬2 ‫ הציעו כיצד לממש תור בעזרת‬:‫שאלה‬
:‫פתרון נוסף‬
Enqueue (x)
A.Push(x);

isEmpty ( )
return A.isEmpty();

Dequeue ( )
moveElements(A,B);
element = B.Pop();
moveElements(B,A);
return element;

moveElements(X,Y)
while (! X.isEmpty())
{
temp = X.Pop();
Y.Push(temp) ;
}


Slide 12

2 ‫שאלה‬
.‫ מחסניות‬2 ‫ הציעו כיצד לממש תור בעזרת‬:‫שאלה‬
:‫פתרון נוסף נוסף‬
Enqueue (x)
A.Push(x);

Dequeue ( )
If (B.isEmpty())
moveElements(A,B);
element = B.Pop();
return element;

isEmpty ( )
return ( A.isEmpty()
&& B.isEmpty());
moveElements(X,Y)
while (! X.isEmpty())
{
temp = X.Pop();
Y.Push(temp) ;
}


Slide 13

2 ‫שאלה‬
.‫ מחסניות‬2 ‫ הציעו כיצד לממש תור בעזרת‬:‫שאלה‬
:‫פתרון‬
Enqueue (x)
moveElements(A,B);
A.Push(x);
moveElements(B,A);
Dequeue ( )
element = A.Pop();
return element;

isEmpty ( )
return A.isEmpty();

moveElements(X,Y)
while (! X.isEmpty())
{
temp = X.Pop();
Y.Push(temp) ;
}


Slide 14

‫שאלה ‪3‬‬
‫שאלה‪ :‬נתונות ‪ 2‬רשימות מקושרות חד‪-‬כיווניות ‪ L1,L2‬עם זנב‬
‫משותף באורך ‪ ,k‬ורישות לא משותפות באורכים ‪ n‬ו‪.m‬‬
‫הראו כיצד ניתן למצוא את הקודקוד המשותף הראשון בזמן‬
‫)‪.O(m+n+k‬‬
‫‪m=4‬‬
‫דוגמא‪:‬‬
‫‪k=3‬‬

‫‪Null‬‬

‫‪Head 2‬‬
‫‪n=2‬‬

‫‪Head 1‬‬


Slide 15

‫שאלה ‪3‬‬
‫שאלה‪ :‬נתונות ‪ 2‬רשימות מקושרות חד‪-‬כיווניות ‪ L1,L2‬עם זנב‬
‫משותף באורך ‪ ,k‬ורישות לא משותפות באורכים ‪ n‬ו‪.m‬‬
‫הראו כיצד ניתן למצוא את הקודקוד המשותף הראשון בזמן‬
‫)‪.O(m+n+k‬‬
‫פתרון‪:‬‬
‫‪ .1‬מוצאים את האורך של ‪L1,L2‬‬
‫‪ .2‬ברשימה הארוכה‪ ,‬זזים קדימה את ההפרש‬
‫‪ .3‬כעת המרחק מהקודקוד המשותף שווה ב‪ 2‬הרשימות‪ .‬כל עוד‬
‫הרשימות לא התאחדו (קודקוד ראשון משותף)‪ ,‬זזים קודקוד ‪1‬‬
‫קדימה בשתי הרשימות‪.‬‬


Slide 16

‫שאלה ‪3‬‬
‫פתרון‪:‬‬
‫‪ .1‬מוצאים את האורך של ‪L1,L2‬‬
‫‪ .2‬ברשימה הארוכה‪ ,‬זזים קדימה את ההפרש‬
‫‪ .3‬כעת המרחק מהקודקוד המשותף שווה ב‪ 2‬הרשימות‪ .‬כל עוד הרשימות לא התאחדו‬
‫(קודקוד ראשון משותף)‪ ,‬זזים קודקוד ‪ 1‬קדימה בשתי הרשימות‪.‬‬

‫הדגמת הפתרון‪:‬‬

‫‪m=4‬‬
‫‪k=3‬‬

‫‪Null‬‬

‫‪Head 2‬‬
‫‪n=2‬‬

‫‪Head 1‬‬


Slide 17

‫שאלה ‪3‬‬
‫פתרון‪:‬‬
‫‪ .1‬מוצאים את האורך של ‪L1,L2‬‬
‫‪ .2‬ברשימה הארוכה‪ ,‬זזים קדימה את ההפרש‬
‫‪ .3‬כעת המרחק מהקודקוד המשותף שווה ב‪ 2‬הרשימות‪ .‬כל עוד הרשימות לא התאחדו‬
‫(קודקוד ראשון משותף)‪ ,‬זזים קודקוד ‪ 1‬קדימה בשתי הרשימות‪.‬‬

‫הדגמת הפתרון‪:‬‬
‫‪Current‬‬
‫‪Current Current‬‬

‫‪Current‬‬

‫‪Current‬‬

‫‪Current‬‬

‫‪Null‬‬

‫‪Current‬‬

‫‪Current‬‬

‫‪Head 2‬‬
‫‪Current‬‬

‫‪Current‬‬

‫‪Current Current‬‬

‫‪Length1 = 7‬‬
‫‪Length2 = 5‬‬

‫‪Current‬‬

‫‪Current‬‬

‫‪Head 1‬‬


Slide 18

‫שאלה ‪3‬‬
‫פתרון‪:‬‬
‫‪ .1‬מוצאים את האורך של ‪L1,L2‬‬
‫‪ .2‬ברשימה הארוכה‪ ,‬זזים קדימה את ההפרש‬
‫‪ .3‬כעת המרחק מהקודקוד המשותף שווה ב‪ 2‬הרשימות‪ .‬כל עוד הרשימות לא התאחדו‬
‫(קודקוד ראשון משותף)‪ ,‬זזים קודקוד ‪ 1‬קדימה בשתי הרשימות‪.‬‬

‫הדגמת הפתרון‪:‬‬
‫‪Current 1 Current 1‬‬

‫‪Null‬‬

‫‪Current 1‬‬

‫‪Head 2‬‬

‫‪Length1 – Length2 = 2‬‬

‫‪Current 2‬‬

‫‪Head 1‬‬


Slide 19

‫שאלה ‪3‬‬
‫פתרון‪:‬‬
‫‪ .1‬מוצאים את האורך של ‪L1,L2‬‬
‫‪ .2‬ברשימה הארוכה‪ ,‬זזים קדימה את ההפרש‬
‫‪ .3‬כעת המרחק מהקודקוד המשותף שווה ב‪ 2‬הרשימות‪ .‬כל עוד הרשימות לא התאחדו‬
‫(קודקוד ראשון משותף)‪ ,‬זזים קודקוד ‪ 1‬קדימה בשתי הרשימות‪.‬‬

‫הדגמת הפתרון‪:‬‬
‫‪Current 1‬‬

‫‪Current 1‬‬

‫‪Current 1‬‬
‫‪Null‬‬

‫‪Head 2‬‬

‫‪Current 2‬‬
‫‪Current 2‬‬

‫‪Current 2‬‬

‫‪Head 1‬‬


Slide 20

‫שאלה ‪4‬‬
‫שאלה‪ :‬בהינתן רשימה חד‪-‬כיוונית‪ ,‬הציעו דרך בה ניתן‬
‫לטייל קדימה ואחורה ברשימה בזמן )‪ ,O(1‬ע"י תוספת זכרון‬
‫של )‪ O(1‬בלבד‬
‫פתרון‪:‬‬
‫אי‪-‬אפשר להפוך את הרשימה לדו‪-‬כיוונית ‪ -‬זה )‪ O(n‬זיכרון‬
‫• נשתמש ב‪ 2‬מצביעים – ‪ current‬ו‪ prev‬שיצביעו על האיבר‬
‫הנוכחי וזה שבא לפניו‬
‫• כשנזוז קדימה ברשימה‪ ,‬נפנה ברשימה את המצביעים אחורה‬
‫• כשנזוז אחורה ברשימה‪ ,‬נחזיר את המצביעים קדימה‬


Slide 21

‫ הדגמה‬- 4 ‫שאלה‬
moveBackward()
temp=current;
current=prev;
prev=prev.next;
current.next=temp;

init()
current=head;
prev=null;
moveForward()
temp = prev;
prev=current;
curent=current.next;
prev.next=temp;
prev

Head

current

Temp


Slide 22

‫איחוד ‪( 3+4‬אם יש זמן)‬
‫שאלה‪ :‬נתונות ‪ 2‬רשימות מקושרות חד‪-‬כיווניות עם‬
‫זנב משותף באורך ‪ ,k‬ורישות לא משותפות באורכים‬
‫‪ n‬ו‪.m‬‬
‫הציעו דרך למצוא את הקודקוד המשותף הראשון של‬
‫‪ 2‬הרשימות‪ ,‬בזמן שאינו תלוי ב‪ ( .k‬הניחו ‪ m,n>0‬וכן‬
‫‪) k>>m,n‬‬
‫מה הזמן והמקום שדורש הפתרון שהצעתם דורש?‬


Slide 23

5 ‫שאלה‬
.nXn ‫) בגודל‬1 ‫ או‬0 ‫ מטריצה בוליאנית (ערכי‬A :‫שאלה‬
:‫תארו מבנה נתונים שתומך בפעולות הבאות בזמנים הנתונים‬
Operation

Time

init(n)

Initialize A with the value 1

O(n2)

flip(i,j)

A[i,j]=!A[i,j]

O(1)

hasRowOf1 Return true iff A has a row that contains only 1-s O(1)
hasRowOf0 Return true iff A has a row that contains only 0-s O(1)


Slide 24

5 ‫שאלה‬
:‫פתרון‬
‫ שמכיל את סכום‬,Sum ‫ גם מערך‬,‫ בנוסף למטריצה‬,‫• נשמור‬
.i-‫ = מספר האחדות בשורה ה‬Sum[i] ,‫ כלומר‬.‫האיברים בשורות‬
‫ מונים של מספר השורות המלאות ומספר‬2 ‫ נשמור‬,‫• בנוסף‬
.‫השורות ללא אחדות כלל‬
Operation

Time

init(n)

Initialize A with the value 1

O(n2)

flip(i,j)

A[i,j]=!A[i,j]

O(1)

hasRowOf1 Return true iff A has a row that contains only 1-s O(1)
hasRowOf0 Return true iff A has a row that contains only 0-s O(1)


Slide 25

‫שאלה ‪5‬‬
‫פתרון‪:‬‬
‫• נשמור‪ ,‬בנוסף למטריצה‪ ,‬גם מערך ‪ ,Sum‬שמכיל את סכום‬
‫האיברים בשורות‪ .‬כלומר‪ = Sum[i] ,‬מספר האחדות בשורה ה‪.i-‬‬
‫• בנוסף‪ ,‬נשמור ‪ 2‬מונים של מספר השורות המלאות ומספר‬
‫השורות ללא אחדות כלל‪.‬‬
‫• הדגמה‪:‬‬
‫;)‪Flip(2,3‬‬
‫‪1‬‬

‫‪COUNT_0 = 1‬‬
‫‪COUNT_1 = 1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪3‬‬

‫‪1‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪4‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬


Slide 26

‫שאלה ‪5‬‬
‫פתרון‪:‬‬
‫• נשמור‪ ,‬בנוסף למטריצה‪ ,‬גם מערך ‪ ,Sum‬שמכיל את סכום‬
‫האיברים בשורות‪ .‬כלומר‪ = Sum[i] ,‬מספר האחדות בשורה ה‪.i-‬‬
‫• בנוסף‪ ,‬נשמור ‪ 2‬מונים של מספר השורות המלאות ומספר‬
‫השורות ללא אחדות כלל‪.‬‬
‫• הדגמה‪:‬‬
‫;)‪Flip(2,3‬‬
‫‪1‬‬

‫‪COUNT_0 = 1‬‬
‫‪COUNT_1 = 2‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪4‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪4‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬


Slide 27

5 ‫שאלה‬
flip(i,j)
if (A[i][j]==0) {
A[i][j]=1;
if (Sum[i]=0)
count0- -;
Sum[i]++;
if (Sum[i]=n)
count1++; }
else {
A[i][j]=0;
if (Sum[i]=n)
count1- -;
Sum[i]--;
if (Sum[i]=0)
count0++; }

:‫קוד‬
init()
fill A with 1’s
fill Sum with n.
count1=n
count0=0

hasRowOf1()
return count1>0
hasRowOf0()
return count0>0


Slide 28

‫שאלה ‪7‬‬
‫נגדיר "מחסנית מינימום" כמבנה נתונים התומך בפעולות הבאות‪:‬‬
‫• )(‪ –Create‬אתחול מבנה הנתונים‪.‬‬
‫• )‪ –Insert(x‬הכנסת איבר ‪ x‬למבנה‪.‬‬
‫• )(‪ –RemoveLast‬הוצאת האיבר שהוכנס אחרון‪.‬‬
‫• )(‪ –Min‬החזרת הערך של האיבר הקטן ביותר במבנה (ללא הוצאתו)‪.‬‬
‫• )‪ –ChangeMin(k‬שינוי ערך האיבר הקטן ביותר במבנה ל – ‪.k‬‬
‫הנחה‪ :‬כל האיברים שונים זה מזה‪.‬‬
‫הציעו מימוש ל"מחסנית מינימום"‪ ,‬כאשר‬
‫סיבוכיות הזמן הנדרשת לארבע הפעולות הראשונות היא )‪,O(1‬‬
‫וסיבוכיות הזמן הנדרשת ‪ ChangeMin‬היא )‪,O(t‬‬
‫כש – ‪ t‬הינו מספר האיברים במבנה שהוכנסו אחרי האיבר המינימלי (הכוונה‬
‫לאיבר המינימלי לפני שהפעולה ‪ ChangeMin‬בוצעה)‪.‬‬


Slide 29

‫שאלה ‪7‬‬
‫נגדיר "מחסנית מינימום" כמבנה נתונים התומך בפעולות הבאות‪:‬‬
‫• )(‪ –Create‬אתחול מבנה הנתונים‪.‬‬
‫• )‪ –Insert(x‬הכנסת איבר ‪ x‬למבנה‪.‬‬
‫• )(‪ –RemoveLast‬הוצאת האיבר שהוכנס אחרון‪.‬‬
‫• )(‪ –Min‬החזרת הערך של האיבר הקטן ביותר במבנה (ללא הוצאתו)‪.‬‬
‫• )‪ –ChangeMin(k‬שינוי ערך האיבר הקטן ביותר במבנה ל – ‪.k‬‬
‫הנחה‪ :‬כל האיברים שונים זה מזה‪.‬‬
‫פתרון‪:‬‬
‫• נשתמש ברשימה דו‪-‬כיוונית‬
‫• בנוסף‪ ,‬כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים‬
‫יותר (כולל האיבר עצמו)‬


Slide 30

‫שאלה ‪7‬‬
‫פתרון‪:‬‬
‫• נשתמש ברשימה דו‪-‬כיוונית‬
‫• בנוסף‪ ,‬כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים‬
‫יותר (כולל האיבר עצמו)‬
‫הדגמה‪:‬‬

‫‪head‬‬

‫‪6‬‬

‫‪10‬‬

‫‪15‬‬

‫‪3‬‬

‫‪7‬‬

‫‪5‬‬


Slide 31

‫שאלה ‪7‬‬
‫פתרון‪:‬‬
‫• נשתמש ברשימה דו‪-‬כיוונית‬
‫• בנוסף‪ ,‬כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים‬
‫יותר (כולל האיבר עצמו)‬
‫הדגמה‪:‬‬
‫אם נבצע )‪ ,ChangeMin(12‬כיצד ישתנו החיצים?‬

‫‪head‬‬

‫‪4‬‬

‫‪10‬‬

‫‪15‬‬

‫‪12‬‬

‫‪7‬‬

‫‪5‬‬


Slide 32

‫שאלה ‪7‬‬
‫פתרון‪:‬‬
‫• נשתמש ברשימה דו‪-‬כיוונית‬
‫• בנוסף‪ ,‬כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים‬
‫יותר (כולל האיבר עצמו)‬