מבני נתונים מופשטים בסיסיים רשימה a1 , a2 ,....,an : n = 0 רשימה ריקה a a a לפני משמעויות : ראשון : 1 אחרון : 2 מקום : i מבנה נתונים a i 1 : L:LIST P:POSITION המקום האחרי - אחרון (END(L : פעולות :  יתכנו הרבה  אנחנו מעניינים.

Download Report

Transcript מבני נתונים מופשטים בסיסיים רשימה a1 , a2 ,....,an : n = 0 רשימה ריקה a a a לפני משמעויות : ראשון : 1 אחרון : 2 מקום : i מבנה נתונים a i 1 : L:LIST P:POSITION המקום האחרי - אחרון (END(L : פעולות :  יתכנו הרבה  אנחנו מעניינים.

‫מבני נתונים מופשטים בסיסיים‬
‫רשימה‪a1 , a2 ,....,an :‬‬
‫‪n = 0‬רשימה ריקה‬
‫‪a‬‬
‫‪a‬‬
‫‪ a‬לפני‬
‫משמעויות‪ :‬ראשון‪:‬‬
‫‪1‬‬
‫אחרון‪:‬‬
‫‪2‬‬
‫מקום‪:‬‬
‫‪i‬‬
‫מבנה נתונים‬
‫‪a‬‬
‫‪i 1‬‬
‫‪:‬‬
‫‪L:LIST‬‬
‫‪P:POSITION‬‬
‫המקום האחרי‪-‬אחרון‪(END(L‬‬
‫‪:‬‬
‫פעולות‪:‬‬
‫‪ ‬יתכנו הרבה‬
‫‪ ‬אנחנו מעניינים בישום השמטת כפולים‬
‫‪ ‬צריך‪ :‬מציאת ראשון‪ ,‬סריקה‪ ,‬קריאה‪ ,‬השמטה‪.‬‬
: ‫פעולות‬
1. INSERT (X, P, L)
: ‫ ברשימה‬P ‫אם יש‬
a1, a2,…..,ap-1, x, ap,….,an
(P=END(L :‫אם‬
a1, a2,…..,an,x
Undefined‫אחרת‬
:
2. LOCATE(X, L)
x.‫מקום ראשון של‬
(END(L‫אם לא מופיע‬
3. RETRIEVE (P,L)
- L.‫ נמצא ב‬P ‫מוגדר רק אם‬
4. DELETE(P,L)
a1, a2,…..,an
a1, a2,…..,ap-1,ap+1,….,an
-L.‫ ב‬P ‫מוגדר רק אם‬
5. NEXT(P,L), PREVIOUS(P,L)
‫מוגדר טבעי‬
6. MAKENULL(L)
7. FIRST(L)
‫ישום השמטת כפולים‬
Procedure PURGE (Var L:LIST)
Var
p,q: Position
{p = Current, q = Search}
begin
(1)
p:= FIRST(L)
(2)
while p<>END[L] do begin
(3)
q:= NEXT(P,L)
(4)
while q<>END(L) do
(5)
if same (RET(p,L), RET(q,L))
(6)
then DELETE(q,L)
(7)
else
(8)
q:= NEXT(q,L)
(9)
p:= NEXT(p,L)
‫אינו מקודם‬q
end;
‫כי הרשימה‬
end; {PURGE}
.‫התכווצה‬
‫ישומים של מבנה הנתונים‬
)‫ רשימה מקושרת (סמנים‬,‫מערך‬
‫ישום במערך‬
1st element
2nd “
last
‫רשימה‬
Last element
‫ריק‬
Maxlength
Const
maxlength = 99
type
LIST = record
elements: array[1..maxlength] of element type;
last: integer
end;
Position: integer;
function END(var L:LIST): Position
begin
returm(L.Last+1)
end;
‫ישום ברשימה מקושרת (רגילה)‬
‫‪a2‬‬
‫‪an‬‬
‫‪a1‬‬
‫‪header‬‬
‫‪LIST‬‬
‫‪POS3‬‬
‫)‪POS.END(L‬‬
‫‪POS2‬‬
‫‪ ‬כל תא מורכב מ‪:‬‬
‫ ערך האיבר‬‫מצביע לאיבר הבא‬‫‪ ‬ממוש עם מצביעים‬
‫‪ ‬תשומת לב ‪: Position‬על האיבר “שלפני”‪.‬‬
‫ ערך האיבר במקום ‪ P‬הינו‪:‬‬‫‪P .next .element‬‬
‫‪-‬למה ‪ :‬כדי לבצע ‪ DELETE‬יעיל‪.‬‬
‫‪POS1‬‬
:‫הגדרת הרשימה‬
type
celltype = record
element: elementtype;
next:celltype;
end
LIST = celltype
Position = celltype
: ‫בצוע לא יעיל‬
END[L]
)‫(צריך לרוץ על כל הרשימה‬
Function END (L:LIST) : position ;
{returns a pointer to the last cell of L }
Var
q: position
begin
Q:= L ;
while q . next < > nil do
q:= q  . next ;
return (q) ;
end ; (END)
‫ישום רשימות באמצעות סמנים‬
‫)‪(CURSORS‬‬
‫• שימוש באינדקסים‬
‫(בתוך מערך) במקום מצביעים‪.‬‬
‫‪1‬‬
‫‪H‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪L‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪next‬‬
‫‪element‬‬
‫• מאחסנים כמה רשימות ( ‪ +‬רשימת פנויים)‬
‫• אחרון מצביע על ‪.0‬‬
‫• ריקה ‪ -‬כששם האחרון מצביע על ‪.0‬‬
‫‪R‬‬
:‫דוגמה‬
L
M
5
1
Avail
9
1
n
7
2
-
4
3
s
0
4
-
0
5
y
8
6
-
2
7
o
0
8
e
3
9
-
10
10
-
11
6
11
L: y, e, s
M: n, o
Avail: 9, 10, 11, 6, 2, 4
‫הוספת והשמטת איברים‬
)‫(מרשימת הפנויים‬
DELETE
INSERT
MOVE .‫צריך‬
‫בצוע הזזה‬
‫שים לב‪ :‬כמו ברשימות מקושרות התייחסותנו לתא‬
‫היא דרך המצביע עליו!!!!‬
‫העברת התא ”‪ “p‬לפני התא‪“q”:‬‬
‫‪3‬‬
‫‪p‬‬
‫‪4‬‬
‫‪2‬‬
‫‪q‬‬
‫‪1‬‬
‫‪temp‬‬
‫התא ש ‪- p‬מצביע עליו יזוז לפני התא‬
‫ש ‪-q‬מצביע עליו‪.‬‬
‫שיטה‪( :‬לא לאבד תאים)!‬
‫א) לסמן ב‪temp‬‬
‫ב) להעביר סמנים שניתן לשחרר‪.‬‬
‫השוואת יישומים‬
‫סמנים‬
‫קריטריון‬
‫מערך‬
‫מקושרת‬
‫גודל מקסימלי‬
‫מוגבל‬
‫“לא מוגבל”‬
‫‪INS/DEL‬‬
‫‪(N)‬‬
‫‪(1)‬‬
‫‪(1)‬‬
‫‪PREVIOUS‬‬
‫‪(1)‬‬
‫‪(N)‬‬
‫‪(N)‬‬
‫‪END‬‬
‫‪(1)‬‬
‫”‪“(N)‬‬
‫”‪“(N)‬‬
‫‪Position‬‬
‫ישיר‬
‫משתנה (יחסי)‬
‫משתנה (יחסי)‬
‫נצילות מקום‬
‫מבוזבז‬
‫“לא מבוזבז”‬
‫מבוזבז “פחות”‬
‫דרישת מקום‬
‫מקום * ‪ 1‬מקום ‪ +‬מצביעים מקום ‪ +‬סמנים‬
‫מוגבל‪/‬בסה”כ‬
‫רשימה מקושרת כפולה‬
:‫מגבלות מקושרת רגילה‬
(END(L ‫מציאת סוף‬1.
)‫ ללכת הפוך‬PREVIOUS (‫מציאת קודם‬2.
‫מבלבל‬3. Position
‫ מקושרת כפולה‬:‫פתרון‬
X
Y
Z
type
celltype = record
element: elementtype;
next, previous:celltype;
end ;
Position = celltype
DELETE‫פשטות ביצוע‬
‫ישום התחלה וסוף‪:‬‬
‫אפשרות א‪’:‬‬
‫איבר ראשון ואחרון מצביעים על‪NIL.‬‬
‫‪HEAD‬‬
‫אפשרות ב‪’:‬‬
‫סגירה מעגלית (הצבעה על) ‪HEAD‬‬
‫‪HEAD‬‬
‫השוואת רשימה כפולה לרגילה‬
‫יתרונות‬
‫• קלות בהליכה אחורנית‬
‫• קלות במציאת הסוף‬
‫• פשטות בהתייחסות למקום‬
‫חסרונות‬
‫• פי שניים מקום וזמן‪.‬‬
‫מבני רשימות מיוחדים‬
‫מחסנית‪STACK‬‬
‫• ניתן לגשת רק לראש‪.‬‬
‫•‪LIFO‬‬
‫• דוגמה‪ :‬מחסנית רובה‬
‫ניירות על השולחן‬
‫פעולות‪:‬‬
‫)‪1. MAKE NULL (S‬‬
‫)‪2. TOP (S‬‬
‫)‪3. POP (S‬‬
‫)‪4. PUSH (S‬‬
‫)‪(TRUE | FALSE‬‬
‫)‪5. EMPTY (S‬‬
‫ישומים‪:‬‬
‫• כל הרשימות בהגבלת טיפול רק בהתחלה‪.‬‬
‫• רשימות מקושרות או סמנים‪ :‬בסדר‪.‬‬
‫• מערך ‪ -‬בסדר‪ .‬אבל בעיות יעילות‪.‬‬
‫( כל הכנסה והוצאה‪(O(N ) :‬‬
‫ייעול ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪1st‬‬
‫‪TOP‬‬
‫‪2nd‬‬
‫‪:‬‬
‫‪Last Element‬‬
‫‪MAXLENGTH‬‬
‫‪Type‬‬
‫‪STACK = record‬‬
‫‪top: integer‬‬
‫]‪elements: array [1…MAXL] of element type‬‬
‫; ‪end‬‬
‫שימושים ‪:‬ברקורסיות‬
‫ישום פעולות‪ :‬פשוט‪ .‬לבצע לבד‪.‬‬
Queue‫תור‬
‫• סוג מיוחד של רשימה‬
FIFO•
- FRONT .‫יוצאים ב‬- REAR , ‫• נכנסים ב‬
F
R
:‫פעולות‬
1) MAKENULL (Q)
2) ENDQUEUE (X,Q) : INSERT (X,END (Q),Q)
3) FRONT (Q) : RET (FIRST (Q), Q)
4) DEQUEUE (Q) : DELETE (FIRST (Q), Q)
5) EMPTY (Q) : TRUE | FALSE
‫ישום‬
‫• כל היישומים הקודמים עובדים (רשימות)‬
‫• ליתר יעילות‪ :‬יישום מיוחד‪.‬‬
‫‪ +‬צריכים לגשת לסוף‬
‫‪+‬יישום ברשימה מקושרת חד כיוונית‪.‬‬
‫• איבר אחד ריק (נוחיות טיפול‬
‫ברשימה ריקה)‬
‫• מצביעים על התחלה וסוף‪.‬‬
‫‪TYPE‬‬
‫‪QUEUE : Record‬‬
‫‪front, rear :  celltype‬‬
:‫דוגמאות לפעולות‬
MAKENULL (Q)
F
R
Q
F= R
EMPTY
ENQUEUE (X)
F
R
X
ENQUEUE (Y)
F
R
X
Y
DEQUEUE (Q)
F
R
Y
‫יישום תור במערך (מעגלי)‬
‫‪2‬‬
‫‪N‬‬
‫‪1‬‬
‫‪1‬‬
‫‪N‬‬
‫‪2‬‬
‫‪Q.FRONT‬‬
‫‪QUEUE‬‬
‫ ‪REAR, FRONT‬נעים עם השעון‬‫ ‪FRONT‬על ראשון ‪, REAR -‬על אחרון‬‫‪F = R ‬איבר בודד‬
‫‪ F = R + 1 ‬ריק‬
‫‪ F = R + 2 ‬מלא‬
‫שימו לב‪ :‬ניתן להכניס רק ‪ N-1‬איברים!!!!!!‬
‫עבור כל ‪ F‬יש רק ‪ N‬אפשרויות ל ‪- R‬ולכן ניתן לייצג רק ‪:‬‬
‫‪0,1,2,……., N-1‬‬
‫‪Q.REAR‬‬
‫ישום פעולות תור מעגלי‪:‬‬
‫פשוט‪ .‬לבצע לבד‪.‬‬
‫‪Mapping‬עמודים ‪AHO.61-65‬‬
‫שמוש מחסנית לבצוע רקורסיות‬
‫• בצוע קריאה לסברוטינה רגילה‪:‬‬
‫‪‬‬
‫גורם במחשב לשימור‬
‫המשתנים וכתובת חזרה‪,‬‬
‫ואז קפיצה לשגרה‪.‬‬
‫• בצוע חזרה מסברוטינה רגילה‬
‫‪‬‬
‫קריאת המשתנים ועדכונם‬
‫וחזרה לכתובת החזרה‬
‫‪Subroutine B‬‬
‫‪Prog A‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪i =9‬‬
‫‪i = 15‬‬
‫‪.‬‬
‫‪Call B‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪return‬‬
‫‪.‬‬
‫סברוטינות רקוקסיביות‬
‫עקרון דומה ‪ -‬אך הקפיצה היא לאותה שגרה‪.‬‬
‫יכול לקפוץ הרבה‬‫פעמים (“לא חסום(”‬
‫פתרון‪ :‬שמור המשתנים וכתובת החזרה‬
‫בתוך‪STACK.‬‬
‫בכל קריאה לרקורסיה‪:‬‬
‫הכנסת משתנים וכתובת‪-(PUSH(S‬‬
‫חזרה למחסנית‬
‫בכל חזרה מרקורסיה‪:‬‬
‫הוצאת משתנים והכתובת‪(POP(S‬‬
‫מהמחסנית ועדכון ‪.‬‬
‫בצוע חזרה לפי כתובת החזרה‪.‬‬
‫ישום רקורסיה בשפה שאין רקורסיה‬
‫• נבצע אותו הדבר‪ ,‬אבל בעצמנו‪.‬‬
‫• נחזיק ‪ STACK‬שבו‪:‬‬
‫)‪1‬כל המשתנים הלוקאלים‪.‬‬
‫)‪2‬כתובת חזרה‪.‬‬
‫)‪3‬פרמטרי הקריאה‪ .‬ערכם מוחזרים‪.‬‬
‫(לא הכרחי)‬
‫)‪Function FACT(N‬‬
‫‪(1) If N <= 1 then‬‬
‫)‪return (1‬‬
‫‪(2) ELSE begin‬‬
‫)‪M:= FACT(N-1‬‬
‫)‪(3‬‬
‫)‪Return(N*M‬‬
‫)‪(4‬‬
‫‪(5) END‬‬
‫ישום לולאה באמצעות רקורסיה‬
‫‪While X do‬‬
‫)‬
‫( ‪SUBROUTINE WHILE‬‬
‫‪IF X then do begin‬‬
‫) ( ‪CALL WHILE‬‬
‫‪ELSE RETURN‬‬
‫‪END‬‬
‫תשומת לב‪:‬‬
‫כל המשתנים שמשתנים במשך הלולאה‬
‫וערכם הקודם משומש בלולאה הבאה‬
‫צריכים להגיע כפרמטרים או כגלובאלים‪.‬‬
‫‪‬‬
‫טבלאות דינאמיות‬
‫)‪(cormen 18.4 , p.367‬‬
‫• מתאים ל ‪- STACK, QUEUE‬‬
‫בישום מערך‪.‬‬
‫• יתאים גם ל‪HASH, HEAP‬‬
‫מטפל בבעיית חוסר המקום‪,‬‬
‫שנוצר דינאמית במבנה מבוסס‬
‫מערך‪.‬‬
‫דוגמה ‪:‬מחסנית מבוססת מערך ‪-‬‬
‫מה עושים כשמתמלאת?‬
‫פתרון( ‪:‬אלגוריתם)‪( :‬שיטת ההכפלה)‪Doubling‬‬
‫)‪1‬הקצה מקום מסויים לטבלה (פשוט)‪: N2i‬‬
‫)‪2‬כשהמקום מתמלא והטבלה מכילה ‪N‬‬
‫אלמנטים‪:‬‬
‫א) הקצה מקום חדש לטבלה בגודל ‪N2N‬‬
‫ב) העתק איברים לטבלה החדשה‪.‬‬
‫ג) שחרר טבלה ישנה‪.‬‬
‫סבוכיות‬
‫)‪1‬עבור פעולת )‪PER OPERATION) : INSERT‬‬
‫• אם אין הכפלה‪(O(1‬‬
‫• אם יש הכפלה‪(O(N‬‬
‫)‪2) AMORIZED ANALYSIS CORMEN 356-363) AMORTIZED COST‬‬
‫• חשוב זמן ממוצע פר פעולה במקרה הגרוע ביותר‪.‬‬
‫• שווה ל ‪: T(n)/n ,‬כאשר ‪ (T(n‬הוא סכום הפעולות על ‪ n‬איברים‪.‬‬
‫• שיטת ההתחשבנות)‪(ACCOUNTING‬‬
‫• מחשבנים לפעולה עלות מסויימת‪.‬‬
‫• עשויה להיות גבוהה או נמוכה ממה שעולה‪.‬‬
‫• כשהעלות המחושבת גבוהה מהעלות בפועל שומרים ‪Credit‬‬
‫לעצמים (איברים) אחרים‪.‬‬
‫‪3) Amortized Complexity‬של שיטת ה‪- Doubling :‬‬
‫א) חישוב ישיר‪:‬‬
‫עלות כוללת של ‪ n‬איברים‪:‬‬
‫• ‪ n‬הכנסות‪.‬‬
‫• העברות‪:‬‬
‫‪1+2+4+8+ … + n‬‬
‫‪= 2n-1‬‬
‫‪(T(n)=O(n‬‬
‫‪‬‬
‫יותר מדויק‪- T(n)=3n‬‬
‫עלות מהוונת)‪(Amortized‬‬
‫‪T(n)/n = 3‬‬
‫ב) חישוב בשיטה החשבונאית)‪(accounting‬‬
‫הכנסת‬
‫איבר‬
‫‪n‬‬
‫‪n/2‬‬
‫בעת הכנסת איבר מחשבים לו‬
‫עלות ‪3‬‬
‫ ‪1‬עבור הכנסתו‪.‬‬‫ ‪1‬עבור העברתו בהעברה הבאה‪.‬‬‫ ‪1‬כ”תרומה לחבר” (אחד מה ) ‪- n/2‬‬‫עבור העברתו בהעברה הבאה‪.‬‬
‫עצים‪Trees‬‬
‫עץ = מבנה הררכי‬
‫הגדרה רקורסיבית‪:‬‬
‫‪1.‬צומת בודד‪ .‬זהו גם שורש העץ‪.‬‬
‫‪2.‬אם ‪ n‬הוא צומת ו ‪ T1….TK‬הינם עצים‪ ,‬ניתן‬
‫לבנות‬
‫עץ חדש שבו ‪ n‬השורש ו ‪ T1….TK‬הינם“ תתי‬
‫עצים‪”.‬‬
‫‪n‬‬
‫‪TK‬‬
‫‪...‬‬
‫‪TK‬‬
‫מושגים‪:‬‬
‫צומת‪= Node‬‬
‫עץ‪= Tree‬‬
‫שורש‪= Root‬‬
‫תת‪-‬עץ‪= Subtree‬‬
‫‪T1‬‬
‫‪T1‬‬
‫‪n‬‬
‫דוגמה‪ :‬פרקים וסעיפים בספר‬
‫‪book‬‬
‫‪c3‬‬
‫‪c2‬‬
‫‪c1‬‬
‫‪s1.1 s1.2 s1.3 s2.1 s2.2 s3.1‬‬
‫‪book‬‬
‫‪c1‬‬
‫‪s1.1‬‬
‫‪s1.2‬‬
‫‪s1.3‬‬
‫‪c2‬‬
‫‪s2.1‬‬
‫‪s2.2‬‬
‫‪c3‬‬
‫‪s3.1‬‬
‫מושגים‪:‬‬
‫ ‪book‬הורה( ‪/Parent‬אבא) של‪c1, c2, c3‬‬‫‪c1, c2 -‬ילדים ‪/children‬של‪book‬‬
‫ ‪s2.1‬צאצא( ‪/Descendant‬לא ישיר) של‪book‬‬‫ ‪n1, n2,…nk‬מסלול ‪/Path‬‬‫אם כ”א הורה של הקודם)‬
‫(‬
‫אורך המסלול = מס’ הקשתות‬
‫מס’ הצמתים (פחות אחד)‬
‫=‬
‫צומת ללא ילדים = עלה‪/Leaf‬‬
‫‪n1 -‬אב קדמון ‪/Ancestor‬של‪nk‬‬
‫תת‪-‬עץ ‪ -‬צומת עם כל צאצאיו‬
‫גובה העץ ‪ -‬אורך המסלול הארוך ביותר מהשורש‬
‫לעלה)‪. (height‬‬
‫עומק צומת ‪ -‬אורך המסלול מהצומת לשורש‪.‬‬
‫)‪(depth‬‬
‫סדר בצמתים‬
‫בד”כ ‪ -‬משמעות לסדר הילדים‪ .‬מסדרים משמאל לימין‪.‬‬
‫‪a‬‬
‫‪b‬‬
‫‪a‬‬
‫‪C‬‬
‫‪C‬‬
‫אם הסדר לא חשוב ‪ -‬עץ לא מסודר‬
‫)‪(unordered tree‬‬
‫‪b‬‬
‫צורות ססטמיות לסריקת הצמתים בעץ‬
‫‪Preorder , postorder , Inorder‬‬
‫הגדרה רקורסיבית‪:‬‬
‫• אם ‪ T‬הוא ריק ‪ -‬אזי הרשימה הריקה היא ‪Preorder‬‬
‫)‪(POST, IN‬‬
‫• אם ‪ T‬היא צומת בודד )‪ (n‬אזי הרשימה הבנויה מ ‪- n‬הינה‬
‫)‪Post,In) .Preorder‬‬
‫• אחרת אם ‪ T‬הוא עץ עם שורש ‪ n‬ותתי עצים ‪ T1,…,Tk‬אזי‪:‬‬
‫‪: PREORDER‬‬
‫)‪n, PRE(T1(, … , PRE)TK‬‬
‫‪: POST‬‬
‫‪POST (T1(, … , POST )TK), n‬‬
‫‪: IN‬‬
‫)‪IN(T1), n , IN(T2(, … ,IN)TK‬‬
Procedure PREORDER (n: node)
(1) list n ;
(2) for each child c of n, in order from
left do:
PREORDER (C)
end ;
.‫ בבית‬POSORDER, INORDER ‫להשלים כתיבת‬
1
:‫דוגמה‬
2
4
3
7
5
8
6
1,2,3,4,5,6,7,8
: PRE
3,2,5,4,6,1,7,8
: IN
3,5,6,4,2,7,8,1
: POST
‫שיטה למספור‪:‬‬
‫הקף העץ בכיוון הפוך לשעון‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪3‬‬
‫‪8‬‬
‫‪6‬‬
‫‪PRE:‬סמן צומת בפעם הראשונה‪.‬‬
‫‪IN :‬סמן עץ בפעם הראשונה‪.‬‬
‫סמן צומת פנימי בפעם השניה‪.‬‬
‫‪POST:‬סמן צומת בפעם האחרונה‪.‬‬
‫‪5‬‬
‫עצים מסומנים ועצי ביטויים‬
‫)‪(Labeled Trees, Expression Trees‬‬
‫עצים מסומנים‪ :‬מסמנים את הצומת בסימון כלשהוא‪.‬‬
‫עצי ביטויים‪ :‬העץ מייצג ביטוי מתמטי‪.‬‬
‫דוגמה‪:‬‬
‫)‪= (a+b)*(c+d‬‬
‫*‬
‫‪n1‬‬
‫‪+‬‬
‫‪+‬‬
‫‪n3‬‬
‫‪d‬‬
‫‪n7‬‬
‫‪n2‬‬
‫‪c‬‬
‫‪n6‬‬
‫‪b‬‬
‫‪n5‬‬
‫‪a‬‬
‫‪n4‬‬
‫חוקיות הביטוי בעץ ביטויים‪:‬‬
‫‪1.‬כל עלה מסומן באופרנד‪.‬‬
‫‪2.‬צומת פנימי מסומן בפעולה( אופרטור)‬
‫בינארי ו ‪- E1,E2‬הינם ערכי הביטויים‬
‫ואם האופרטור‬
‫המבוטאים ע”י תתי העץ אזי הביטוי הוא ‪:‬‬
‫‪E2‬‬
‫‪3.‬אופרטור אונרי ‪ -‬ילד יחידי‪.‬‬
‫‪E1‬‬
‫סדר הסריקה של עצי ביטוי קובע יצוג שונה של הביטוי ‪-‬‬
‫ ‪1. Inorder‬היצוג הרגיל)‪(a+b)*(c+d‬‬‫( ‪2. Postorder‬פולני )‬
‫‪ab + cd + ‬‬
‫‪d‬‬
‫(‬
‫מחשבוני)‪HP‬‬
‫(‬
‫אין כפל משמעות)!!‬
‫שימוש במספור לאינפורמציה שושלת‬
‫אם ‪POST :‬‬
‫‪112‬‬
‫‪X‬‬
‫)‪Y= desc(x‬‬
‫‪y‬‬
‫‪50‬‬
‫צמתים‬
‫‪63-112‬‬
‫)‪Post(x) - #desc(x) <= Post(y) <= Post(x‬‬
‫מבנה נתונים אבסטרקטי של עץ‬
‫פעולות שיעניינו אותנו‪:‬‬
‫(‪1. PARENT (N, T‬החזר את אבא של ‪ n‬ב‪T.‬‬‫אם ‪ n‬הוא השורש החזר‪Nil.‬‬
‫(‪2. LEFTMOST_CHILD(n, T‬החזר הבן‬‫השמאלי ביותר של ‪ n‬בעץ ‪ Nil. T‬אם ‪ n‬עלה‪.‬‬
‫ (‪3. RIGHT_SIBLING(n, T‬‬‫אח ימני של ‪ n‬ב ‪ Nil. T‬אם אין‪.‬‬
‫ (‪4. LABEL(n, T‬סימון ‪ n‬ב ‪T.‬‬‫( לא נדרש תמיד‪).‬‬
‫ (‪5. CREATi(r, T1,…Ti‬יוצר עץ חדש‬‫עם שורש ‪ r‬שבו‪:‬‬
‫א ‪) r‬השורש מסומן ב‪U‬‬
‫ב) ל ‪ r‬יש ‪ i‬בנים ‪, i‬תתי עצים‪. T1,…Ti‬‬
‫עץ עם שורש‪r.‬‬
‫מחזיר‬
‫‪i=0‬‬
‫‪r‬גם שורש וגם עלה‪.‬‬
.‫ אם ריק‬Nil ‫החזרת השורש או‬6. ROOT(T -(
T.‫יוצר את העץ הריק‬7. MAKENULL(T -(
ADT‫ בעזרת ה‬PREORDER ‫ כתיבת‬:‫דוגמה‬
Procedure PREORDER (n: node)
{list the descendants of n in PREORDER}
var c: node;
Begin
print (LABEL (n, T))
c := LEFTMOST_CHILD(n, T);
while c <> Nil do begin
PREORDER(c);
c := RIGHT_SIBLING(c, T)
end;
end; {PREORDER}
‫כתיבה לא רקורסיבית של‪PREORDER‬‬
‫• נלך במורד העץ שמאלה ככל שנוכל‬
‫•כשלא ניתן נעבור לאח הימני של הצומת האחרון‬
‫אם אין ‪ -‬נעלה למעלה ונזוז לאחיו הימני‬
‫‪1‬‬
‫‪2‬‬
‫‪9‬‬
‫‪8‬‬
‫‪3‬‬
‫‪7‬‬
‫‪6‬‬
‫‪4‬‬
‫‪5‬‬
‫בצוע וישום‪:‬‬
‫• נחזיק מחסנית ובה נאחסן בכל רגע את‬
‫המסלול‬
‫מהשורש עד לצומת שבה אנו מבקרים‪.‬‬
‫מחסנית ‪ ‬רקורסיה‬
‫ישום עצים שרירותיים‬
‫כל צומת מכילה ‪ 3‬מצביעים‪:‬‬
‫בן שמאלי‬‫אח ימני‬‫‪-‬הורה‬
‫(אופציונלי)‬
‫‪a‬‬
‫‪c‬‬
‫‪d‬‬
‫‪g‬‬
‫‪b‬‬
‫‪f‬‬
‫ניתן לחשב באמצעות מצביעים או באמצעות‪Cursors‬‬
‫‪e‬‬
‫עצים בינאריים‬
‫עץ ריק או לכל צומת יש תת קבוצה של‬‫{ ילד ימני‪ ,‬ילד שמאלי}‬
‫דוגמא‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪5‬‬
‫‪6‬‬
‫‪1‬‬
‫‪4‬‬
‫‪2‬‬
‫‪5‬‬
‫‪3‬‬
‫‪7‬‬
‫‪6‬‬
‫‪4‬‬
‫‪3‬‬
‫‪7‬‬
‫הנ”ל‪:‬‬
‫זהים בעצים מסודרים‬‫שונים בעצים בינאריים‬‫סדרי סקירה‪:‬‬
‫ ‪Pre, Post‬יתנו תוצאה זהה למה שיתנו בעץ סדור‪.‬‬‫‪In -‬לא בהכרח זהה!‬
‫ייצוג‪:‬‬
‫)‪1‬מערך של רשומות‬
‫‪Var‬‬
‫‪cellspace: array[1…maxnodes] of record‬‬
‫‪leftchild: integer‬‬
‫‪rightchild: integer‬‬
‫;‪end‬‬
‫דוגמא‪ :‬קוד‪Huffman‬‬
‫נתון סט של אותיות‪a, b, c, d, e‬‬‫מופיעות בשפה בהסתברויות שונות‪:‬‬‫‪0.12, 0.4, 0.15, 0.08, 0.25‬‬
‫רוצים לקודד ל ‪ 0/1‬בצורה יעילה‬‫אפשרות א ‪’ -‬שלשות‪:‬‬
‫אורך ממוצע‪3 :‬‬
‫‪000‬‬
‫‪001‬‬
‫‪010‬‬
‫‪011‬‬
‫‪100‬‬
‫אפשרות ב’ ‪ -‬ייצוג קצר לאותיות קצרות‬
‫ייצוג ארוך לאותיות ארוכות‬
‫שימוש בקוד פרפיקסי =‬
‫אף אות אינה פרפיקס של אחרת‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪d‬‬
‫‪e‬‬
‫דוגמא‪:‬‬
‫‪000‬‬
‫‪11‬‬
‫‪01‬‬
‫‪001‬‬
‫‪10‬‬
‫אורך ממוצע‪:‬‬
‫‪3(0.12+0.15)+2(0.4+0.08+2.5)=2.27‬‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪d‬‬
‫‪e‬‬
‫בעיה‪ :‬בהינתן אותיות והסתברויות מצא‬
‫קוד פרפיקסי יעיל‪.‬‬
‫יצוג קוד פרפיקסי בעזרת עץ בינארי‪:‬‬
‫אותיות בעלים‬‫‪- 0/1‬בענפים (שמאל=‪ ,0‬ימין=‪)1‬‬
‫‪-‬אותיות בעלים‬
‫‪1‬‬
‫‪1‬‬
‫מבטיח פרפיקס‬
‫ישום‪Huffman‬‬
‫יהיה לנו יער (אוסף עצים)‬‫העלים = אותיות‬‫מסלולים = סיומות של מילים‬‫לכל עץ משקל = סכום ההסתברויות‬‫‪-‬כל פעם שדך את העצים הקלים ביותר‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪0‬‬
:‫דוגמא‬
0.12
a
.
0.4
b
0.15
c
.
0.08
d
.
0.25
e
.
.
0.2
X1
X2 0.35
X3 0.6
1.0 X4
X4
X3
:‫חישוב אורך ממוצע‬
b 0.4
X2
X1
a 0.12
e 0.25
c 0.15
d 0.08
a
d
c
e
b
0.12*4
0.08*4
0.15*3
0.25*2
0.4*1
2.15
‫מבנה נתונים‪:‬‬
‫)‪1‬לשמור את מבנה העצים‪ :‬לכל צומת אבא ובנים‪.‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪Lchild‬‬
‫‪Parent‬‬
‫‪Rchild‬‬
‫)‪2‬לכל עץ משקלו ושורשו‪.‬‬
‫‪Weight Root‬‬
‫‪Forest‬‬
‫)‪3‬שמירת האלף‪-‬בית (סטאטי)‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪0.12‬‬
‫‪0.4‬‬
‫‪0.15‬‬
‫‪0.08‬‬
‫‪0.25‬‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪d‬‬
‫‪e‬‬
‫‪ALPHABET‬‬
‫דינמיות‬
‫בכל פעולה מוסיפים צומת ‪ -‬מורידים עץ‪.‬‬‫הוספת צומת ‪ -‬בסוף של‪TREE‬‬‫הורדת עץ‪ :‬מ ‪ T1‬ו ‪ T2‬יוצרים‪T.‬‬‫נבצע‪T2+T1‬‬
‫‪T1‬‬
‫זריקת ‪ T2:‬החלף מקומות בין ‪ T2‬ו‪TLAST‬‬‫והקטן האינדקס ל‪LAST‬‬
‫עצים בינאריים‪:‬‬
‫ניתן לישם באמצעות פוינטרים‪:‬‬
‫‪type‬‬
‫‪node = record‬‬
‫‪lchild : node‬‬
‫‪rchild : node‬‬
‫‪parent: node‬‬
‫‪end‬‬
‫אחסון עצים בינאריים במערך‪:‬‬
‫• טוב למבנה סטאטי‬
‫• אם צומת ‪ x‬בתא‪i :‬‬
‫אז ‪:‬‬
‫‪Ichild(x): 2i‬‬
‫‪Rchild(x): 2i+1‬‬
‫• טוב במיוחד אם העץ מושלם (או שתילת‬
‫עצים אחרים בחורים‪).‬‬
‫‪X96‬‬
‫‪3.43‬‬
‫ישום עצים‬
‫יצוג עץ באמצעות מערך (מערך הורים‪) :‬‬
‫• יצוג פשטני התומך ב‪- PARENT‬‬
‫• מערך ‪ [A[i‬שבו ‪ [A[i‬הוא סמן )‪ (Cursor‬להורה של‪i :‬‬
‫• בעיה לתמוך ב‪- LEFTMOST_CHILD‬‬
‫‪RIGHT_SIBLING‬‬
‫• ניתן לייצג( ‪ LABEL‬במערך נוסף)‬
‫‪a‬‬
‫דוגמה‪:‬‬
‫‪e‬‬
‫‪0 1 1 2 0‬‬
‫‪T:‬‬
‫‪1‬‬
‫‪b‬‬
‫‪2‬‬
‫‪3‬‬
‫‪c‬‬
‫‪1 2 3 4 5‬‬
‫‪d‬‬
‫‪5‬‬
‫‪a b c d e‬‬
‫‪4‬‬
‫‪LABEL‬‬
‫‪1 2 3 4 5‬‬
‫בעיית ‪ LCHILD‬ו ‪- RSIBLING:‬לא מוגדר סדר מספיק‬
‫ביצוג הנוכחי!‬
‫נניח‪ :‬נשכן בנים אחרי האב ומשמאל לימין‪.‬‬
X96
3.44
R_SIBLING‫ ישום‬- ‫אזי‬
Function R_SIBLING (n:node ; T:Tree)
node ;
{return R_SIB of n in T (o else) }
var
i,parent: node ;
begin
parent:= T(n)
for i:= n+1 to max nodes do
if T(i) = parent then
return (i) ;
return (0) ;
end ;
DATA TYPES
type
node = integer
TREE = array [ 1 … max nodes ]
of node ;
‫‪X96‬‬
‫‪3.48‬‬
‫איך מבצעים‪(CREATEz (v,T1,Tz:‬‬
‫)‪1‬צור רשימה חדשה ‪ V‬ותן לה סימון מתאים‬
‫(בד”כ נשמור רשימת ‪ Avail‬לתאים פנויים)‬
‫)‪2‬‬
‫‪V. left = T1‬‬
‫)‪Z‬‬
‫‪T1.right = T2‬‬
‫‪X96‬‬
‫‪3.49‬‬
‫ישום ברשימת מצביעים (זהה) !‬
‫‪A‬‬
‫‪rsibling‬‬
‫‪label‬‬
‫‪C‬‬
‫‪lchild‬‬
‫‪B‬‬
‫‪D‬‬
‫‪A‬‬
‫‪C‬‬
‫‪B‬‬
‫‪D‬‬
‫שידוך עצים ברשימת מצביעים‬
‫?‬
‫‪T1‬‬
‫?‬
‫‪T2‬‬
‫‪Avail‬‬