Тщательная оценка:
Эта программа имеет специальную функцию: она завершается, если найдена пара (a[I], a[J])
равных значений.Предположим, что мы знаем I
и J
(позже мы увидим, что если такой пары нет).
Внешний цикл выполняется для всех I <= i < L
, следовательно, L-I
раз.Каждый раз внутренний цикл выполняется для всех 0 <= j < i
, следовательно, i
раз, кроме последнего прохода (i = I
): у нас есть J <= j < I
, следовательно, I-J
итераций.
Мы предполагаемчто «стоимость» цикла имеет вид a N + b
, где a
- это стоимость одной итерации и b
некоторые постоянные издержки.
Теперь для внутреннего цикла, который выполняетсяL-I
раза с уменьшением количества итераций, используя формулу "треугольных чисел", стоимость составляет
a (L-1 + L-2 + ... I+1 + I-J) + b (L - I) = a ((L-1)L/2 - I(I+1)/2 + I-J) + b (L-I)
, к которой мы добавляем стоимость внешнего цикла, чтобы получить
a ((L-1)L/2 - I(I+1)/2 + I-J) + b (L-I) + c
(где b
- это константа, отличная от приведенной выше).
Обычно эта функция квадратична в L
, но если пара быстро обнаруживается (скажем, I = L-3
), она становится линейной;в лучшем случае (I = L-1
, J = L-2
) это даже постоянная a + b + c
.
Наихудший случай происходит, когда пара находится последней (I = 1
, J = 0
), чтопрактически эквивалентно не найдена пара.Тогда у нас есть
a (L-1)L/2 + b (L - 1) + c
очевидно O(L²)
.