Introduction to the Analysis of Algorithms by Robert Sedgewick and Philippe Flajolet