TL; DR: сложность этого алгоритма O(n^4)
.
В первой части кортеж добавляется в seen
для всей пары (i,j)
где j>i
. Таким образом, количество кортежей в seen
составляет примерно (n-1)*n/2 = O(n^2)
, как вы догадываетесь.
Вторая часть немного сложнее. Если мы проигнорируем первое условие вложенных циклов (критический случай), два первых цикла могут перебирать все возможные кортежи в seen
. Таким образом сложность не менее O(n^2)
. Для третьего l oop это немного сложно: трудно понять сложность, не делая никаких предположений о входных данных. Однако мы можем предположить, что теоретически существует критический случай, когда seen[s - key]
содержит O(n^2)
кортежей. В таком случае общий алгоритм будет работать в O(n^4)
!
Практичен ли этот теоретический критический случай? К сожалению, да. В самом деле, возьмите для примера ввод arr = [5, 5, ..., 5, 5]
с s = 20
. Карта seen
будет содержать один ключ (10
), связанный с массивом с (n-1)*n/2 = O(n^2)
элементами. В этом случае два первых цикла второй части будут выполняться в O(n^2)
, а третий вложенный l oop в O(n^2)
тоже.
Таким образом, общий алгоритм будет выполняться в O(n^4)
.
Однако обратите внимание, что на практике такой случай должен быть довольно редким, и алгоритм должен работать намного быстрее на случайных входах с множеством разных чисел. Сложность, вероятно, может быть улучшена до O(n^3)
или даже O(n^2)
, если этот критический случай исправлен (например, путем отдельного вычисления этого патологического случая).