1 / 53

Announcements

Announcements. Midterm next week!  No class next Friday Review this Friday. More than one way to solve a problem. There ’ s always more than one way to solve a problem. You can walk to a given place by going around the block, or by taking a shortcut across a parking lot.

bunme
Download Presentation

Announcements

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Announcements • Midterm next week!  • No class next Friday • Review this Friday

  2. More than one way to solve a problem • There’s always more than one way to solve a problem. • You can walk to a given place by going around the block, or by taking a shortcut across a parking lot. • Some solutions are better than others. • How do you compare them?

  3. Our programs (functions) implement algorithms • Algorithms are descriptions of behavior for solving a problem. • Programs (functions for us) are executable interpretations of algorithms. • The same algorithm can be implemented in many different languages.

  4. How do we compare algorithms? • There’s more than one way to search. • How do we compare algorithms to say that one is faster than another? • Computer scientists use something called Big-O notation • It’s the order of magnitude of the algorithm • Big-O notation tries to ignore differences between languages, even between compiled vs. interpreted, and focuses on the number of steps to be executed.

  5. What question are we trying to answer? • If I am given a larger problem to solve (more data), how is the performance of the algorithm affected? • If I change the input, how does the running time change?

  6. How can we determine the complexity? • Step 1: we must determine the “input” or what data the algorithm operates over • Step 2: determine how much “work” is needed to be done for each piece of the input • Step 3: eliminate constants and smaller terms for big O notation

  7. Lets take a step back … • In the first week we introduce the notion of searching a phone book as an algorithm • Algorithm 1: • Start at the front, check each name one by one • Algorithm 2: • Use the index to jump to the correct letter • Algorithm 3: • Split in half, choose which half has the name, repeat until found

  8. def loops(): count = 0 for x in range(1,5): for y in range(1,3): count = count + 1 print (x,y,"--Ran it",count,"times”) >>> loops() 1 1 --Ran it 1 times 1 2 --Ran it 2 times 2 1 --Ran it 3 times 2 2 --Ran it 4 times 3 1 --Ran it 5 times 3 2 --Ran it 6 times 4 1 --Ran it 7 times 4 2 --Ran it 8 times Nested loops are multiplicative

  9. Big-O notation ignores constants • Consider if we executed a particular statement 3 times in the body of the loop • If we execute each loop 1 million times this constant becomes meaningless (ie: n = 1,000,000) • O(n2) is the same as O(3n2) def loops(n): count = 0 for x in range(1,n): for y in range(1,n): count = count + 1 count = count + 1 count = count +1

  10. Lets compare our phone book search algorithms • Algorithm 1: • Start at the front, check each name one by one • O(n) • Algorithm 2: • Use the index to jump to the correct letter • O(n/26) … O(1/26 * n) … O(n) • Algorithm 3: • Split in half, choose which half has the name, repeat until found • O(log n)

  11. More on big O notation • http://en.wikipedia.org/wiki/Big_Oh_notation • Additional background • We mentioned that big O notation ignores constants • Lets look at this more formally: • Big O notation characterizes functions (algorithms in our case) by their growth rate

  12. Identify the term that has the largest growth rate Num of steps growth term complexity • 6n + 3 6n O(n) • 2n2 + 6n + 3 2n2 O(n2) • 2n3 + 6n + 3 2n3 O(n3) • 2n10 + 2n+ 3 2nO(2n) • n! + 2n10 + 2n + 3 n! O(n!)

  13. Comparison of complexities:fastest to slowest • O(1) – constant time • O(log n) – logarithmic time • O(n) – linear time • O(n log n) – log linear time • O(n2) – quadratic time • O(2n) – exponential time • O(n!) – factorial time

  14. Do we know of any O(1) algorithms? • These are “constant time” algorithms • Simple functions that contain no loops are usually O(1) • Example: defrandomChoice(list): return list[int(random.random() * len(list))]

  15. Finding something in the phone book • O(n) algorithm • Start from the beginning. • Check each page, until you find what you want. • Not very efficient • Best case: One step • Worse case: n steps where n = number of pages • Average case: n/2 steps

  16. What about algorithm 2? • Recall that algorithm 2 for finding a name in the phone book used the index • Can we make this algorithm faster by having an index for each letter? • Would such an algorithm have a lower running time than our binary search? • Would it have a lower complexity?

  17. What about our encrypt and decrypt functions? • How might we reason about the complexity of the functions we wrote in project 3? • First lets determine the input! • The message we want to encrypt or decrypt • How much work do we do for each character? • We do a constant amount of work

  18. Clicker Question • What is the complexity of the encrypt function? A: O(n) B: O(n2) C: O(1)

  19. Some errors in Project 3What is the complexity? defcolumnarEncipher(msg, key): m = … #create matrix for x in msg: forx in range(rows): for y in range (columns): # some calculation

  20. Not all algorithms are the same complexity • There is a group of algorithms called sorting algorithms that place things (numbers, names) in a sequence. • Some of the sorting algorithms have complexity around O(n2) • If the list has 100 elements, it’ll take about 10,000 steps to sort them. • However, others have complexity O(n log n) • The same list of 100 elements would take only 460 steps. • Think about the difference if you’re sorting your 100,000 customers…

  21. We want to choose the algorithm with the best complexity • We want an algorithm which will be fast • A “lower” complexity mean an algorithm will perform better on large input

  22. Homework • Study for the midterm

  23. Announcements • Midterm on Tuesday

  24. Lists, Tuples, Dictionaries, Strings • All use bracket notation to access elements [] • Lists, Tuples, and Strings use an index to access an element • We consider such structures ordered • Dictionaries use keys to access elements • We consider dictionaries unordered

  25. Creating Structures • Lists – use the [ ] notation • List = [1, 2, 3, 4, 5, “foo”] • Strings use the “ “ notation (or ‘ ‘ , or ‘’’ ‘’’) • String = “this is my string” • Dictionaries use the { } notation • Dictionary = {“key1”:”value1”, “key2”:”value2”} • Tuples use the ( ) notation • Tuple = (1, 2, 3, 4, 5, “foo”)

  26. Immutable Structures • Tuples and Strings are considered immutable • What does this mean in practice? • We cannot assign new values to the indexes in such structures • Errors for strings and tuples: • A = “mystring” A[3] = “b” • B = (1, 3, 4, “foo”) B[2] = 5

  27. Structures can contain other structures • Lists, Dictionaries, and Tuples can contain elements which themselves are Lists, Dictionaries, or Tuples • What have we seen before? • a = [(“key1”, “value1”), (“key2”, “value2”)] • Dictionary = dict(a) • a is a list of tuples

  28. What else can we do? • We could have a tuple of lists: • d = ([0,1,2], [3,4,5]) • print (d[0][2]) • A = [4,5,6] • C= (A, A) • We could have a list of dictionaries: • e = [{“key1”:”value1”, “key2”:”value2”}, {“key3”:”value3”, “key4”:”value4”}] • print (e[1][“key4”])

  29. A few notes on Dictionaries • Review how to print a dictionary and how to print just the keys • What happens when “key” is not a valid key in the dictionary dictionary and we do: • dictionary[“key”] = value • This adds a new entry into the dictionary!

  30. Specialized Structures built from structures containing structures • Matrices • Represented as a list of lists • The internal lists are either rows or columns • Trees • Represented as an arbitrary nesting of lists • The structure of the elements represents the branching of the tree

  31. Matrices • Review matrix multiplication • Review how to populate a matrix • Go through the pre lab examples • Review how to create a matrix • Python short hand

  32. Traversing a Matrix • Is B encoded column by column or row by row? • We do not know • …. But what if I told you this loop prints the matrix row by row? • B = [[1, 0, 0], [0.5, 3, 4], [-1, -3, 6], [0, 0, 0]] • forj in range(3): • fori in range(4): • print (B[i][j])

  33. How do we find out how the matrix is encoded? • Step one: figure out the order in which the values are printed • 1, 0.5, -1, 0, 0, 3, -3, 0 , 0, 4, 6, 0 • Step two: compare this to the matrix • B = [[1, 0, 0], [0.5, 3, 4], [-1, -3, 6], [0, 0, 0]] • Step three: deduce the encoding by comparing the order to the matrix • The matrix is encoded column by column!

  34. Applying the same intuition to matrices • Lets traverse the matrix the other way! • B = [[1, 0, 0], [0.5, 3, 4], [-1, -3, 6], [0, 0, 0]] • forj in range(3): • fori in range(4): • print (B[i][j]) • foriin range(4): • forj in range(3): • print (B[i][j])

  35. Trees • Know how to select elements from a tree • Know how to construct a tree using lists • You do not need to know how to add trees

  36. Given the picture can you generate the python list? Root Leaf2 Leaf0 Leaf1 Leaf3 Leaf4 Leaf5 Tree = [[‘Leaf0’,‘Leaf1’], ‘Leaf2’, [‘Leaf3’, ‘Leaf4’, ‘Leaf5’]]

  37. Indexes provide us a way to “traverse” the tree Root 1 2 0 Leaf2 0 1 0 1 2 Leaf0 Leaf1 Leaf3 Leaf4 0 1 Leaf5 Leaf6 Tree = [[‘Leaf0’,‘Leaf1’], ‘Leaf2’, [‘Leaf3’, ‘Leaf4’, [‘Leaf5’, ‘Leaf6’]]] Tree[2]

  38. Indexes provide us a way to “traverse” the tree Root 1 2 0 Leaf2 0 1 0 1 2 Leaf0 Leaf1 Leaf3 Leaf4 0 1 Leaf5 Leaf6 Tree = [[‘Lead0’,‘Leaf1’], ‘Leaf2’, [‘Leaf3’, ‘Leaf4’, [‘Leaf5’, ‘Leaf6’]]] Tree[2][2]

  39. Indexes provide us a way to “traverse” the tree Root 1 2 0 Leaf2 0 1 0 1 2 Leaf0 Leaf1 Leaf3 Leaf4 0 1 Leaf5 Leaf6 Tree = [[‘Lead0’,‘Leaf1’], ‘Leaf2’, [‘Leaf3’, ‘Leaf4’, [‘Leaf5’, ‘Leaf6’]]] Tree[2][2][1]

  40. Modules • urllib • Allows us to get data directly from webpages • Random • Allows us to generate random numbers and choose randomly from a list

  41. Examples Using Random • random.random() • Returns a random floating point number between 0 and 1 (but not including 1) • How might we generate a random number between 0 and 9? • int(random.random() * 10) • Why is this the case? Why do we need int? • How might we generate a random number between 0 and 99?

  42. Randomly selecting from a list • random.choice(list) • Example: random.choice([“a”, “b”, “c”]) • Will return either “a”, “b”, or “c” • How might we do this a different way? • We know we can choose a random number within a specific range (previous slide) • We know we can use an integer as an index

  43. Combining our intuition • random.choice([“a”, “b”, “c”]) • [“a”, “b”, “c”][int(random.random() *3)] • Both these are equivalent, why?

  44. File I/O • What is the difference between the various modes? • We saw in class “w” “r” What is the difference between read, readline, and readlines?

  45. Methods on Files • object.method() syntax: this time files are our object • Example: file = open(“myfile”, “w”) • file.read() -- reads the file as one string • file.readlines() – reads the file as a list of strings • file.write() – allows you to write to a file • file.close() – closes a file

  46. Strings and Parsing • What are the most important operations? • find • rfind • split • Slicing

  47. Lets Review Some Python • string.find(sub) – returns the lowest index where the substring sub is found or -1 • string.find(sub, start) – same as above, except using the slice string[start:] • string.find(sub, start, end) – same as above, except using the slice string[start:end]

  48. Lets Review Some Python • string.rfind(sub) – returns the highest index where the substring sub is found or -1 • string.rfind(sub, start) – same as above, except using the slice string[start:] • string.rfind(sub, start, end) – same as above, except using the slice string[start:end]

  49. The String Method Split • String.split(delimiter) breaks the string String into parts, separated by the delimiter • print (“a b c d”.split(“ “)) Would print: [‘a’, ‘b’, ‘c’, ‘d’]

  50. Concrete Example foo = ”there their they’re” elem= foo.split(" ”) for i in elem: print(i.split(“e")) [‘th', ‘r’, ‘’] [‘th', ‘ir'] [‘th', “y’r”, ‘’]

More Related