ΠΠ±Π·ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ C# ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET
β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ (Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΡΠ΅ΡΠΊΠ°Ρ) ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ β ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΠΈΡΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² (Π²ΡΠ΅ΠΌΡ, ΠΏΠ°ΠΌΡΡΡ, I/O ΠΈ Ρ.Π΄.) Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΏΡΠΈ ΡΠΎΡΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²Ρ
ΠΎΠ΄Π° n
. ΠΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅ΠΌΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΈΡ
n
β ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΠΌΡ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΡΡ ΠΈ ΠΊΠ°ΠΊ Π±ΡΡΡΡΠΎ ΡΠ°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°ΡΡΠ°Ρ.
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅:
Big O β O(f(n)): Π²Π΅ΡΡ
Π½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° (asymptotic upper bound).
Π€ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ: f(n) = O(g(n))
Π΅ΡΠ»ΠΈ βC>0, n0: βn>n0: f(n) β€ CΒ·g(n).
Big Ξ© β Ξ©(f(n)): Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° (asymptotic lower bound).
Π€ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ: f(n) = Ξ©(g(n))
Π΅ΡΠ»ΠΈ βC>0, n0: βn>n0: f(n) β₯ CΒ·g(n).
Big Ξ β Ξ(f(n)): ΡΠΎΡΠ½Π°Ρ Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ° (ΠΈ Π²Π΅ΡΡ
Π½ΡΡ, ΠΈ Π½ΠΈΠΆΠ½ΡΡ).
f(n) = Ξ(g(n))
Π΅ΡΠ»ΠΈ f = O(g) ΠΈ f = Ξ©(g).
little-o β o(f(n)): ΡΡΡΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ (f(n) / g(n) β 0).
ΠΠ½Π°Π»ΠΈΠ· Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ vs. Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠ°ΠΌΡΡΠΈ: T(n)
β Π²ΡΠ΅ΠΌΡ; S(n)
β ΠΏΠ°ΠΌΡΡΡ.
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΌΠ΅ΡΡ Π²Ρ
ΠΎΠ΄Π° n
Π§ΡΠΎ ΡΡΠΈΡΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ? ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, ΡΠΈΡΠ»ΠΎ Π²Π΅ΡΡΠΈΠ½ Π² Π³ΡΠ°ΡΠ΅, Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ ΠΈ Ρ.Π΄.
ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΡ ΠΡΠ΅ΠΌΡ (ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ) β ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ. ΠΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅, Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠ°).
Π‘ΡΠΈΡΠ°ΠΉΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
ΠΡΠΈΠΊΠΈΠ½ΡΡΠ΅, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Β«Π΄ΠΎΡΠΎΠ³Π°ΡΒ» ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ n
.
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π»ΡΡΡΠΈΠ΅/ΡΡΠ΅Π΄Π½ΠΈΠ΅/Ρ ΡΠ΄ΡΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ
best-case
(ΠΌΠΈΠ½ΠΈΠΌΡΠΌ), average-case
(ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠ°Ρ ΠΏΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ), worst-case
(ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ) β ΠΎΠ±ΡΡΠ½ΠΎ ΠΌΡ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΠΌ worst-case.amortized
β ΡΡΠ΅Π΄Π½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡ ΡΠΈΠΏΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, union-find).Π£ΠΏΡΠΎΡΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ
Π£Π±Π΅ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΈ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΡΠ»Π΅Π½Ρ: 3n^2 + 10n + 100 -> Ξ(n^2)
.
ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΡ β Π²ΡΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΡΠ΅Π½ΡΡ Π Π΅ΡΠΈΡΠ΅ Π΅Ρ (ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ: ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°, Π΄Π΅ΡΠ΅Π²ΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠΈ, Master theorem, characteristic equation).
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΈ ΡΠΊΡΡΡΡΠ΅ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ GetHashCode()
Π΄Π»Ρ ΡΡΡΠΎΠΊ β O(k) Π³Π΄Π΅ k Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ; ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ O(k) Π² Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈ Ρ.Π΄.
2Β·n
β O(n)
.O(1)
= O(1000)
.n^2 + n
β O(n^2)
.O(f(n)) + O(g(n)) = O(max(f,g))
.for i..n for j..n -> O(n^2)
.for i..n
ΠΈ for j..m
β O(n+m)
.ΠΡΠΈΠΌΠ΅Ρ 1 β Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ»
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
O(1);
ΠΠ½Π°Π»ΠΈΠ·: i ΠΎΡ 0 Π΄ΠΎ n-1 (n ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ), j β n ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ β Π²ΡΠ΅Π³ΠΎ nΒ·n = nΒ² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ β O(n^2)
.
ΠΡΠΈΠΌΠ΅Ρ 2 β Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π³
for (int i = 1; i < n; i *= 2)
O(1);
i ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1,2,4,8,β¦ Π΄ΠΎ n β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ β log2 n
β O(log n)
.
ΠΡΠΈΠΌΠ΅Ρ 3 β consecutive loops
for i in 1..n { O(1) }
for j in 1..n { O(1) }
ΠΠ½Π°Π»ΠΈΠ·: O(n) + O(n) = O(2n) β O(n).
ΠΠ»Ρ ΡΠ΅ΠΊΡΡΡΠ΅Π½ΡΡ Π²ΠΈΠ΄Π°
T(n) = a T(n/b) + f(n)
(a β₯1, b>1):
d = log_b(a)
.f(n) = O(n^{d - Ξ΅})
Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Ξ΅>0 β T(n) = Ξ(n^d)
(Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΠ΅Ρ).f(n) = Ξ(n^d * log^k n)
β T(n) = Ξ(n^d * log^{k+1} n)
(ΡΠ°Π²Π½ΠΎΠ²Π΅ΡΠΈΠ΅).f(n) = Ξ©(n^{d + Ξ΅})
ΠΈ a f(n/b) β€ c f(n)
Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ c<1 (regularity) β T(n) = Ξ(f(n))
(ΡΡΠ½ΠΊΡΠΈΡ ΡΠ²Π΅ΡΡ
Ρ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΠ΅Ρ).ΠΡΠΈΠΌΠ΅ΡΡ
T(n)=2T(n/2)+Ξ(n)
β d=1 β T=Ξ(n log n).T(n)=T(n/2)+Ξ(1)
β d=0 β T=Ξ(log n).ΠΡΠΈΠΌΠ΅Ρ: Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² (capacity doubling) β append amortized O(1), Π½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ O(n).
Amortized vs average vs worst
β List<T>.Add()
amortized O(1), Π½ΠΎ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ O(n). Hash table Insert β amortized O(1), worst O(n) ΠΏΡΠΈ ΡΠ΅ΡΠ°ΠΉΠ·Π΅ ΠΈΠ»ΠΈ Π°ΡΠ°ΠΊΠ΅ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΡΠΌΠΈ.
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Β«O(1)Β» β Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π±ΡΡΡΡΠ°Ρ β O(1) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²).
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΡΡΠΎΠΊ/Ρ
ΡΡΠ΅ΠΉ
β Dictionary<string, ...>
: Π²ΡΡΠ°Π²ΠΊΠ°/ΠΏΠΎΠΈΡΠΊ Π°ΠΌΠΎΡΡ. O(1), Π½ΠΎ GetHashCode
ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ β O(k) (Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ). Π₯Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Β«Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΎ O(1)Β» Π΄Π»Ρ Π΄Π»ΠΈΠ½Π½ΡΡ
ΠΊΠ»ΡΡΠ΅ΠΉ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ generic/boxing
β List<object>
ΠΈ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ int
ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ boxing ΠΈ O(1) ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΠΎΠΆΠ΅ (Π°Π»Π»ΠΎΡΠΈΡΡΠ΅Ρ). List<int>
β Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π±ΠΎΠΊcΠΈΠ½Π³ΠΎΠ².
ΠΠ°ΡΡΠΈΠ²Ρ ΠΊΠΎΠ²Π°ΡΠΈΠ°Π½ΡΠ½Ρ, generic ΠΊΠ»Π°ΡΡΡ Π½Π΅Ρ
β string[]
ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ object[]
β ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ArrayTypeMismatchException
. List<string>
Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ List<object>
.
Π‘ΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ
β Π΄Π²Π° ΠΏΠΎΠ΄ΡΡΠ΄ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
ΡΠΈΠΊΠ»Π° for i..n for j..i
β O(n^2) (ΡΡΠΌΠΌΠ° 1..n ~ n(n+1)/2).
Π Π΅ΠΊΡΡΡΠΈΡ Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ
β ΠΠ°ΠΈΠ²Π½Π°Ρ ΡΠ΅ΠΊΡΡΡΠΈΡ fib(n)
β ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ O(Ο^n). Π‘ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΠ΅ΠΉ β O(n).
Big O vs practical performance
β ΠΠ»Π³ΠΎΡΠΈΡΠΌ O(n) Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Ρ
ΡΠΆΠ΅, ΡΠ΅ΠΌ O(n log n) Π΄Π»Ρ ΠΌΠ°Π»ΡΡ
n
. ΠΡΠ΅Π³Π΄Π° ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΈ ΠΊΡΡ.
LOH, ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ β ΠΠΎΠ»ΡΡΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ (ΡΡΡΠΎΠΊΠΈ >85kB, Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ) ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² LOH ΠΈ Π²Π»ΠΈΡΡΡ Π½Π° ΡΠ±ΠΎΡΠΊΡ ΠΌΡΡΠΎΡΠ°.
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
β ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°Ρ
Π²Π½ΡΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ. ΠΡΠΈΠΌΠ΅Ρ: ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² List<List<T>>
β Π½ΡΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠΈΡΠΊ Π² Π²Π½Π΅ΡΠ½Π΅ΠΌ ΡΠΏΠΈΡΠΊΠ΅, ΡΠ°ΠΊ ΠΈ Π² Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌ.
O(1)
β Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ.O(log n)
β Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ, ΠΏΠΎΠΈΡΠΊ Π² ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ BST.O(n)
β Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ ΠΏΡΠΎΡ
ΠΎΠ΄, ΠΏΠΎΠΈΡΠΊ Π² Π½Π΅ΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅.O(n log n)
β ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° merge/heap/avg quicksort.O(n^2)
β ΠΏΡΠΎΡΡΡΠ΅ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ (bubble/insert/selection), Π΄Π²ΠΎΠΉΠ½ΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΊΠ»Ρ.O(2^n)
β ΠΏΠ΅ΡΠ΅Π±ΠΎΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ², Π½Π°ΠΈΠ²Π½ΡΠΉ TSP/ΡΠΈΠ±ΡΠ΅ΠΊΡΡΡΠΈΡ.O(n!)
β ΠΏΠΎΠ»Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (brute-force TSP).arr[i]
β O(1).aT(n/b) + f(n)
(ΡΠΌ. Π²ΡΡΠ΅).ΠΡΠΈΠΌΠ΅Ρ: T(n) = 3T(n/4) + n
β d = log_4 3 β 0.792. f(n)=n = n^{1} -> f grows faster -> third case -> T(n)=Ξ(n).
Β«Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ O(1)?Β» β ΠΡΠ΅ΠΌΡ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ n (ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ΅), Π½ΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ.
Β«ΠΠ°ΠΊ ΠΎΡΠ»ΠΈΡΠΈΡΡ O(n) ΠΎΡ O(n log n) Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅?Β» β ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΡ n O(n log n) ΡΠ°ΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅; ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΠΉΡΠ΅/ΠΏΡΠΎΡΠΈΠ»ΠΈΡΡΠΉΡΠ΅; Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ n ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π²Π°ΠΆΠ½Π΅Π΅.
Β«ΠΠΎΡΠ΅ΠΌΡ HashMap β O(1), Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° O(n)?Β» β ΠΠΌΠΎΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ O(1), Π½ΠΎ Π² Ρ ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ·-Π·Π° ΠΏΠ»ΠΎΡ ΠΈΡ Ρ Π΅ΡΠ΅ΠΉ/ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ/Π°ΡΠ°ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅Π³ΡΠ°Π΄ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎ O(n).
Β«ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ Π½ΠΈΠΆΠ΅ n log n?Β» β ΠΠ»Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΡΡ β Π½Π΅Ρ (lower bound Ξ©(n log n)). ΠΠ»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°Π΅Π² (ΡΠ΅Π»ΡΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ k) β counting/radix sort Π΄Π°ΡΡ O(n + k).
Β«Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°ΠΉΠΌΡΡ Π²ΡΠ·ΠΎΠ² Equals
Π΄Π»Ρ ΡΡΡΠΎΠΊΠΈ?Β»
β Π Ρ
ΡΠ΄ΡΠ΅ΠΌ β O(k) (Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ), Π½ΠΎ ΡΠ°ΡΡΠΎ Π±ΡΡΡΡΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΎΠΊ ΠΏΡΠΈ ΠΈΠ½ΡΠ΅ΡΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π»ΠΈΡΠ΅ΡΠ°Π»Π°Ρ
.
Β«ΠΠΎΡΠ΅ΠΌΡ Ρ quicksort ΡΡΠ΅Π΄Π½ΠΈΠΉ O(n log n), Π° worst O(n^2)?Β» β ΠΡΠΈ ΠΏΠ»ΠΎΡ ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ΅ ΠΎΠΏΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (pivot) ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ. Π Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΡ/Π²ΡΠ±ΠΎΡ ΠΌΠ΅Π΄ΠΈΠ°Π½Ρ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ.
Β«Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ amortized O(1)?Β» β Π‘ΡΠ΅Π΄Π½ΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ; ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΈΠΌΠΈ.
Β«ΠΠ°ΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΡΠΌΒ» β ΠΠ°ΠΈΠ²Π½ΡΠΉ Fibonacci O(Ο^n) β Ρ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΠ΅ΠΉ/DP O(n).
Β«ΠΠΎΡΠ΅ΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Ρ Π±ΡΡΡΡΠ΅Π΅ LinkedList Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ, Ρ ΠΎΡΡ Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ° Π²ΡΡΠ°Π²ΠΊΠΈ O(1) Ρ LinkedList?Β» β ΠΡΡ-Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ: ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Ρ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠΎΠΌΠ°Ρ ΠΎΠ² ΠΊΡΡΠ° β Π±ΡΡΡΡΠ΅Π΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅.
Β«Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ lower bound β¦(n log n) Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΎΠΊ?Β» β ΠΡΠ±Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½Π°Ρ Π½Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΡΡ , ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° n log n ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Π² Ρ ΡΠ΄ΡΠ΅ΠΌ/ΡΡΠ΅Π΄Π½Π΅ΠΌ ΡΠ»ΡΡΠ°Π΅ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π°Ρ Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ°).
n
.O
(Π²Π΅ΡΡ
Π½ΡΡ), Ξ
(ΡΠΎΡΠ½Π°Ρ), Ξ©
(Π½ΠΈΠΆΠ½ΡΡ).n
.β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
β¨Dvurechenskyβ¨