Compsci 201 Recitation 12 Professor Peck Jimmy Wei 11/15/2013
In this Recitation Greedy algorithms – Brief intro – Practice Memoization – Brief intro – Practice Submit via form: The problems we cover today are also APTs! – Apt/
Greedy Algorithms What are they? – In short, an algorithm where continuously selecting local optima leads to a globally optimal solution – This is called “greedy” because we select the best solution for every subproblem – Will learn about greedy algorithms in more detail in Compsci 330
Greedy Algorithms As an example, consider the problem of making change: – We want to use as few coins as possible that amount to our total What coins would you give for $0.63? – 2 quarters, 1 dime, 3 pennies How did you determine that solution? – Start by using as many quarters as possible, then dimes, then nickels, then pennies – Can you see how this is “greedy”?
Greedy Algorithms – Answer 1-3 Time for practice! Read over the VoteRigging APT and write the following method: Answering the questions will help you write this code—think about what the greedy choice is here and how that leads to our solution /** * Returns the minimum number of votes to buy for candidate 0 to win * Returns the minimum number of votes to buy for candidate 0 to win * the election * the election votes is an array where the ith element represents votes is an array where the ith element represents * how many individuals were originally plan to vote for the ith candidate * how many individuals were originally plan to vote for the ith candidate */ */ public int minimumVotes(int[] votes); /** * Returns the minimum number of votes to buy for candidate 0 to win * Returns the minimum number of votes to buy for candidate 0 to win * the election * the election votes is an array where the ith element represents votes is an array where the ith element represents * how many individuals were originally plan to vote for the ith candidate * how many individuals were originally plan to vote for the ith candidate */ */ public int minimumVotes(int[] votes);
Greedy Algorithms – Answer 4-6 Time for practice! Read over the OlympicCandles APT and write the following method: Answering the questions will help you write this code—think about what the greedy choice is here and how that leads to our solution /** * Returns the maximum number of nights you can light candles * Returns the maximum number of nights you can light candles candles is an array where the ith element represents the height of candles is an array where the ith element represents the height of * the ith candle you have available * the ith candle you have available */ */ public int numberOfNights(int[] candles); /** * Returns the maximum number of nights you can light candles * Returns the maximum number of nights you can light candles candles is an array where the ith element represents the height of candles is an array where the ith element represents the height of * the ith candle you have available * the ith candle you have available */ */ public int numberOfNights(int[] candles);
Memoization What is it? – No, it’s not “memorization”… no ‘r’ – Refers to the idea that as we solve problems we might sometimes need to reuse solutions to subproblems, so we store them instead of recalculating them – Also will learn more about this and dynamic programming in CS330
Memoization As an example, think of recursive fibonacci: – What’s wrong with the recursive solution below? – We recalculate fibonacci for low values of n – Instead, we could store those values in a data structure (memoize) so that we don’t have to recalculate them! public int fibonacci(int n) { return (n<=2) ? 1 : fibonacci(n-1) + fibonacci(n-2); return (n<=2) ? 1 : fibonacci(n-1) + fibonacci(n-2);} public int fibonacci(int n) { return (n<=2) ? 1 : fibonacci(n-1) + fibonacci(n-2); return (n<=2) ? 1 : fibonacci(n-1) + fibonacci(n-2);}
Memoization Time for practice! Read over the BSTCount APT and write the following method: Think about the subproblems you need to solve here and how we can store the solutions to those subproblems to avoid having to recalculate them /** * Returns the total number of possible BSTs with the given values * Returns the total number of possible BSTs with the given values values is an array holding all values that need to be stored in values is an array holding all values that need to be stored in * the BST * the BST */ */ public long howMany(int[] values); /** * Returns the total number of possible BSTs with the given values * Returns the total number of possible BSTs with the given values values is an array holding all values that need to be stored in values is an array holding all values that need to be stored in * the BST * the BST */ */ public long howMany(int[] values);
Have a good weekend! Don’t forget to submit!