ECE 241 –Advanced Programming I Mike Zink 241 F18 Lecture 5.pdf · 9/20/18 3 ECE 241 – Data...
Transcript of ECE 241 –Advanced Programming I Mike Zink 241 F18 Lecture 5.pdf · 9/20/18 3 ECE 241 – Data...
9/20/18
1
Lecture5DataStructuresinPython
ECE241–AdvancedProgrammingIFall2018MikeZink
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Overview
1
• DataStructures• Stack• Queue• Deque• Lists
9/20/18
2
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Objective
• Learnaboutdifferenttypeofdatastructuresandhowtheycanbeimplemented inPython
• Learnaboutthe interplaybetweendatastructureandalgorithms
• Beabletoimplement datastructurestoenabletheefficientperformingofalgorithms
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Linear Data Structures
3
• Examples:stacks,queues,dequeues,andlists• Datacollections ofordereditems• Orderdependsonhowitemsareaddedandremoved
• Onceaddeditemstaysinposition
9/20/18
3
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Linear Data Structures - Characteristics
4
• Twoends(left– right,front– rear)• Linearstructuresdistinguished byhowitemsareaddedandremoved
• E.g.,additionsofnewitemsonlyallowedattheend(queue)
• Appearinmanyalgorithms
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack
5
• Orderedcollectionofitems• Addition/removalofitemsalwaystakesplaceatsameend(top)
• Baserepresentsbottomancontainsitemhasbeeninstackthelongest
• Mostrecentlyaddedtoberemovedfirst(last-in-first-out,LIFO)
• Top:neweritems; bottom:loweritems
9/20/18
4
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack
6
• Stackofobjects– Whataresuitableoperationsonastack?
• Examplesofstacks?
Object
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Applications Using Stacks
7
• Reverseorder(e.g.,lettersinword)• Stackimplements LIFO(last-in-first-out)
• Reverse“algorithm”
9/20/18
5
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Applications Using Stacks
8
• Checkifdelimiters arematched• Matchingofopeningandclosingsymbols:{,},[,],(,)
• Check:{{a}[b]{[{c}](d(e)f)}((g))}and({[a}b(c)])
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Applications Using Stacks
9
• Solvemaze:• Atintersection: down,left,up,right(butnotback)
• Solve: A B C D E F G
1
2 start
3
4
5
6 exit
7
8
9
9/20/18
6
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack - Abstract Data Type
10
• Stack() creates a new, empty stack; no parameters and returns an empty stack.
• push(item) adds a new item at top of stack; needs the item and returns nothing.
• pop() removes top item; needs no parameters, returns item, stack is modified
• peek() returns top item from the stack but doesn’t remove it; needs no parameters, stack is not modified
• isEmpty() test if stack is empty; needs no parameters, returns a boolean value
• size() returns number of items on stack; needs no parameters; returns an integer
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack Example
11
Stack Operation Stack Contents Return Value
s.isEmpty() [] True
s.push(4) [4] s.push('dog') [4,'dog'] s.peek() [4,'dog'] 'dog' s.push(True) [4,'dog',True] s.size() [4,'dog',True] 3
s.isEmpty() [4,'dog',True] False
s.push(8.4) [4,'dog',True,8.4] s.pop() [4,'dog',True] 8.4
s.pop() [4,'dog'] True
s.size() [4,'dog'] 2
9/20/18
7
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Implementing Stack in Python
12
class Stack:def __init__(self):
self.items = []
def isEmpty(self): return self.items == []
def push(self, item):self.items.append(item)
def pop(self):return self.items.pop()
def peek(self):return self.items[len(self.items) - 1]
def size(self):return len(self.items)
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack Class in Action
13
from Stack import Stack
s=Stack()
print(s.isEmpty())s.push(4) s.push('dog')print(s.peek())s.push(True)print(s.size())print(s.isEmpty())s.push(8.4) print(s.pop())print(s.pop())print(s.size())
9/20/18
8
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Implementation as a List?
14
• Implement listwheretopofstackisbeginningoflist
• pop() andappend()no longerwork
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack as List
15
class StackList:def __init__(self):
self.items = []
def isEmpty(self):return self.items == []
def push(self, item):self.items.insert(0,item)
def pop(self):return self.items.pop(0)
def peek(self):return self.items[0]
def size(self):return len(self.items)
9/20/18
9
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Stack Analysis
16
• Abstractdatatype• Changephysicalimplementationwhilemaintaining logicalcharacteristics
• append() and pop() operationsarebothO(1)
• insert(0) and pop(0) operations both require O(n) for a stack of size n
• Verydifferenttimings
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Queue
17
• Orderedcollectionofitems• Additemsononeend• Removeitemsontheotherend• Itemstartsattherearandmakesitswaytothefront=>first-infirst-out(FIFO)
in out
9/20/18
10
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Queue Examples
18
• Checkout line• Printerqueue• Take-offatairport• Queues innetworkequipment likeswitchesandrouters
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Queue - Abstract Data Type
19
• Queue() creates a new, empty queue; no parameters and returns an empty queue.
• enqueue(item) adds a new item to rear of queue; needs the item and returns nothing.
• dequeue() removes front item; needs no parameters, returns item, queue is modified
• isEmpty() test if queue is empty; needs no parameters, returns a boolean value
• size() returns number of items in the queue; needs no parameters; returns an integer
9/20/18
11
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Queue Example
20
Queue Operation Queue Contents Return Value
q.isEmpty() [] True
q.enqueue(4) [4]
q.enqueue('dog') ['dog',4]
q.enqueue(True) [True,'dog',4]
q.size() [True,'dog',4] 3
q.isEmpty() [True,'dog',4] False
q.enqueue(8.4) [8.4,True,'dog',4]
q.dequeue() [8.4,True,'dog'] 4
q.dequeue() [8.4,True] 'dog'
q.size() [8.4,True] 2
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Implementing Queue in Python
21
class Queue:def __init__(self):
self.items = []
def isEmpty(self): return self.items == []
def enqueue(self, item):self.items.insert(0,item)
def dequeue(self):return self.items.pop()
def size(self):return len(self.items)
9/20/18
12
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Queue Class in Action
22
from Queue import Queue
q=Queue()
q.enqueue(4)q.enqueue('dog')q.enqueue(True)print(q.size())
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Hot Potato
23
9/20/18
13
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Implementation as Queue
24
from Queue import Queue
def hotPotato(namelist, num):simqueue = Queue()for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1: for i in range(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
return simqueue.dequeue()
print(hotPotato(["Bill","David","Susan","Jane","Kent","Brad"],7))
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Deque
25
• Verysimilartoqueue• BUT,itemscanbeaddedatfrontandrear• Sameforremovingitems• DoesnotrequireFIFOandLIFO!
in in
out out
9/20/18
14
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Deque - Abstract Data Type
26
• Deque() creates a new, empty deque; no parameters and returns an empty queue.
• addFront(item) adds a new item to front of deque; needs the item and returns nothing.
• addRear(item) adds a new item to rear of deque; needs the item and returns nothing
• removeFront() removes front item; needs no parameters, returns item, queue is modified
• removeRear() removes rear item; needs no parameters, returns item, queue is modified
• isEmpty() test if deque is empty; needs no parameters, returns a boolean value
• size() returns number of items in the deque; needs no parameters; returns an integer
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Deque Example
27
Deque Operation Deque Contents Return Value
d.isEmpty() [] True
d.addRear(4) [4]
d.addRear('dog') ['dog',4,]
d.addFront('cat') ['dog',4,'cat']
d.addFront(True) ['dog',4,'cat',True]
d.size() ['dog',4,'cat',True] 4
d.isEmpty() ['dog',4,'cat',True] False
d.addRear(8.4) [8.4,'dog',4,'cat',True]
d.removeRear() ['dog',4,'cat',True] 8.4
d.removeFront() ['dog',4,'cat'] True
9/20/18
15
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Implementing Deque in Python
28
class Deque:def __init__(self):
self.items = []
def isEmpty(self): return self.items == []
def addFront(self, item):self.items.append(item)
def addRear(self, item):self.items.insert(0,item)
def removeFront(self):return self.items.pop()
def removeRear(self):return self.items.pop(0)
def size(self):return len(self.items)
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Deque Class in Action
29
from Deque import Deque
d=Deque()print(d.isEmpty())d.addRear(4)d.addRear('dog')d.addFront('cat')d.addFront(True)print(d.size())print(d.isEmpty())d.addRear(8.4)print(d.removeRear())print(d.removeFront())
9/20/18
16
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Palindrome Checker
30
• String that reads the same forward and backward
• Radar• Hannah• Madam, I'm Adam
• Usedeque andchecklettersonbothends• Removelettersuntildifferentoronlyoneleft
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Palindrome Checker Code
31
from Deque import Deque
def palchecker(aString):chardeque = Deque()
for ch in aString:chardeque.addRear(ch)
stillEqual = True
while chardeque.size() > 1 and stillEqual:first = chardeque.removeFront()last = chardeque.removeRear()if first != last:
stillEqual = False
return stillEqual
print(palchecker("lsdkjfskf"))print(palchecker("radar"))
9/20/18
17
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Lists
32
• Used Python lists to implement abstract data types
• Notincludedbyallprogramminglanguages• Listiscollection ofitemswhereeachholdsrelativeposition(firstitem,seconditem,thirditem,etc.)
• Simpleunsorted listforscores:54,26,93,17,77,31
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unordered List Abstract Data Type
33
• List() creates a new, empty list; no parameters and returns an empty list.
• add(item) adds a new item to the list; needs the item and returns nothing; assume item is not already in list
• remove(item) removes item from list; needs item and modifies list; assume item is present in list
• search(item) searches for item in list; needs item, returns a boolean value
• isEmpty() test if list is empty; needs no parameters, returns a boolean value
• size() returns number of items in list; needs no parameters; returns an integer
9/20/18
18
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unordered List Abstract Data Type
34
• append(item) adds a new item to end of list; needs the item and returns nothing; assume item is not already in list
• index(item) returns position of item in list; needs item and returns index; assumes item is in list
• insert(pos, item) adds a new item to list at position pos; needs item, returns nothing; assume item is not already in list and enough exiting items to have position pos
• pop() removes and returns last item; needs nothing and returns item; assume list has at least one item
• pop(pos) removes and returns item at position pos; needs position and returns item; assume item is in the list
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Linked List
35
54
31 (End)
77
17
93
26Head
54
31
77
17
93
26
9/20/18
19
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Node Class
36
class Node:def __init__(self,initdata):
self.data = initdata self.next = None
def getData(self):return self.data
def getNext(self):return self.next
def setData(self,newdata):self.data = newdata
def setNext(self,newnext):self.next = newnext
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Node Class
37
9/20/18
20
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unordered List
38
• Build from collection of nodes• Eachlinkedtothenextbyreference
• Mustcontainreferencetofirstnode
class UnorderedList:
def __init__(self): self.head = None
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List
39
>>> mylist = UnorderedList()
• Initially
• Eventually
9/20/18
21
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unordered List
40
def isEmpty(self):return self.head == None
>>> mylist.add(31)>>> mylist.add(77)>>> mylist.add(17)>>> mylist.add(93)>>> mylist.add(26)>>> mylist.add(54)
• Since item 31 was entered first, it will be last element in list
• 54willbefirst
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unordered List Add
41
def add(self,item):temp = Node(item)temp.setNext(self.head)self.head = temp
• Result when lines 3 and 4 are swapped
9/20/18
22
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Linked List Traversal
42
def size(self):current = self.headcount = 0while current != None:
count = count + 1current = current.getNext()
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Search
43
def search(self,item):current = self.headfound = Falsewhile current != None and not found:
if current.getData() == item: found = True else:
current = current.getNext()
return found
9/20/18
23
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Search
44
>>> mylist.search(17)
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Remove
45
• Two step approach• Find• Remove
• Howtoremovenode?• Removenode• Useprevious andcurrent
9/20/18
24
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Remove
46
def remove(self,item):current = self.headprevious = Nonefound = Falsewhile not found:
if current.getData() == item: found = True else:
previous = currentcurrent = current.getNext()
if previous == None:self.head = current.getNext()
else: previous.setNext(current.getNext())
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Remove
47
9/20/18
25
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Unsorted List: Remove
48
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List
49
• If list used above were ordered: 17, 26, 31, 54, 77, 93
9/20/18
26
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List
50
• OrderedList() creates a new, empty ordered list; no parameters and returns an empty list .
• add(item) adds a new item to the list; preserves order; needs the item and returns nothing; assume item is not already in list
• remove(item) removes item from list; needs item and modifies list; assume item is present in list
• search(item) searches for item in list; needs item, returns a boolean value
• isEmpty() test if list is empty; needs no parameters, returns a boolean value
• size() returns number of items in list; needs no parameters; returns an integer
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List
51
• index(item) returns position of item in list; needs item and returns index; assumes item is in list
• pop() removes and returns last item; needs nothing and returns item; assume list has at least one item
• pop(pos) removes and returns item at position pos; needs position and returns item; assume item is in the list
9/20/18
27
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List
52
class OrderedList:def __init__(self):
self.head = None
• isEmpty and size implement as in unordered list
• Likewise remove will work as expected• search and add require modification
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List: Search
53
def search(self,item):current = self.headfound = Falsestop = Falsewhile current != None and not found and not stop:
if current.getData() == item: found = True else: if current.getData() > item: stop = True else: current = current.getNext()
return found
9/20/18
28
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List: Add
54
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Ordered List: Add
55
def add(self,item):current = self.headprevious = Nonestop = Falsewhile current != None and not stop:
if current.getData() > item: stop = True else:
previous = currentcurrent = current.getNext()
temp = Node(item)if previous == None:
temp.setNext(self.head) self.head = temp else:
temp.setNext(current)previous.setNext(temp)
9/20/18
29
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Binary Search
56
• Takegreateradvantageoforderedlistwithclevercomparisons
• Startexaminingthemiddle item• Theonesearchingfor->done• Itemsearchingfor≥middle item->eliminate lowerhalfandmiddle itemfromsearch
• Continueprocesswithupperhalf
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Binary Search
57
• Exampleforfinding54
9/20/18
30
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Binary Search
58
def binarySearch(alist, item):first = 0
last = len(alist)-1 found = False
while first<=last and not found: midpoint = (first + last)//2
if alist[midpoint] == item: found = True else: if item < alist[midpoint]: last = midpoint-1 else: first = midpoint+1
return found
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]print(binarySearch(testlist, 3))print(binarySearch(testlist, 13))
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Binary Search: Analysis
59
• Eachcomparisoneliminates ~1/2ofremainingitemsfromconsideration
• Startwithnitems,n/2 items leftafter1stcomparison(secondn/4,thirdn/8,etc.)
• Ith item=> !"#
• O(logn)
9/20/18
31
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink
Next Steps
60
• NextlectureonThursday• HW2willbepostedonThursday
ECE 241 – Data Structures Fall 2018 © 2018 Mike Zink61