Давайте немного подумаем о том, что делает этот алгоритм.
Вы в основном прокручиваете каждый элемент массива хотя бы один раз (внешний для, с i). Иногда, если значение A [i] равно 1, вы снова повторяетесь через весь цикл с помощью j.
В вашем худшем случае вы работаете против массива всех 1.
В этом случае ваша сложность:
- время инициализации S
- N * (время, чтобы протестировать [я] == 1 + п * Время {константа ...})
Который означает: T = T (s) + n * (T) (t)) = n^2 * T (const) + n * T (test) + T (с). Асимптотически это O (n^2).
Но это был анализ наихудшего случая (тот, который вы должны выполнять большую часть времени). Что делать, если мы хотим провести анализ среднего случая?
В этом случае, предполагая равномерное распределение значений в A, вы получите доступ к циклу for j в среднем в 1/6 раза.
Значит, вы получите: - время для инициализации s - n * (время для проверки [i] == 1 + 1/6 * n * время {константа ...} + 5/6 * T (приращение s)
Это означает: T = T (s) + n * (T (test) + 1/6 * n * T (const) + 5/6 * T (inc s)) = 1/6 * n^2 * T (const) + n * (5/6 * T (inc s) + T (test)) + T (s).
Опять же асимптотически это все еще O (n^2), но в соответствии со значением T (inc s) это может быть больше или меньше, чем в другом случае.
Удовольствие: можете ли вы оценить ожидаемый средний пробег время для общего распределения значений в A вместо однородного?
Что такое A [i]?Вы никогда не инициализируете его. –
В чем сложность 'A [i]' тоже? –
Ну, только вопрос показывает, что A - это массив из n целых чисел, каждый из которых является случайным значением от 1 до 6 ... – Wei