ADTs: Array, Queue, Stack, Linked List

Slides:



Advertisements
Similar presentations
Queues Printer queues Several jobs submitted to printer Jobs form a queue Jobs processed in same order as they were received.
Advertisements

STACKS & QUEUES. Stacks Abstract data types An abstract data type (ADT) is an abstraction of a data structure An ADT specifies : –Data stored –Operations.
Stacks, Queues, and Linked Lists
CSCE 3110 Data Structures & Algorithm Analysis
Queues and Linked Lists
1 Array-based Implementation An array Q of maximum size N Need to keep track the front and rear of the queue: f: index of the front object r: index immediately.
Ceng-112 Data Structures I Chapter 5 Queues.
David Weinberg presents Linked Lists: The Background  Linked Lists are similar to ArrayLists in their appearance and method of manipulation  They do.
Queue & List Data Structures & Algorithm Abstract Data Types (ADTs) ADT is a mathematically specified entity that defines a set of its instances,
1 Queues (5.2) CSE 2011 Winter May Announcements York Programming Contest Link also available from.
Queues. What is a queue? First-in first-out data structure (FIFO) New objects are placed at rear Removal restricted to front Examples?
Queues. What is a queue? First-in first-out data structure (FIFO) New objects are placed at rear Removal restricted to front Examples?
Queues.
Stacks, Queues & Deques CSC212.
1 Lecture 26 Abstract Data Types – IV Overview  The List ADT  Implementing Stacks as Linked List  Linked List Implementation of Queues .  Preview:
1 Stack Data : a collection of homogeneous elements arranged in a sequence. Only the first element may be accessed Main Operations: Push : insert an element.
Data Structures - Queues
Stack and Queue.
DATA STRUCTURES AND ALGORITHMS Lecture Notes 4 Prepared by İnanç TAHRALI.
1 Chapter 7 Stacks and Queues. 2 Stack ADT Recall that ADT is abstract data type, a set of data and a set of operations that act upon the data. In a stack,
Lab 7 Queue ADT. OVERVIEW The queue is one example of a constrained linear data structure. The elements in a queue are ordered from least recently added.
Stacks And Queues Chapter 18.
Review of Lists, Stacks, and Queues CS 400/600 – Data Structures.
Cousin of the Stack.  An abstract data type (container class) in which items are entered at one end and removed from the other end  First In First.
Foundations of Data Structures Practical Session #4 Recurrence ADT 08/04/2013Amihai Savir & Ilya Mirsky
1 Stacks & Queues CSC Stacks & Queues Stack: Last In First Out (LIFO). –Used in procedure calls, to compute arithmetic expressions etc. Queue: First.
1 Stacks (Continued) and Queues Array Stack Implementation Linked Stack Implementation The java.util.Stack class Queue Abstract Data Type (ADT) Queue ADT.
Queue ADT for lining up politely. COSC 2006 queue2 Queue – simple collection class  first-in first-out (FIFO) structure insert new elements at one end.
Data Structures Intro2CS – week Stack ADT (Abstract Data Type) A container with 3 basic actions: – push(item) – pop() – is_empty() Semantics: –
One implementation of the LIST ADT Insert new node before current and new node becomes current (assume new node created) node newNode = new node; head.
Chapter 3 Lists, Stacks, Queues. Abstract Data Types A set of items – Just items, not data types, nothing related to programming code A set of operations.
Lecture 16 Stacks and Queues Richard Gesick. Sample test questions 1.Write a definition for a Node class that holds a number. 2.Write a method that sums.
Cpt S 122 – Data Structures Abstract Data Types
Queues 5/11/2018 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H.
G64ADS Advanced Data Structures
Double-Ended Queues Chapter 5.
QueueStack CS1020.
Tirgul 12 Data Structures (2) 1.
Design & Analysis of Algorithm Priority Queue
Queues Rem Collier Room A1.02
Linked List Stacks, Linked List Queues, Dequeues
CSCE 3110 Data Structures & Algorithm Analysis
CPSC 311 Section 502 Analysis of Algorithm
Stacks.
Problems with Linked List (as we’ve seen so far…)
Queue data structure.
Queues Queues Queues.
Programming Abstractions
Stack and Queue APURBO DATTA.
Queues Chapter 4.
March 31 – Priority Queues and the heap
Priority Queue.
Queues.
Linked List (Part I) Data structure.
Queues 12/3/2018 Queues © 2014 Goodrich, Tamassia, Goldwasser Queues.
18.5 Linked Queues Like a stack, a queue can be implemented using pointers and nodes Allows dynamic sizing, avoids issue of wrapping indices NULL front.
Queues 3/9/15 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H. Goldwasser,
ADT list.
Chapter 24 Implementing Lists, Stacks, Queues, and Priority Queues
Stack A data structure in which elements are inserted and removed only at one end (called the top). Enforces Last-In-First-Out (LIFO) Uses of Stacks Evaluating.
CS6045: Advanced Algorithms
Stacks and Queues 1.
Mutable Data (define mylist (list 1 2 3)) (bind ((new (list 4)))
Queues CSC212.
ADT Queue (Array Implementation)
Lecture 16 Stacks and Queues CSE /26/2018.
CS210- Lecture 6 Jun 13, 2005 Announcements
Queues Definition of a Queue Examples of Queues
Queues cont. Chapter 8 © 2011 Pearson Addison-Wesley. All rights reserved.
Lecture 16 Stacks and Queues CSE /26/2018.
Presentation transcript:

ADTs: Array, Queue, Stack, Linked List תרגול 4 ADTs: Array, Queue, Stack, Linked List

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

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

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

שאלה 1 S קבוצה עם לכל היותר n איברים (n נתון). מצאו מבנה נתונים בגודל O(n) התומך בפעולות הבאות בזמנים הנתונים:

שאלה 1 פתרון: בעזרת מיון ישיר (מערך) . . . Init (n) Null . . . COUNT = 0 Init (n) for (i=0 ; i<n ; i++) A[i] = null; count = 0;

שאלה 1 X פתרון: בעזרת מיון ישיר (מערך) . . . isElement (k) COUNT = 0 COUNT = 1 . . . isElement (k) return (A[k] != null); Null X Key= k k-1 Null k Null k+1 Insert (x) If(!isElement (x.key)){ A[x.key] = x; count++; } Null Null Null . . .

שאלה 1 פתרון: בעזרת מיון ישיר (מערך) Remove (k) If(isElement (k)){ isEmpty () return (count == 0); Remove (k) If(isElement (k)){ A[k] = null; count--; } hasAll () return (count == n);

שאלה 2 שאלה: הציעו כיצד לממש תור בעזרת 2 מחסניות. פתרון: x a b c d

שאלה 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) ; }

