Azazello писал(а):
Способ #1: пробежать весь массив, скажем, перемножая элементы, и результат сравнить с нулём. Время на работу с одним элементом - t1. Время на выполнение ВСЕГДА - N*t1.
Способ #2: loop с выходом, если элемент равен нулю. Время на работу с одним элементом - t2. Какое, в среднем, время мы потратим на поиск нуля в произвольном элементе? На вскидку, N(1 + N)*t2/2N =~ N*t2/2.
Вывод: Если я не ошибся, пробег всего массива выгоден только если t1 < t2/2.
пусть сенсеи меня поправят, но в теории задача оптимизации это уменшить степень функции О(N), где O - время затраченное на выполнение функции в зависимости от количества элементов N. При этом константа C (т.е. в данном случае t1, t2/2) отбрасывается. оба способа, соответственно имеют O(N) = N, т.е. среднее время выполнения линейно растет с увеличением кол-ва элементов.
для логической оптимизации соответственно нужно превратить это дело, например, в O(N) = sqrt(N). O(N) = C можно добиться, храня значение ячейки отдельно, но тогда время функции добавления в массив вырастает с 1 до N. но так всегда - выигрываешь в одном - проигрываешь в другом.
для практической оптимизации видимо желательно хотя бы уменшить коэффициент при линейно растущем N. и тут, если я правильно усвоил лекции sz, пойнт в том, что на современных процах быстрее линейно прокрутить for, чем сравнивать значения переменных, даже если цикл законится раньше
это такой небольшой summary
am i missing something?