SlideShare a Scribd company logo
1 of 57
SE274 Data Structure
Lecture 4: List (array), Stacks, Queues, Deques
Mar 22, 2022
Instructor: Sunjun Kim
DGIST ICE
1
Exercise)
2
à O(n3)
à O(n2)
Under following assumptions:
* No individual sequence contains duplicate values.
(Assume A, B, and C contains N items each)
Before we start…
• Memory management of Array in Python
3
0100101010111011…
Python Sequence Classes
• Python has built-in types, list, tuple, and str.
• Each of these sequence types supports indexing to access an individual element
of a sequence, using a syntax such as A[i]
• Each of these types uses an array to represent the sequence.
• An array is a set of memory locations that can be addressed using consecutive indices, which,
in Python, start with index 0.
4
A
0 1 2 n
i
Arrays of Characters or Object References
• An array can store primitive elements, such as characters, giving us a
compact array (when using array module).
• An array can also store references to objects (list, tuple).
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 5
Compact Arrays
• Primary support for compact arrays is in a module named array.
• That module defines a class, also named array, providing compact storage for
arrays of primitive data types.
• The constructor for the array class requires a type code as a first
parameter, which is a character that designates the type of data that
will be stored in the array.
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 6
Type Codes in the array Class
• Python’s array class has the following type codes:
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 7
https://docs.python.org/3.9/library/array.html
• An array can store primitive elements, such as characters, giving us a
compact array (when using array module).
• An array can also store references to objects (list, tuple).
Object References
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 8
List and Tuple
List
• Defined as [A, B, C, … ]
• Mutable
Tuple
• Defined as (A, B, C, … )
• Immutable
9
The same: sequence data types (=stored as an array)
List and Tuple
List Tuple
10
*k: the index of the leftmost occurrence. k=n if there is no occurrence.
List
11
Insertion
• In an operation add(i, o), we need to make room for the new element by shifting
forward the n - i elements A[i], …, A[n - 1]
• In the worst case (i = 0), this takes O(n) time
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 12
A
0 1 2 n
i
A
0 1 2 n
i
A
0 1 2 n
o
i
Element Removal
• In an operation remove(i), we need to fill the hole left by the removed element by
shifting backward the n - i - 1 elements A[i + 1], …, A[n - 1]
• In the worst case (i = 0), this takes O(n) time
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 13
A
0 1 2 n
i
A
0 1 2 n
o
i
A
0 1 2 n
i
Performance
• In an array based implementation of a dynamic list:
• The space used by the data structure is O(n)
• Indexing the element at I takes O(1) time
• add and remove run in O(n) time in worst case
• In an add operation, when the array is full, instead of throwing an
exception, we can replace the array with a larger one…
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 14
Growable Array-based Array List
• In an add(o) operation (without an
index), we could always add at the end,
normally done in O(1)
• When the array is full, we replace the
array with a larger one
• How large should the new array be?
• Incremental strategy: increase the size by a
constant c
• Doubling strategy: double the size
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 15
Algorithm add(o)
if t = S.length - 1 then
A ¬ new array of
size …
for i ¬ 0 to n-1 do
A[i] ¬ S[i]
S ¬ A
n ¬ n + 1
S[n-1] ¬ o
Comparison of the Strategies
• We compare the incremental strategy and the doubling strategy by
analyzing the total time T(n) needed to perform a series of n add(o)
operations
• We assume that we start with an empty stack represented by an array
of size 1
• We call amortized time of an add operation the average time taken
by an add over the series of operations, i.e., T(n)/n
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 16
Incremental vs. Doubling
Asymptotic & Amortized Analysis
Incremental Doubling
17
Add:
* Asymptotic time analysis: O(n)
* Amortized time analysis: O(n)
Add:
* Asymptotic time analysis: O(n)
* Amortized time analysis: O(1)
Increase by 2 Increase by 3 doubled
Incremental Strategy Analysis
• We replace the array k = n/c times
• The total time T(n) of a series of n add operations is proportional to
n + c + 2c + 3c + 4c + … + kc =
n + c(1 + 2 + 3 + … + k) =
n + ck(k + 1)/2
• Since c is a constant, T(n) is O(n + k2) à O(n2)
• The amortized time of an add operation is O(n)
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 18
Doubling Strategy Analysis
• We replace the array k = log2 n times
• The total time T(n) of a series of n add
operations is proportional to
n + 1 + 2 + 4 + 8 + …+ 2k =
n + 2k + 1 - 1 =
3n - 1
• T(n) is O(n)
• The amortized time of an add operation is O(1)
© 2013 Goodrich, Tamassia,
Goldwasser
Array-Based Sequences 19
geometric series
1
2
1
4
8
Stack
20
Stack and Queue, the concepts
Stack Queue
21
Abstract Data Types (ADTs)
• An abstract data type (ADT) is an
abstraction of a data structure
• An ADT specifies:
• Data stored
• Operations on the data
• Error conditions associated with
operations
• In python,
àABC (Abstract Base Class)
• Example: ADT modeling a simple
stock trading system
• The data stored are buy/sell
orders
• The operations supported are
• order buy(stock, shares, price)
• order sell(stock, shares, price)
• void cancel(order)
• Error conditions:
• Buy/sell a nonexistent stock
• Cancel a nonexistent order
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
22
Stacks
23
The Stack ADT
• The Stack ADT stores arbitrary
objects
• Insertions and deletions
follow the last-in first-out
scheme
• Think of a spring-loaded plate
dispenser
• LIFO
= Last In First Out
• Main stack operations:
• push(object): inserts an
element
• object pop(): removes and
returns the last inserted
element
• Auxiliary stack operations:
• object top(): returns the last
inserted element without
removing it
• integer len(): returns the
number of elements stored
• boolean is_empty(): indicates
whether no elements are
stored
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
24
The Stack ADT
• Main stack operations:
• push(object): inserts an
element
• object pop(): removes and
returns the last inserted
element
• Auxiliary stack operations:
• object top(): returns the last
inserted element without
removing it
• integer len(): returns the
number of elements stored
• boolean is_empty(): indicates
whether no elements are
stored
obj
push(obj)
obj
obj = pop()
obj
obj = top()
len()
Stacks
25
Example
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
26
Applications of Stacks
• Direct applications
• Page-visited history in a Web browser
• Undo sequence in a text editor
• Chain of method calls in a language that supports recursion
• Indirect applications
• Auxiliary data structure for algorithms
• Component of other data structures
© 2013 Goodrich, Tamassia,
Goldwasser
Array-based Stack
• A simple way of implementing the Stack ADT uses an array
• We add elements from left to right
• A variable keeps track of the index of the top element
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks 27
S
0 1 2 t
…
Note: a practical stack can be implemented using: https://docs.python.org/3/tutorial/datastructures.html
Array-based Stack (cont.)
• The array storing the stack elements may become full
• A push operation will then need to grow the array and copy all the
elements over.
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
28
S
0 1 2 t
…
Performance and Limitations
•Performance
• Let n be the number of elements in the stack
• The space used is O(n)
• Each operation runs in time O(1)
(amortized in the case of a push, doubling strategy)
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks 29
Stacks
30
Array-based Stack in Python
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
31
Parentheses Matching
• Each “(”, “{”, or “[” must be paired with a matching “)”, “}”, or “[”
• correct: ( )(( )){([( )])}
• correct: ((( )(( )){([( )])}))
• incorrect: )(( )){([( )])}
• incorrect: ({[ ])}
• incorrect: (
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
32
Parentheses Matching Algorithm
Algorithm ParenMatch(X,n):
Input: An array X of n tokens, each of which is either a grouping symbol, a
variable, an arithmetic operator, or a number
Output: true if and only if all the grouping symbols in X match
Let S be an empty stack
for i=0 to n-1 do
if X[i] is an opening grouping symbol then
S.push(X[i])
else if X[i] is a closing grouping symbol then
if S.is_empty() then
return false {nothing to match with}
if S.pop() does not match the type of X[i] then
return false {wrong type}
if S.isEmpty() then
return true {every symbol matched}
else return false {some symbols were never matched}
© 2013 Goodrich, Tamassia,
Goldwasser
Parentheses Matching in Python
© 2013 Goodrich, Tamassia,
Goldwasser
33 Stacks
Stacks
34
HTML Tag Matching
<body>
<center>
<h1> The Little Boat </h1>
</center>
<p> The storm tossed the little
boat like a cheap sneaker in an
old washing machine. The three
drunken fishermen were used to
such treatment, of course, but
not the tree salesman, who even as
a stowaway now felt that he
had overpaid for the voyage. </p>
<ol>
<li> Will the salesman die? </li>
<li> What color is the boat? </li>
<li> And what about Naomi? </li>
</ol>
</body>
The Little Boat
The storm tossed the little boat
like a cheap sneaker in an old
washing machine. The three
drunken fishermen were used to
such treatment, of course, but not
the tree salesman, who even as
a stowaway now felt that he had
overpaid for the voyage.
1. Will the salesman die?
2. What color is the boat?
3. And what about Naomi?
For fully-correct HTML, each <name> should pair with a matching </name>
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
35
Tag Matching Algorithm in Python
© 2013 Goodrich, Tamassia,
Goldwasser
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks 36
Evaluating Arithmetic
Expressions
14 – 3 * 2 + 7 = (14 – (3 * 2) ) + 7
Operator precedence
* has precedence over +/–
Associativity
operators of the same precedence group
evaluated from left to right
Example: (x – y) + z rather than x – (y + z)
Idea: push each operator on the stack, but first pop and
perform higher and equal precedence operations.
Slide by Matt Stallmann
included with permission.
Algorithm for
Evaluating Expressions
Two stacks:
• opStk holds operators
• valStk holds values
• Use $ as special “end of input” token with
lowest precedence
Algorithm doOp()
x ¬ valStk.pop();
y ¬ valStk.pop();
op ¬ opStk.pop();
valStk.push( y op x )
Algorithm repeatOps( refOp ):
while ( valStk.size() > 1 Ù
prec(refOp) ≤
prec(opStk.top())
doOp()
Algorithm EvalExp()
Input: a stream of tokens representing an
arithmetic expression (with numbers)
Output: the value of the expression
while there’s another token z
if isNumber(z) then
valStk.push(z)
else
repeatOps(z);
opStk.push(z)
repeatOps($);
return valStk.top()
© 2013 Goodrich, Tamassia,
Goldwasser
37 Stacks
Slide by Matt Stallmann
included with permission.
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks 38
Algorithm on an
Example Expression
14 ≤ 4 – 3 * 2 + 7
Operator ≤ has lower
precedence than +/–
–
≤
14
4
*
3
–
≤
14
4
2
*
3
–
≤
14
4
+
2
*
3
–
≤
14
4
+
6
–
≤
14
4 +
≤
14
-2
$
7
+
≤
14
-2
$
F
$
≤
14
5
Slide by Matt Stallmann
included with permission.
Stacks
39
Computing Spans (not in book)
• Using a stack as an auxiliary data
structure in an algorithm
• Given an an array X, the span
S[i] of X[i] is the maximum
number of consecutive elements
X[j] immediately preceding X[i]
and such that X[j] £ X[i]
• Spans have applications to
financial analysis
• E.g., stock at 52-week high
6 3 4 5 2
1 1 2 3 1
X
S
0
1
2
3
4
5
6
7
0 1 2 3 4
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
40
Quadratic Algorithm
Algorithm spans1(X, n)
Input array X of n integers
Output array S of spans of X #
S ¬ new array of n integers n
for i ¬ 0 to n - 1 do n
s ¬ 1 n
while s £ i Ù X[i - s] £ X[i] 1 + 2 + …+ (n - 1)
s ¬ s + 1 1 + 2 + …+ (n - 1)
S[i] ¬ s n
return S 1
Algorithm spans1 runs in O(n2) time
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
41
Computing Spans with a Stack
• We keep in a stack the indices of the
elements visible when “looking back”
• We scan the array from left to right
• Let i be the current index
• We pop indices from the stack until we find
index j such that X[i] < X[j]
• We set S[i] ¬ i - j
• We push x onto the stack
0
1
2
3
4
5
6
7
0 1 2 3 4 5 6 7
© 2013 Goodrich, Tamassia,
Goldwasser
Stacks
42
Linear Algorithm
Algorithm spans2(X, n) #
S ¬ new array of n integers n
A ¬ new empty stack 1
for i ¬ 0 to n - 1 do n
while (¬A.is_empty() Ù
X[A.top()] £ X[i] ) do n
A.pop() n
if A.is_empty() then n
S[i] ¬ i + 1 n
else
S[i] ¬ i - A.top() n
A.push(i) n
return S 1
Each index of the array
n Is pushed into the stack exactly one
n Is popped from the stack at most once
The statements in the while-loop
are executed at most n times
Algorithm spans2 runs in O(n) time
© 2013 Goodrich, Tamassia,
Goldwasser
X = [6, 3, 4, 1, 2, 3, 5, 4]
Queue
43
The Queue ADT
• The Queue ADT stores arbitrary objects
• Insertions and deletions follow the first-in
first-out scheme
• Insertions are at the rear of the queue and
removals are at the front of the queue
• FIFO
= First In First Out
• Exceptions
• Attempting the execution of dequeue or
front on an empty queue throws an
EmptyQueueException
• Main queue operations:
• enqueue(object): inserts an element at the
end of the queue
• object dequeue(): removes and returns the
element at the front of the queue
• Auxiliary queue operations:
• object first(): returns the element at the
front without removing it
• integer len(): returns the number of
elements stored
• boolean is_empty(): indicates whether no
elements are stored
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
44
The Queue ADT
• Main queue operations:
• enqueue(object): inserts an element at the
end of the queue
• object dequeue(): removes and returns the
element at the front of the queue
• Auxiliary queue operations:
• object first(): returns the element at the
front without removing it
• integer len(): returns the number of
elements stored
• boolean is_empty(): indicates whether no
elements are stored
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
45
head tail
enqueue(obj)
head tail
obj = dequeue()
head tail
obj = first()
head tail
len()
Queues
46
Example
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
47
Applications of Queues
• Direct applications
• Waiting lists
• Access to shared resources (e.g., printer)
• Multiprogramming
• Indirect applications
• Auxiliary data structure for algorithms
• Component of other data structures
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
48
Queue in Python
• Use the following three instance variables:
• _data: is a reference to a list instance with a fixed capacity.
• _size: is an integer representing the current number of elements stored in
the queue (as opposed to the length of the data list).
• _front: is an integer that represents the index within data of the first
element of the queue (assuming the queue is not empty).
© 2013 Goodrich, Tamassia,
Goldwasser
Queue in Python, Beginning
© 2013 Goodrich, Tamassia,
Goldwasser
49 Queues
Queue in Python, Continued
© 2013 Goodrich, Tamassia,
Goldwasser
50 Queues
Queues
51
Array-based Queue
• Use an array of size N in a circular fashion
• Two variables keep track of the front and rear
f index of the front element
r index immediately past the rear element
• Array location r is kept empty
Q
0 1 2 r
f
normal configuration
Q
0 1 2 f
r
wrapped-around configuration
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
52
Queue Operations
• We use the modulo
operator
(remainder of
division)
Algorithm size()
return (N - f + r) mod N
Algorithm isEmpty()
return (f = r)
Q
0 1 2 r
f
Q
0 1 2 f
r
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
53
Queue Operations (cont.)
Algorithm enqueue(o)
if size() = N - 1 then
throw FullQueueException
else
Q[r] ¬ o
r ¬ (r + 1) mod N
• Operation enqueue
throws an exception if the
array is full
• This exception is
implementation-
dependent
Q
0 1 2 r
f
Q
0 1 2 f
r
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
54
Queue Operations (cont.)
• Operation dequeue
throws an exception if
the queue is empty
• This exception is
specified in the queue
ADT
Algorithm dequeue()
if isEmpty() then
throw EmptyQueueException
else
o ¬ Q[f]
f ¬ (f + 1) mod N
return o
Q
0 1 2 r
f
Q
0 1 2 f
r
© 2013 Goodrich, Tamassia,
Goldwasser
Queues 55
Application: Round Robin Schedulers
• We can implement a round robin scheduler using a queue
Q by repeatedly performing the following steps:
1. e = Q.dequeue()
2. Service element e
3. Q.enqueue(e)
© 2013 Goodrich, Tamassia,
Goldwasser
Shared
Service
Queue
Enqueue
Dequeue
Deque
Double-Ended Queues
* Pronunciation: deck
56
The Deque ADT
• The Deque ADT stores arbitrary objects
• Insertions and deletions are happening at the
both ends of the queue.
• Exceptions
• Attempting the remove executions on an
empty deque throws an
EmptyQueueException
• Main queue operations:
• add_first(object): inserts an element at the front
of the deque.
• add_last(object): inserts an element at the end
of the deque.
• object delete_first(): removes and returns an
element at the front of the deque.
• object delete_last(): removes and returns an
element at the end of the deque.
• Auxiliary queue operations:
• object first(): returns the element at the
front without removing it
• object last(): returns the element at the end
without removing it
• integer len(): returns the number of
elements stored
• boolean is_empty(): indicates whether no
elements are stored
© 2013 Goodrich, Tamassia,
Goldwasser
Queues
57

More Related Content

Similar to Lecture 4 - List, Stack, Queues, Deques.pdf

19. algorithms and-complexity
19. algorithms and-complexity19. algorithms and-complexity
19. algorithms and-complexity
showkat27
 
Algorithm Complexity and Main Concepts
Algorithm Complexity and Main ConceptsAlgorithm Complexity and Main Concepts
Algorithm Complexity and Main Concepts
Adelina Ahadova
 
Review of basic data structures
Review of basic data structuresReview of basic data structures
Review of basic data structures
Deepa Rani
 
Homework Assignment – Array Technical DocumentWrite a technical .pdf
Homework Assignment – Array Technical DocumentWrite a technical .pdfHomework Assignment – Array Technical DocumentWrite a technical .pdf
Homework Assignment – Array Technical DocumentWrite a technical .pdf
aroraopticals15
 
Stack squeues lists
Stack squeues listsStack squeues lists
Stack squeues lists
James Wong
 
Stacksqueueslists
StacksqueueslistsStacksqueueslists
Stacksqueueslists
Fraboni Ec
 
Stacks queues lists
Stacks queues listsStacks queues lists
Stacks queues lists
Tony Nguyen
 

Similar to Lecture 4 - List, Stack, Queues, Deques.pdf (20)

III_Data Structure_Module_1.pptx
III_Data Structure_Module_1.pptxIII_Data Structure_Module_1.pptx
III_Data Structure_Module_1.pptx
 
0-Slot18-19-20-ContiguousStorage.pdf
0-Slot18-19-20-ContiguousStorage.pdf0-Slot18-19-20-ContiguousStorage.pdf
0-Slot18-19-20-ContiguousStorage.pdf
 
02 stackqueue
02 stackqueue02 stackqueue
02 stackqueue
 
19. algorithms and-complexity
19. algorithms and-complexity19. algorithms and-complexity
19. algorithms and-complexity
 
stacks and queues for public
stacks and queues for publicstacks and queues for public
stacks and queues for public
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Computational Complexity.pptx
Computational Complexity.pptxComputational Complexity.pptx
Computational Complexity.pptx
 
Algorithm Complexity and Main Concepts
Algorithm Complexity and Main ConceptsAlgorithm Complexity and Main Concepts
Algorithm Complexity and Main Concepts
 
Design and Analysis of Algorithms Lecture Notes
Design and Analysis of Algorithms Lecture NotesDesign and Analysis of Algorithms Lecture Notes
Design and Analysis of Algorithms Lecture Notes
 
DSJ_Unit I & II.pdf
DSJ_Unit I & II.pdfDSJ_Unit I & II.pdf
DSJ_Unit I & II.pdf
 
Q
QQ
Q
 
Review of basic data structures
Review of basic data structuresReview of basic data structures
Review of basic data structures
 
Homework Assignment – Array Technical DocumentWrite a technical .pdf
Homework Assignment – Array Technical DocumentWrite a technical .pdfHomework Assignment – Array Technical DocumentWrite a technical .pdf
Homework Assignment – Array Technical DocumentWrite a technical .pdf
 
Stack squeues lists
Stack squeues listsStack squeues lists
Stack squeues lists
 
Stacks queues lists
Stacks queues listsStacks queues lists
Stacks queues lists
 
Stacks queues lists
Stacks queues listsStacks queues lists
Stacks queues lists
 
Stacksqueueslists
StacksqueueslistsStacksqueueslists
Stacksqueueslists
 
Stacks queues lists
Stacks queues listsStacks queues lists
Stacks queues lists
 
Stacks queues lists
Stacks queues listsStacks queues lists
Stacks queues lists
 
Data structure and algorithm using java
Data structure and algorithm using javaData structure and algorithm using java
Data structure and algorithm using java
 

Recently uploaded

Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
drjose256
 
Artificial intelligence presentation2-171219131633.pdf
Artificial intelligence presentation2-171219131633.pdfArtificial intelligence presentation2-171219131633.pdf
Artificial intelligence presentation2-171219131633.pdf
Kira Dess
 
Final DBMS Manual (2).pdf final lab manual
Final DBMS Manual (2).pdf final lab manualFinal DBMS Manual (2).pdf final lab manual
Final DBMS Manual (2).pdf final lab manual
BalamuruganV28
 
electrical installation and maintenance.
electrical installation and maintenance.electrical installation and maintenance.
electrical installation and maintenance.
benjamincojr
 

Recently uploaded (20)

Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
Tembisa Central Terminating Pills +27838792658 PHOMOLONG Top Abortion Pills F...
 
15-Minute City: A Completely New Horizon
15-Minute City: A Completely New Horizon15-Minute City: A Completely New Horizon
15-Minute City: A Completely New Horizon
 
CLOUD COMPUTING SERVICES - Cloud Reference Modal
CLOUD COMPUTING SERVICES - Cloud Reference ModalCLOUD COMPUTING SERVICES - Cloud Reference Modal
CLOUD COMPUTING SERVICES - Cloud Reference Modal
 
Working Principle of Echo Sounder and Doppler Effect.pdf
Working Principle of Echo Sounder and Doppler Effect.pdfWorking Principle of Echo Sounder and Doppler Effect.pdf
Working Principle of Echo Sounder and Doppler Effect.pdf
 
Adsorption (mass transfer operations 2) ppt
Adsorption (mass transfer operations 2) pptAdsorption (mass transfer operations 2) ppt
Adsorption (mass transfer operations 2) ppt
 
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTUUNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
UNIT-2 image enhancement.pdf Image Processing Unit 2 AKTU
 
Dynamo Scripts for Task IDs and Space Naming.pptx
Dynamo Scripts for Task IDs and Space Naming.pptxDynamo Scripts for Task IDs and Space Naming.pptx
Dynamo Scripts for Task IDs and Space Naming.pptx
 
Diploma Engineering Drawing Qp-2024 Ece .pdf
Diploma Engineering Drawing Qp-2024 Ece .pdfDiploma Engineering Drawing Qp-2024 Ece .pdf
Diploma Engineering Drawing Qp-2024 Ece .pdf
 
Artificial intelligence presentation2-171219131633.pdf
Artificial intelligence presentation2-171219131633.pdfArtificial intelligence presentation2-171219131633.pdf
Artificial intelligence presentation2-171219131633.pdf
 
handbook on reinforce concrete and detailing
handbook on reinforce concrete and detailinghandbook on reinforce concrete and detailing
handbook on reinforce concrete and detailing
 
Final DBMS Manual (2).pdf final lab manual
Final DBMS Manual (2).pdf final lab manualFinal DBMS Manual (2).pdf final lab manual
Final DBMS Manual (2).pdf final lab manual
 
Intro to Design (for Engineers) at Sydney Uni
Intro to Design (for Engineers) at Sydney UniIntro to Design (for Engineers) at Sydney Uni
Intro to Design (for Engineers) at Sydney Uni
 
Software Engineering Practical File Front Pages.pdf
Software Engineering Practical File Front Pages.pdfSoftware Engineering Practical File Front Pages.pdf
Software Engineering Practical File Front Pages.pdf
 
Interfacing Analog to Digital Data Converters ee3404.pdf
Interfacing Analog to Digital Data Converters ee3404.pdfInterfacing Analog to Digital Data Converters ee3404.pdf
Interfacing Analog to Digital Data Converters ee3404.pdf
 
Filters for Electromagnetic Compatibility Applications
Filters for Electromagnetic Compatibility ApplicationsFilters for Electromagnetic Compatibility Applications
Filters for Electromagnetic Compatibility Applications
 
Worksharing and 3D Modeling with Revit.pptx
Worksharing and 3D Modeling with Revit.pptxWorksharing and 3D Modeling with Revit.pptx
Worksharing and 3D Modeling with Revit.pptx
 
electrical installation and maintenance.
electrical installation and maintenance.electrical installation and maintenance.
electrical installation and maintenance.
 
SLIDESHARE PPT-DECISION MAKING METHODS.pptx
SLIDESHARE PPT-DECISION MAKING METHODS.pptxSLIDESHARE PPT-DECISION MAKING METHODS.pptx
SLIDESHARE PPT-DECISION MAKING METHODS.pptx
 
Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)Theory of Time 2024 (Universal Theory for Everything)
Theory of Time 2024 (Universal Theory for Everything)
 
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdfInvolute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
Involute of a circle,Square, pentagon,HexagonInvolute_Engineering Drawing.pdf
 

Lecture 4 - List, Stack, Queues, Deques.pdf

  • 1. SE274 Data Structure Lecture 4: List (array), Stacks, Queues, Deques Mar 22, 2022 Instructor: Sunjun Kim DGIST ICE 1
  • 2. Exercise) 2 à O(n3) à O(n2) Under following assumptions: * No individual sequence contains duplicate values. (Assume A, B, and C contains N items each)
  • 3. Before we start… • Memory management of Array in Python 3 0100101010111011…
  • 4. Python Sequence Classes • Python has built-in types, list, tuple, and str. • Each of these sequence types supports indexing to access an individual element of a sequence, using a syntax such as A[i] • Each of these types uses an array to represent the sequence. • An array is a set of memory locations that can be addressed using consecutive indices, which, in Python, start with index 0. 4 A 0 1 2 n i
  • 5. Arrays of Characters or Object References • An array can store primitive elements, such as characters, giving us a compact array (when using array module). • An array can also store references to objects (list, tuple). © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 5
  • 6. Compact Arrays • Primary support for compact arrays is in a module named array. • That module defines a class, also named array, providing compact storage for arrays of primitive data types. • The constructor for the array class requires a type code as a first parameter, which is a character that designates the type of data that will be stored in the array. © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 6
  • 7. Type Codes in the array Class • Python’s array class has the following type codes: © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 7 https://docs.python.org/3.9/library/array.html
  • 8. • An array can store primitive elements, such as characters, giving us a compact array (when using array module). • An array can also store references to objects (list, tuple). Object References © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 8
  • 9. List and Tuple List • Defined as [A, B, C, … ] • Mutable Tuple • Defined as (A, B, C, … ) • Immutable 9 The same: sequence data types (=stored as an array)
  • 10. List and Tuple List Tuple 10 *k: the index of the leftmost occurrence. k=n if there is no occurrence.
  • 12. Insertion • In an operation add(i, o), we need to make room for the new element by shifting forward the n - i elements A[i], …, A[n - 1] • In the worst case (i = 0), this takes O(n) time © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 12 A 0 1 2 n i A 0 1 2 n i A 0 1 2 n o i
  • 13. Element Removal • In an operation remove(i), we need to fill the hole left by the removed element by shifting backward the n - i - 1 elements A[i + 1], …, A[n - 1] • In the worst case (i = 0), this takes O(n) time © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 13 A 0 1 2 n i A 0 1 2 n o i A 0 1 2 n i
  • 14. Performance • In an array based implementation of a dynamic list: • The space used by the data structure is O(n) • Indexing the element at I takes O(1) time • add and remove run in O(n) time in worst case • In an add operation, when the array is full, instead of throwing an exception, we can replace the array with a larger one… © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 14
  • 15. Growable Array-based Array List • In an add(o) operation (without an index), we could always add at the end, normally done in O(1) • When the array is full, we replace the array with a larger one • How large should the new array be? • Incremental strategy: increase the size by a constant c • Doubling strategy: double the size © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 15 Algorithm add(o) if t = S.length - 1 then A ¬ new array of size … for i ¬ 0 to n-1 do A[i] ¬ S[i] S ¬ A n ¬ n + 1 S[n-1] ¬ o
  • 16. Comparison of the Strategies • We compare the incremental strategy and the doubling strategy by analyzing the total time T(n) needed to perform a series of n add(o) operations • We assume that we start with an empty stack represented by an array of size 1 • We call amortized time of an add operation the average time taken by an add over the series of operations, i.e., T(n)/n © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 16
  • 17. Incremental vs. Doubling Asymptotic & Amortized Analysis Incremental Doubling 17 Add: * Asymptotic time analysis: O(n) * Amortized time analysis: O(n) Add: * Asymptotic time analysis: O(n) * Amortized time analysis: O(1) Increase by 2 Increase by 3 doubled
  • 18. Incremental Strategy Analysis • We replace the array k = n/c times • The total time T(n) of a series of n add operations is proportional to n + c + 2c + 3c + 4c + … + kc = n + c(1 + 2 + 3 + … + k) = n + ck(k + 1)/2 • Since c is a constant, T(n) is O(n + k2) à O(n2) • The amortized time of an add operation is O(n) © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 18
  • 19. Doubling Strategy Analysis • We replace the array k = log2 n times • The total time T(n) of a series of n add operations is proportional to n + 1 + 2 + 4 + 8 + …+ 2k = n + 2k + 1 - 1 = 3n - 1 • T(n) is O(n) • The amortized time of an add operation is O(1) © 2013 Goodrich, Tamassia, Goldwasser Array-Based Sequences 19 geometric series 1 2 1 4 8
  • 21. Stack and Queue, the concepts Stack Queue 21
  • 22. Abstract Data Types (ADTs) • An abstract data type (ADT) is an abstraction of a data structure • An ADT specifies: • Data stored • Operations on the data • Error conditions associated with operations • In python, àABC (Abstract Base Class) • Example: ADT modeling a simple stock trading system • The data stored are buy/sell orders • The operations supported are • order buy(stock, shares, price) • order sell(stock, shares, price) • void cancel(order) • Error conditions: • Buy/sell a nonexistent stock • Cancel a nonexistent order © 2013 Goodrich, Tamassia, Goldwasser Stacks 22
  • 23. Stacks 23 The Stack ADT • The Stack ADT stores arbitrary objects • Insertions and deletions follow the last-in first-out scheme • Think of a spring-loaded plate dispenser • LIFO = Last In First Out • Main stack operations: • push(object): inserts an element • object pop(): removes and returns the last inserted element • Auxiliary stack operations: • object top(): returns the last inserted element without removing it • integer len(): returns the number of elements stored • boolean is_empty(): indicates whether no elements are stored © 2013 Goodrich, Tamassia, Goldwasser
  • 24. Stacks 24 The Stack ADT • Main stack operations: • push(object): inserts an element • object pop(): removes and returns the last inserted element • Auxiliary stack operations: • object top(): returns the last inserted element without removing it • integer len(): returns the number of elements stored • boolean is_empty(): indicates whether no elements are stored obj push(obj) obj obj = pop() obj obj = top() len()
  • 25. Stacks 25 Example © 2013 Goodrich, Tamassia, Goldwasser
  • 26. Stacks 26 Applications of Stacks • Direct applications • Page-visited history in a Web browser • Undo sequence in a text editor • Chain of method calls in a language that supports recursion • Indirect applications • Auxiliary data structure for algorithms • Component of other data structures © 2013 Goodrich, Tamassia, Goldwasser
  • 27. Array-based Stack • A simple way of implementing the Stack ADT uses an array • We add elements from left to right • A variable keeps track of the index of the top element © 2013 Goodrich, Tamassia, Goldwasser Stacks 27 S 0 1 2 t … Note: a practical stack can be implemented using: https://docs.python.org/3/tutorial/datastructures.html
  • 28. Array-based Stack (cont.) • The array storing the stack elements may become full • A push operation will then need to grow the array and copy all the elements over. © 2013 Goodrich, Tamassia, Goldwasser Stacks 28 S 0 1 2 t …
  • 29. Performance and Limitations •Performance • Let n be the number of elements in the stack • The space used is O(n) • Each operation runs in time O(1) (amortized in the case of a push, doubling strategy) © 2013 Goodrich, Tamassia, Goldwasser Stacks 29
  • 30. Stacks 30 Array-based Stack in Python © 2013 Goodrich, Tamassia, Goldwasser
  • 31. Stacks 31 Parentheses Matching • Each “(”, “{”, or “[” must be paired with a matching “)”, “}”, or “[” • correct: ( )(( )){([( )])} • correct: ((( )(( )){([( )])})) • incorrect: )(( )){([( )])} • incorrect: ({[ ])} • incorrect: ( © 2013 Goodrich, Tamassia, Goldwasser
  • 32. Stacks 32 Parentheses Matching Algorithm Algorithm ParenMatch(X,n): Input: An array X of n tokens, each of which is either a grouping symbol, a variable, an arithmetic operator, or a number Output: true if and only if all the grouping symbols in X match Let S be an empty stack for i=0 to n-1 do if X[i] is an opening grouping symbol then S.push(X[i]) else if X[i] is a closing grouping symbol then if S.is_empty() then return false {nothing to match with} if S.pop() does not match the type of X[i] then return false {wrong type} if S.isEmpty() then return true {every symbol matched} else return false {some symbols were never matched} © 2013 Goodrich, Tamassia, Goldwasser
  • 33. Parentheses Matching in Python © 2013 Goodrich, Tamassia, Goldwasser 33 Stacks
  • 34. Stacks 34 HTML Tag Matching <body> <center> <h1> The Little Boat </h1> </center> <p> The storm tossed the little boat like a cheap sneaker in an old washing machine. The three drunken fishermen were used to such treatment, of course, but not the tree salesman, who even as a stowaway now felt that he had overpaid for the voyage. </p> <ol> <li> Will the salesman die? </li> <li> What color is the boat? </li> <li> And what about Naomi? </li> </ol> </body> The Little Boat The storm tossed the little boat like a cheap sneaker in an old washing machine. The three drunken fishermen were used to such treatment, of course, but not the tree salesman, who even as a stowaway now felt that he had overpaid for the voyage. 1. Will the salesman die? 2. What color is the boat? 3. And what about Naomi? For fully-correct HTML, each <name> should pair with a matching </name> © 2013 Goodrich, Tamassia, Goldwasser
  • 35. Stacks 35 Tag Matching Algorithm in Python © 2013 Goodrich, Tamassia, Goldwasser
  • 36. © 2013 Goodrich, Tamassia, Goldwasser Stacks 36 Evaluating Arithmetic Expressions 14 – 3 * 2 + 7 = (14 – (3 * 2) ) + 7 Operator precedence * has precedence over +/– Associativity operators of the same precedence group evaluated from left to right Example: (x – y) + z rather than x – (y + z) Idea: push each operator on the stack, but first pop and perform higher and equal precedence operations. Slide by Matt Stallmann included with permission.
  • 37. Algorithm for Evaluating Expressions Two stacks: • opStk holds operators • valStk holds values • Use $ as special “end of input” token with lowest precedence Algorithm doOp() x ¬ valStk.pop(); y ¬ valStk.pop(); op ¬ opStk.pop(); valStk.push( y op x ) Algorithm repeatOps( refOp ): while ( valStk.size() > 1 Ù prec(refOp) ≤ prec(opStk.top()) doOp() Algorithm EvalExp() Input: a stream of tokens representing an arithmetic expression (with numbers) Output: the value of the expression while there’s another token z if isNumber(z) then valStk.push(z) else repeatOps(z); opStk.push(z) repeatOps($); return valStk.top() © 2013 Goodrich, Tamassia, Goldwasser 37 Stacks Slide by Matt Stallmann included with permission.
  • 38. © 2013 Goodrich, Tamassia, Goldwasser Stacks 38 Algorithm on an Example Expression 14 ≤ 4 – 3 * 2 + 7 Operator ≤ has lower precedence than +/– – ≤ 14 4 * 3 – ≤ 14 4 2 * 3 – ≤ 14 4 + 2 * 3 – ≤ 14 4 + 6 – ≤ 14 4 + ≤ 14 -2 $ 7 + ≤ 14 -2 $ F $ ≤ 14 5 Slide by Matt Stallmann included with permission.
  • 39. Stacks 39 Computing Spans (not in book) • Using a stack as an auxiliary data structure in an algorithm • Given an an array X, the span S[i] of X[i] is the maximum number of consecutive elements X[j] immediately preceding X[i] and such that X[j] £ X[i] • Spans have applications to financial analysis • E.g., stock at 52-week high 6 3 4 5 2 1 1 2 3 1 X S 0 1 2 3 4 5 6 7 0 1 2 3 4 © 2013 Goodrich, Tamassia, Goldwasser
  • 40. Stacks 40 Quadratic Algorithm Algorithm spans1(X, n) Input array X of n integers Output array S of spans of X # S ¬ new array of n integers n for i ¬ 0 to n - 1 do n s ¬ 1 n while s £ i Ù X[i - s] £ X[i] 1 + 2 + …+ (n - 1) s ¬ s + 1 1 + 2 + …+ (n - 1) S[i] ¬ s n return S 1 Algorithm spans1 runs in O(n2) time © 2013 Goodrich, Tamassia, Goldwasser
  • 41. Stacks 41 Computing Spans with a Stack • We keep in a stack the indices of the elements visible when “looking back” • We scan the array from left to right • Let i be the current index • We pop indices from the stack until we find index j such that X[i] < X[j] • We set S[i] ¬ i - j • We push x onto the stack 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 © 2013 Goodrich, Tamassia, Goldwasser
  • 42. Stacks 42 Linear Algorithm Algorithm spans2(X, n) # S ¬ new array of n integers n A ¬ new empty stack 1 for i ¬ 0 to n - 1 do n while (¬A.is_empty() Ù X[A.top()] £ X[i] ) do n A.pop() n if A.is_empty() then n S[i] ¬ i + 1 n else S[i] ¬ i - A.top() n A.push(i) n return S 1 Each index of the array n Is pushed into the stack exactly one n Is popped from the stack at most once The statements in the while-loop are executed at most n times Algorithm spans2 runs in O(n) time © 2013 Goodrich, Tamassia, Goldwasser X = [6, 3, 4, 1, 2, 3, 5, 4]
  • 44. The Queue ADT • The Queue ADT stores arbitrary objects • Insertions and deletions follow the first-in first-out scheme • Insertions are at the rear of the queue and removals are at the front of the queue • FIFO = First In First Out • Exceptions • Attempting the execution of dequeue or front on an empty queue throws an EmptyQueueException • Main queue operations: • enqueue(object): inserts an element at the end of the queue • object dequeue(): removes and returns the element at the front of the queue • Auxiliary queue operations: • object first(): returns the element at the front without removing it • integer len(): returns the number of elements stored • boolean is_empty(): indicates whether no elements are stored © 2013 Goodrich, Tamassia, Goldwasser Queues 44
  • 45. The Queue ADT • Main queue operations: • enqueue(object): inserts an element at the end of the queue • object dequeue(): removes and returns the element at the front of the queue • Auxiliary queue operations: • object first(): returns the element at the front without removing it • integer len(): returns the number of elements stored • boolean is_empty(): indicates whether no elements are stored © 2013 Goodrich, Tamassia, Goldwasser Queues 45 head tail enqueue(obj) head tail obj = dequeue() head tail obj = first() head tail len()
  • 46. Queues 46 Example © 2013 Goodrich, Tamassia, Goldwasser
  • 47. Queues 47 Applications of Queues • Direct applications • Waiting lists • Access to shared resources (e.g., printer) • Multiprogramming • Indirect applications • Auxiliary data structure for algorithms • Component of other data structures © 2013 Goodrich, Tamassia, Goldwasser
  • 48. Queues 48 Queue in Python • Use the following three instance variables: • _data: is a reference to a list instance with a fixed capacity. • _size: is an integer representing the current number of elements stored in the queue (as opposed to the length of the data list). • _front: is an integer that represents the index within data of the first element of the queue (assuming the queue is not empty). © 2013 Goodrich, Tamassia, Goldwasser
  • 49. Queue in Python, Beginning © 2013 Goodrich, Tamassia, Goldwasser 49 Queues
  • 50. Queue in Python, Continued © 2013 Goodrich, Tamassia, Goldwasser 50 Queues
  • 51. Queues 51 Array-based Queue • Use an array of size N in a circular fashion • Two variables keep track of the front and rear f index of the front element r index immediately past the rear element • Array location r is kept empty Q 0 1 2 r f normal configuration Q 0 1 2 f r wrapped-around configuration © 2013 Goodrich, Tamassia, Goldwasser
  • 52. Queues 52 Queue Operations • We use the modulo operator (remainder of division) Algorithm size() return (N - f + r) mod N Algorithm isEmpty() return (f = r) Q 0 1 2 r f Q 0 1 2 f r © 2013 Goodrich, Tamassia, Goldwasser
  • 53. Queues 53 Queue Operations (cont.) Algorithm enqueue(o) if size() = N - 1 then throw FullQueueException else Q[r] ¬ o r ¬ (r + 1) mod N • Operation enqueue throws an exception if the array is full • This exception is implementation- dependent Q 0 1 2 r f Q 0 1 2 f r © 2013 Goodrich, Tamassia, Goldwasser
  • 54. Queues 54 Queue Operations (cont.) • Operation dequeue throws an exception if the queue is empty • This exception is specified in the queue ADT Algorithm dequeue() if isEmpty() then throw EmptyQueueException else o ¬ Q[f] f ¬ (f + 1) mod N return o Q 0 1 2 r f Q 0 1 2 f r © 2013 Goodrich, Tamassia, Goldwasser
  • 55. Queues 55 Application: Round Robin Schedulers • We can implement a round robin scheduler using a queue Q by repeatedly performing the following steps: 1. e = Q.dequeue() 2. Service element e 3. Q.enqueue(e) © 2013 Goodrich, Tamassia, Goldwasser Shared Service Queue Enqueue Dequeue
  • 57. The Deque ADT • The Deque ADT stores arbitrary objects • Insertions and deletions are happening at the both ends of the queue. • Exceptions • Attempting the remove executions on an empty deque throws an EmptyQueueException • Main queue operations: • add_first(object): inserts an element at the front of the deque. • add_last(object): inserts an element at the end of the deque. • object delete_first(): removes and returns an element at the front of the deque. • object delete_last(): removes and returns an element at the end of the deque. • Auxiliary queue operations: • object first(): returns the element at the front without removing it • object last(): returns the element at the end without removing it • integer len(): returns the number of elements stored • boolean is_empty(): indicates whether no elements are stored © 2013 Goodrich, Tamassia, Goldwasser Queues 57