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 ; i A[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
פתרון:
• נשתמש ברשימה דו-כיוונית
• בנוסף ,כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים
יותר (כולל האיבר עצמו)
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 ; i
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
פתרון:
• נשתמש ברשימה דו-כיוונית
• בנוסף ,כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים
יותר (כולל האיבר עצמו)