Beyond the Worst-Case Analysis of Algorithms