Я начинаю изучать структуры данных + алгоритмы, и я столкнулся с проблемой.Вот функция, которую я тестирую:
def create_list_with_concat(n):
l = []
for i in range(n):
l = l + [i]
Вот мой мыслительный процесс: я знаю, что оператор concat равен O(k)
, где k
- это размер списка, добавляемого в исходный список.Поскольку в данном случае размер k
всегда равен 1
, поскольку мы добавляем по одному списку символов за раз, операция concat выполняет шаг 1
.Поскольку цикл повторяется n
раз, алгоритм будет выполнять n
шагов - делая 1
шагов за итерацию.Следовательно, временная сложность алгоритма будет O(n)
.Фактическое время выполнения алгоритма будет выглядеть примерно так: T(n) = dn
, где d
- это время, необходимое для выполнения конкатенации.Для такой функции я ожидал бы, что верно следующее: когда вы увеличиваете размер ввода в 10 раз, вывод (время выполнения) увеличится в 10 раз, так как:
(x, dx) --> (10x, 10dx) --> 10dx/dx = 10
Однако, когда я проверяю алгоритм на реальных значениях и времени выполнения, это, похоже, не происходит.Вместо этого, когда я увеличиваю размер ввода в 10 раз, вывод (время выполнения) увеличивается в 100 раз, а когда я увеличиваю размер ввода в 100 раз, вывод увеличивается в 10000 раз.Эти выходные данные предлагают квадратичную функцию времени и O(n squared)
.
Вот мой полный код:
import timeit
def create_list_with_concat(n):
l = []
for i in range(n):
l = l + [i]
t1 = timeit.Timer("create_list_with_concat(100)", "from __main__ import
create_list_with_concat")
print("concat ",t1.timeit(number=1)*1000, "milliseconds")
t1 = timeit.Timer("create_list_with_concat(1000)", "from __main__
import create_list_with_concat")
print("concat ",t1.timeit(number=1)*1000, "milliseconds")
# OUTPUT
# concat 0.05283101927489042 milliseconds
# concat 2.8588240093085915 milliseconds
Большое спасибо за помощь.