JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
During the presentation, we will consider what advantages a front-end developer will get from knowledge of algorithms and data structures.
We will analyze real-world examples where this knowledge simplified logic and accelerated applications dramatically.
And finally we will understand the most necessary things that will allow us to determine the effectiveness of the code and easily improve it.
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
During the presentation, we will consider what advantages a front-end developer will get from knowledge of algorithms and data structures.
We will analyze real-world examples where this knowledge simplified logic and accelerated applications dramatically.
And finally we will understand the most necessary things that will allow us to determine the effectiveness of the code and easily improve it.
2. 2Глава 4. Производящие функции.
4.2. Решение рекуррентных соотношений
Рекурентная последовательность – числовая последовательность, в которой
каждый член, кроме нескольких первых, задается с помощью функции некоторых
предыдущих членов.
{ ai = αβi
}i=0..
Рассмотрим, например, уже знакомую нам геометрическую прогрессию
Если функция линейная, то и рекуррентное соотношение называют линейным.
a0 = α
ai+1 = βai , i = 0..
Пусть f(x) – производящая функция последовательности { ai }i=0..
f(x) = a0 + a1x + a2x2
+ a3x3
+ ... = α + βa0x + βa1x2
+ βa2x3
+ ...
= α + βx(a0 + a1x + a2x2
+ ...) = α + βx f(x)
f(x) (1 - βx) = αотсюда
f(x) = α / (1 - βx) – уже знакомая нам формула
3. 3Глава 4. Производящие функции.
Еще несколько примеров
{ ai = α + βi }i=0..
Рассмотрим арифметическую прогрессию
a0 = α
ai+1 = β + ai , i = 0..
Пусть f(x) – производящая функция последовательности { ai }i=0..
f(x) = a0 + a1x + a2x2
+ a3x3
+ ...
= α + (β+a0)x + (β+a1)x2
+ (β+a2)x3
+ ...
= α + β (x + x2
+ x3
+ ...) + x(a0 + a1x + a2x2
+ ...)
= α + βx/(1-x) + xf(x)
f(x) (1 - x) = α + βx/(1-x)отсюда 2
)1(1
)(
x
x
x
xf
−
+
−
=
βα
в частности, для { ai = i }i=0..
2
)1(
)(
x
x
xf
−
=
4. 4Глава 4. Производящие функции.
Последовательность чисел Фибоначчи
Если полученную производящую функцию удается разложить в степенной ряд, то
можно получить явное выражение для членов рекуррентной последовательности.
F0 = F1 = 1
Fi+2 = Fi + Fi+1 , i = 0..
f(x) = F0 + F1x + F2x2
+ F3x3
+ ...
= 1 + x + (F0 + F1)x2
+ (F1 + F2)x3
+ ...
= 1 + x + x2
f(x) + x(f(x) - 1)
f(x) (1 - x - x2
) = 1отсюда 2
1
1
)(
xx
xf
−−
=
Для того, чтобы найти явное выражение для чисел Фибоначчи надо разложить
найденную функцию f(x) в степенной ряд, а для этого мы представим ее в виде суммы
функций, которые являются производящими для известных нам последовательностей.
{ 1, 1, 2, 3, 5, 8, 13, 21,... }
Будем искать выражение для f(x) в виде
x
B
x
A
xf
βα −
+
−
=
11
)(
где α = 1/x1, β = 1/x2, а x1 и x2 – корни квадратного трехчлена 1 – x – x2
5. 5Глава 4. Производящие функции.
Последовательность чисел Фибоначчи
∑∑
∞
=
∞
=
+=
−
+
−
=
−−
=
00
2
111
1
)(
i
ii
i
ii
xBxA
x
B
x
A
xx
xf βα
βα
1)1()1( =−+− xBxA αβ
=+
=+
0
1
αβ BA
BA
откуда следует
βα
β
βα
α
−
−
=
−
= BA ,
откуда получаем Fi = Aαi
+ Bβi
Определим значения A, B, α и β.
Найдем корни квадратного трехчлена 1 – x – x2
. 2
51
2
411
2,1
±−
=
+±−
=x
2
51
)15)(15(
)15(2
15
21
1
+
=
+−
+
=
−
==
x
α
2
51
)15)(15(
)15(2
15
21
2
−
=
+−−−
+−
=
−−
==
x
β
52
15 +
=
−
=
βα
α
A
52
15 −
=
−
−
=
βα
β
B
6. 6Глава 4. Производящие функции.
Последовательность чисел Фибоначчи
Окончательно получаем Fi =
ii
ii
BA
−−
+
++
=+
2
51
52
15
2
51
52
15
βα
F0 = 1
52
52
52
15
52
15
==
−
+
+
F1 = 1
54
54
54
1525
54
1525
2
15
52
15
2
15
52
15
==
+−
−
++
=
−−
−
++
Проверяем подстановкой:
F2 = 2
58
5816
58
5816
4
5521
52
15
4
5521
52
15
=
+−
+
+
=
+−−
+
+++
Число
+
2
51 = φ ≅ 1.618 – знаменитое «золотое сечение»
0
2
51
lim =
−
∞→
i
i
поэтому при больших i 1
5
1 +
≈ i
iF ϕ ϕ=+
∞→
i
i
i F
F 1
limи
7. 7Глава 4. Производящие функции.
Число расстановок скобок
Если нужно перемножить несколько матриц разного размера, то общее число
производимых при этом элементарных операций может быть различным.
A0 (2 x 10) × A1
(10 x 5)
× A2
(5 x 3)
(A0 × A1) × A2 : 2 × 10 × 5 + 2 × 5 × 3 = 130
A0 × (A1 × A2) : 2 × 10 × 3 + 10 × 5 × 3 = 210
A0
p0 × p1
A1
p1 × p2
A2
p2 × p3
… An-1
pn-1 × pn
× × × ×
Сколько всего существует способов расставить скобки в этом выражении?
P1 P2 … Pn
1 1 … P1 × Pn-1 + P2 × Pn-2 + P3 × Pn-3 + … + Pn-1 × P1
8. 8Глава 4. Производящие функции.
Число расстановок скобок
Итак, имеем следующие рекуррентные соотношения:
>=
=
∑
−
=
− 1,
1
1
1
1
nприPPP
P
n
i
inin
Предположим, что последовательность { Pi }I = 0.. имеет
производящую функцию P(x). Тогда:
Можно положить P0=0
P(x) = P1x + P2x2
+ P3x3
+ … + Pnxn
+ …
Выражение для Pn похоже на формулу свертки последовательностей,
поэтому рассмотрим функцию P(x) ⋅ P(x) .
P(x) P(x) = P1P1x2
+ (P1P2 + P2P1)x3
+ (P1P3 + P2P2 + P3P1)x4
+ …
= P2x2
+ P3x3
+ P4x4
+ … = P(x) – x
Отсюда имеет уравнение относительно функции P:
P 2
– P + x = 0
2
411
2,1
x
P
−±
=
Очевидно, что один из корней –
посторонний. Какой? 2
411
)(
x
xP
−−
=
9. 9Глава 4. Производящие функции.
Число расстановок скобок
2
411
)(
x
xP
−−
=
Рассмотрим разложение в ряд для функции 2
1
)41(41 xx −=− ∑
∞
=
−=
0
)4(2
1
n
nnn
xC
!
)1)...(2)(1(
)4()4( 2
1
2
1
2
1
2
1
2
1
n
n
C nnn +−−−
−=−
!
)2)1(4)...(28)(24)(2(
n
n −−−−−
=
)!1(
)64...(10622
−
−⋅⋅
⋅−=
n
n
n !2
2...642
)!1(
)32...(5312
n
n
n
n
n n
n
⋅⋅⋅⋅
⋅
−
−⋅⋅
⋅−=
12)12(!!
)!2( 2
−
−=
−⋅⋅
−=
n
C
nnn
n n
n
∑∑
∞
=
∞
= −
=
−
+=
1
2
0
2
12
1
2
1
12
1
2
1
2
1
)(
n
nn
n
n
nn
n xC
n
xC
n
xP n
nn C
n
P 2
12
1
2
1
−
=
10. 9Глава 4. Производящие функции.
Число расстановок скобок
2
411
)(
x
xP
−−
=
Рассмотрим разложение в ряд для функции 2
1
)41(41 xx −=− ∑
∞
=
−=
0
)4(2
1
n
nnn
xC
!
)1)...(2)(1(
)4()4( 2
1
2
1
2
1
2
1
2
1
n
n
C nnn +−−−
−=−
!
)2)1(4)...(28)(24)(2(
n
n −−−−−
=
)!1(
)64...(10622
−
−⋅⋅
⋅−=
n
n
n !2
2...642
)!1(
)32...(5312
n
n
n
n
n n
n
⋅⋅⋅⋅
⋅
−
−⋅⋅
⋅−=
12)12(!!
)!2( 2
−
−=
−⋅⋅
−=
n
C
nnn
n n
n
∑∑
∞
=
∞
= −
=
−
+=
1
2
0
2
12
1
2
1
12
1
2
1
2
1
)(
n
nn
n
n
nn
n xC
n
xC
n
xP n
nn C
n
P 2
12
1
2
1
−
=