На самом деле, ваш первый пример: O (n ^ 4) !
Это может звучать удивительно, но это потому, что индексирование в Коллекцию VBA имеет линейный, а не постоянный, сложность .Коллекция VBA по существу имеет характеристики производительности списка - для получения элемента N по индексу требуется время, пропорциональное N. Для итерации всего элемента по индексу требуется время, пропорциональное N^ 2.(Я переключил случаи на вас, чтобы отличить N, количество элементов в структуре данных от вашего n, количество ячеек на стороне квадратного блока ячеек. Так что здесь N = n ^ 2.)
Это одна из причин, почему VBA имеет обозначение For ... Each для итерации коллекций.Когда вы используете For ... Each, VBA использует за кулисами итератор, поэтому проход по всей Коллекции - это O (N), а не O (N ^ 2).
Итак, переключаясь на n, вашпервые два цикла используют For ... Каждый в диапазоне с n ^ 2 ячейками, поэтому каждый из них равен O (n ^ 2).Ваш третий цикл использует For ... Next над коллекцией с n ^ 2 элементами, то есть O (n ^ 4).
На самом деле я точно не знаю о вашем последнем цикле, потому что я неНе знаю точно, как работает свойство Cells в Range - там может быть какая-то дополнительная скрытая сложность.Но я думаю, что у Cells будут характеристики производительности массива, поэтому O (1) для произвольного доступа по индексу, и это сделало бы последний цикл O (n ^ 2).
Это хороший примерто, что Джоэл Спольски назвал «Алгоритм Шлемиэля художника»:
Где-то там должен быть Алгоритм Шлемиэля Художника.Всякий раз, когда что-то кажется, что оно должно иметь линейную производительность, но кажется, что оно имеет производительность в n-квадрате, ищите скрытые Шлемиели.Они часто скрыты вашими библиотеками.
(См. Эту статью еще до того, как был основан stackoverflow: http://www.joelonsoftware.com/articles/fog0000000319.html)
Подробнее о производительности VBA можно узнать на сайте Дуга Дженкинса:
http://newtonexcelbach.wordpress.com/2010/03/07/the-speed-of-loops/
http://newtonexcelbach.wordpress.com/2010/01/15/good-practice-best-practice-or-just-practice/
(я также повторю то, что сказал cyberkiwi о том, что не нужно циклически проходить через диапазоны, просто для копирования содержимого ячейки, если это была «настоящая» программа ине просто учебное упражнение.)