שאלה 2 שאלה: הציעו כיצד לממש תור בעזרת 2 מחסניות. פתרון נוסף: שאלה: הציעו כיצד לממש תור בעזרת 2 מחסניות. פתרון נוסף: Enqueue (x) A.Push(x); Dequeue ( ) moveElements(A,B); element = B.Pop(); moveElements(B,A); return element; isEmpty ( ) return A.isEmpty(); moveElements(X,Y) while (! X.isEmpty()) { temp = X.Pop(); Y.Push(temp) ; }

שאלה 2 שאלה: הציעו כיצד לממש תור בעזרת 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) ; }

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

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

שאלה 3 הדגמת הפתרון: פתרון: מוצאים את האורך של L1,L2 ברשימה הארוכה, זזים קדימה את ההפרש כעת המרחק מהקודקוד המשותף שווה ב2 הרשימות. כל עוד הרשימות לא התאחדו (קודקוד ראשון משותף), זזים קודקוד 1 קדימה בשתי הרשימות. הדגמת הפתרון: m = 4 k = 3 Null Head 2 n = 2 Head 1

שאלה 3 הדגמת הפתרון: פתרון: מוצאים את האורך של L1,L2 ברשימה הארוכה, זזים קדימה את ההפרש כעת המרחק מהקודקוד המשותף שווה ב2 הרשימות. כל עוד הרשימות לא התאחדו (קודקוד ראשון משותף), זזים קודקוד 1 קדימה בשתי הרשימות. הדגמת הפתרון: Current Current Current Current Current Current Current Current Null Current Head 2 Current Current Current Current Current Head 1 Length1 = 7 Length2 = 5

