Задать вопрос
@Dreaded

Должно ли количество итераций соответствовать асимптотической сложности алгоритма?

В данный момент изучаю алгоритмы, и возникло некое недопонимание термина асимптотической сложности алгоритма.
Например : мы знаем , что алгоритм SelectionSort имеет сложность O(n^2) и в лучшем и в худшем случае.
Я подсчитываю в своём алгоритме количество итераций, и при n=100 мы всегда получаем количество итераций 5050. При n=200 - 20100 итераций, n=1000 500500 итераций. Массив каждый раз заполняется случайными значениями.

И вот я совсем запутался, если сложность у нас n^2, это должно означать, что количество итераций должно быть n^2 ?
Или может быть я неправильно вставляю счётчик в свой код?
function SelectionSort(&$arr) {
	$iteration = 0;
	for($i=0; $i<count($arr); $i++){
		$min_id=$i;
		for($j=$i+1; $j<count($arr); $j++){
			if ($arr[$j] < $arr[$min_id]) {
				$min_id = $j;
			}
			$iteration++;
		}
		$temp = $arr[$i];
		$arr[$i] = $arr[$min_id];
		$arr[$min_id] = $temp;
		$iteration++;
		
	}
	return $iteration;
}
  • Вопрос задан
  • 195 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Да, верно. Реально количество шагов циклов (n^2 + n) / 2. Для оценки О достаточно указывать ту функцию, аргументом которой считается n и которая имеет самый большой порядок роста, в данном случае - квадратичная. Все множители, которые масштабируют саму функцию в счет не идут.
Если было бы (2n)^2 - то это другое дело.
При вычислении O можно не учитывать постоянные множители в выражениях.

https://habr.com/post/104219/
PS: Если строго высчитывать O, то вам нужно проанализировать выражение lim {n -> бесконечность} (((n^2 + n) / 2) / (n ^ 2)).
Ответ написан
@res2001
Developer, ex-admin
У вас счетчик итераций 2 раза инкрементируется в коде. Во внешнем цикле явно лишний инкремент.
В случае операций с массивами или списками, для оценки сложности обычно берут количество полных проходов по массиву для получения результата.

В вашем случае количество итераций равно оценке сложности.

В общем случае количество итераций приближается с низу к оценке сложности, например поиск по одному двоичному дереву может выполняться за разное число шагов для разных значений.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы