When we encounter a loop, we compute the run time by adding up the time required for an average number of iterations.
Special Case: constant # of iterations If we knew that the loop would terminate after exactly k iterations, where k was a constant, then the rule would be
where `t_{text{condition}}(i)` is the average time required to evaluate the condition on the ith iteration, and `t_{text{body}(i)` is the time to evaluate the body on the ith iteration.
General case: unknown # of iterations But in many cases, the number of iterations is not a constant but depends on the inputs. In general, if `p_k` is the probability that the loop would terminate after `k` iterations, the average running time would be:
where `t_{text{condition}}(i: k)` is the average time required to evaluate the condition on the ith iteration when the loop will take k total iterations, and `t_{text{body}}(i: k)` is defined similarly for loop bodies.
This is a fairly messy formula, but we'll usually fall back on special cases.
The `t_{text{condition}}(k+1: k)` term reflects the fact that, on the final iteration, we evaluate the condition but do not execute the body.
The `\infty` is not a mistake. It expresses the general case that some loops could execute an arbitrary number of times depending upon the input. If, however, we knew that a loop never executed more than, say, 100 times, then the probabilities `p_{101}, p_{102}, \ldots would all be zero.
Suppose that we knew that k was a constant. Then `p_k = 1` for that single value of k, and `p_j = 0` for all `j != k`. That leads directly to our earlier special case.
Special case: fixed bound on body & condition If `(t_{text{condition}}(i: k) + t_{text{body}}(i: k))` does not vary from one iteration to another, then
Special case: fixed bound and equally probable iterations If the loop condition and body times do not vary across iterations, and we know that the loop takes anywhere from M to N iterations, and that each number of iterations in that range is equally likely, then
In the Forum: