Why estimate runtime complexity over something such as the number of statements?
Runtime complexity is more about the projected growth alongside the main input parameter. In a way, it is counting the number of statements and you would likely arrive at the same conclusion. The statements that are being counted are the subset that matters most.
How does runtime complexity relate to math functions?
In two ways: mathematical functions can be described the same way as functions in programming, since they rest on the same fundamental construct; and math functions are used to express the runtime complexity itself, in particular the logarithmic and exponential functions.
Is the complexity class that is typically provided the best or worst case?
The worst case, since this will be the slowest/most inefficient case.
Why are loops important in estimating complexity?
Loops are great...