Допустим, у нас есть ([1,2,3]++[4,5,6])++[7,8,9]
([1,2,3]++[4,5,6])++[7,8,9]
(1:([2,3]++[4,5,6))++[7,8,9]
1:(([2,3]++[4,5,6])++[7,8,9])
1:((2:([3]++[4,5,6])++[7,8,9])
1:2:(([3]++[4,5,6])++[7,8,9])
1:2:(3:([]++[4,5,6])++[7,8,9])
1:2:3:(([]++[4,5,6])++[7,8,9])
1:2:3:([4,5,6]++[7,8,9])
1:2:3:4:([5,6] ++ [7,8,9])
1:2:3:4:5:([6] ++ [7,8,9])
1:2:3:4:5:6:([] ++ [7,8,9])
1:2:3:4:5:6:[7,8,9]
[1,2,3,4,5,6,7,8,9]
Обратите внимание, как каждый элемент в первом списке нужно было перемещать дважды?Это потому, что было два с конца.В общем, если у нас есть (((a1++a2)++a3)++..an)
каждый элемент в списке, то ai
нужно будет перемещать n-i
раз.
Итак, если вы хотите, чтобы весь список был квадратичным.Если вам нужен первый элемент, и у вас есть списки n
, это операции n-1
* (нам нужно выполнить пошаговый случай ++
n
раз).Если вам нужен i
-й элемент, это число операций для всех элементов перед ним, плюс k-1
, где он был в k
-м списке, считая с конца.
*Плюс операции n
от самого foldl
, если мы хотим быть педантичными