שאלה 3 הדגמת הפתרון: פתרון: מוצאים את האורך של L1,L2 ברשימה הארוכה, זזים קדימה את ההפרש כעת המרחק מהקודקוד המשותף שווה ב2 הרשימות. כל עוד הרשימות לא התאחדו (קודקוד ראשון משותף), זזים קודקוד 1 קדימה בשתי הרשימות. הדגמת הפתרון: Current 1 Current 1 Current 1 Null Head 2 Current 2 Head 1 Length1 – Length2 = 2

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

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

שאלה 4 - הדגמה moveBackward() temp=current; current=prev; שאלה 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; temp = prev; prev=current; curent=current.next; prev.next=temp; prev current Temp Head

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

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

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

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

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

שאלה 5 קוד: init() fill A with 1’s fill Sum with n. count1=n count0=0 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; count1- -; Sum[i]--; count0++; } קוד: init() fill A with 1’s fill Sum with n. count1=n count0=0 hasRowOf1() return count1>0   hasRowOf0() return count0>0

שאלה 6 שאלה: הציעו דרך לממש מערך של מספרים, כך שאתחול כל תאי המערך בערך INIT_VAL כלשהו יתבצע ב-O(1). להזכירכם – קריאה וכתיבה של ערך A[i] צריך לקחת O(1).

שאלה 6 פתרון: כדי לאתחל מערך A בגודל n ב-O(1), ניצור ADT חדש בשם smartArray. smartArray ישתמש במבני הנתונים הבאים: A – מערך שישמור את הערכים top – סופר את מס' התאים ב-A שאותחלו INIT_VAL – ערך האתחול C – מערך של ערכים מאותחלים + לא מאותחלים C[0…top-1] – אינדקסים של תאים שאותחלו ב-A B – מערך של אינדקסים לתאים מאותחלים ב-C B[k] – האינדקס של k במערך C

שאלה 6 smartArray תומך במתודות הבאות: new: NewSmartArray(n) A = new int[n] B = new int[n] C = new int[n] Initialization: init(val) INIT_VAL = val top = 0 The following procedure returns true if a given index ‘i’ is not initialized. not_defined(i) return !((B[i] < top) and C[B[i]] = i))

שאלה 6 Read(i) Write(i,val) if (not_defined(i)) if (not_defined(i)) Assumptions: The value of an undefined element B[i] is an unexpected non-negative number. Thus, for an undefined index, the comparison B[i]<top can be either true or false. The and expression is evaluated from left to right. Thus, C[B[i]]=i is evaluated only if B[i] < top. Read(i) if (not_defined(i)) return INIT_VAL else return A[i] Write(i,val) if (not_defined(i)) C[top] = i B[i] = top top++ A[i] ← val

שאלה 6 Example: x = new smartArray[n] x.init(0) x.write(2,20) x.write(4,40) x.write(5,50) a = x.read(4) >> the value of a is 40 b = x.read(3) >> the value of b is 0 222 379 151 5 4 3 2 1 50 5 4 3 2 1 2 5 4 3 2 1 40 1 20 5 4 2 top A B C

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

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

שאלה 7 פתרון: נשתמש ברשימה דו-כיוונית בנוסף, כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים יותר (כולל האיבר עצמו) הדגמה: tail head 5 7 3 15 10 6

שאלה 7 פתרון: נשתמש ברשימה דו-כיוונית בנוסף, כל רשומה תכיל מצביע לערך המינימלי מבין הערכים הוותיקים יותר (כולל האיבר עצמו) הדגמה: אם נבצע ChangeMin(12), כיצד ישתנו החיצים? tail head 5 7 12 15 10 4

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