Design and Analysis of Algorithms part I Stanford University