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

Цикл в 100.000 итераций vs «умного» цикла?

В общем представьте цикл на 100.000 итераций. И условие такое, что производить нам действие надо с теми итерациями, при которых i = ячейке массива, значение которого не 0. Иначе говоря - if (Array[i] == 0) continue;
Так вот. Что будет быстрей, такой цикл в 100.000 итераций, или его аналог с алгоритмом?
Суть алгоритма такова: изначально шаг итерации равен не единице, а десяти тысячам: 0,10000,20000,30000,40000.. Затем ставим проверочку, не заполнена ли Array[i]. И, стало быть если она заполнена, значит мы "пролетели", но всего на 10.000 итераций. Далее шаг итераций ставим на единицу, и устанавливаем i-=10000.
Таким образом при аналогичной проверке первый цикл совершает 100.000 итераций, а второй столько, сколько требует заполненность массива + лишние 10.000 итераций.

P.S. метод полезен лишь в том случае, когда у вас заполнены не все 100.000 ячеек массива, а к примеру до 30%.

Хотя, если взять во внимание правило того, что зачем нужны вообще лишние ячейки или если у нас будут заполнены все 100.000 ячеек, нам все равно придется делать 100.000 итераций :) Таким образом это можно воспринимать как "времянку", если мало ресурсов и прочее.
  • Вопрос задан
  • 3341 просмотр
Подписаться 2 Оценить Комментировать
Ответ пользователя Mrrl К ответам на вопрос (7)
Mrrl
@Mrrl
Заводчик кардиганов
Что известно про заполненные ячейки? Они образуют непрерывный фрагмент? Прижат ли он к началу массива, или к концу, или у него известна минимальная длина?
Если ваш алгоритм применить к массиву, в котором заполнены ячейки с 10001 по 19999, он их не заметит, и скажет, что массив пуст. Так и предполагается?
Если заполнен непрерывный участок с неизвестной заранее длиной L, то есть простой способ найти его за O(N/L) операций (а потом обработать за O(L)).
Ответ написан