What specific approach to efficient algorithms should we take?
Identify broad themes and design principles which we can apply to a variety of problems.\
Learn to apply these themes and principles to actual problems that vary our implementations subtlety.
We should learn the distinction between different combinatorial approaches as to improve efficiency whether it's storage, computational speed, etc.
What is an efficient algorithm?
An algorithm is efficient if, when implemented, it runs quickly on real input instances.
This definition misses some points though like where and how well we implement the algorithm, what a real input instance is, and how does it scale.
Worst-Case Running Times and Brute-Force Search
Slowest possible run-time of an algorithm given size N.
Useful because it's often hard to quantify the average-case scenario or input for an algorithm.
To tell if a worst-case runtime is efficient, compare it to a brute-force method.
Ex. brute forcing the stable matching algorithm is O(n!) while the worst-case scenario is only O(n^2).
New definition for efficient algorithm:
Polynomial Time Definition
A “reasonable” running time is when an input * size is scaled by a constant factor, the algorithm will only slow down by a constant factor.
An algorithm is efficient if it has a polynomial running time.
While this is sometimes vague or fails for some extreme examples, it's better than the first two definitions.
This definition is good because some questions just don't have efficient solutions while others do.