Существует простой способ определить сложность большого алгоритма этого алгоритма. Операция +
в строке 5 выполняется, по крайней мере, столько же раз, сколько в коде, поэтому если мы посчитаем, сколько раз выполнено +
, то это будет такой же, как и сложность всего алгоритма. Это нормально, потому что все остальное является базовой операцией, кроме строки Y = [None] * len(X // 2)
, которая не имеет более высокой сложности, чем цикл с +
in.
, поскольку алгоритм вычисляет сумму чиселв списке, и ничего не добавляется , кроме чисел из списка (или частичных сумм чисел из списка), в общей сложности сделано len(X) - 1
добавлений, и поэтому алгоритм O (*)1010 * n ) где n - длина списка ввода.
Думая об этом иначе, вы можете представить этот алгоритм как добавление листовых узлов из двоичного дерева. Количество добавлений равно количеству внутренних узлов в двоичном дереве с n листами, что составляет n - 1 или O ( n ).