πŸΠ‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Python

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ просто, Π½ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос Π² нСбольшой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ языка Python ΠΈ Π΅Π³ΠΎ структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ разбСрСмся с классами слоТности Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ научимся ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π°Π½Π°Π»ΠΈΠ·Π° называСтся статичСским, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, – Π² противовСс динамичСскому, ΠΈΠ»ΠΈ эмпиричСскому, Π°Π½Π°Π»ΠΈΠ·Ρƒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ проводятся измСрСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

ΠšΠ»Π°ΡΡΡ‹ слоТности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Python

Π‘Π°ΠΌΠΎΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ понятиС статичСского Π°Π½Π°Π»ΠΈΠ·Π° – O(1). Π­Ρ‚ΠΎΡ‚ класс слоТности ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π·Π° константноС врСмя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, созданиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ слоТСниС Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… чисСл.

ВрСмя выполнСния Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ зависит ΠΎΡ‚ количСства элСмСнтов, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка. НапримСр, класс слоТности O(N) описываСт Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ списка увСличится Π² Π΄Π²Π° Ρ€Π°Π·Π°, Ρ‚ΠΎ опСрация Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π΄Π²Π° Ρ€Π°Π·Π° дольшС.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ N, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ встрСтитС Π΄Π°Π»Π΅Π΅, – это Ρ€Π°Π·ΠΌΠ΅Ρ€ структуры Π΄Π°Π½Π½Ρ‹Ρ… – len(data_structure).

Рассмотрим основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… структур Π΄Π°Π½Π½Ρ‹Ρ… Π² Python.

Бписки (lists)

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ элСмСнта l[i] O(1)
Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ элСмСнта l[i] = 0 O(1)
Π Π°Π·ΠΌΠ΅Ρ€ списка len(l) O(1)
Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнта Π² ΠΊΠΎΠ½Π΅Ρ† списка l.append(5) O(1)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ послСднСго элСмСнта (pop) l.pop() O(1) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ l.pop(-1)
ΠžΡ‡ΠΈΡ‰Π΅Π½ΠΈΠ΅ списка l.clear() O(1) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ l = []
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ срСза l[a:b] O(b-a) l[1:5] => O(1), l[:] => O(len(l) – 0) = O(N)
Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ l.extend(...) O(len(...)) Зависит ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ list(...) O(len(...)) Зависит ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ структуры (...)
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ списков (==, !=) l1 == l2 O(N)
Вставка l[a:b] = ... O(N)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта (del) del l[i] O(N) Зависит ΠΎΡ‚ i. O(N) – Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия x in/not in l O(N) Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск Π² спискС
ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ l.copy() O(N) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ l[:]
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ значСния (remove) l.remove(...) O(N)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта (pop) l.pop(i) O(N) O(N-i). Для l.pop(0) => O(N)
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимального/максимального значСния min(l)/max(l) O(N) Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск Π² спискС
Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ списка l.reverse() O(N)
ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ for v in l: O(N) Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС, Π±Π΅Π· прСрывания Ρ†ΠΈΠΊΠ»Π° (return/break)
Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° l.sort() O(N Log N)
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ k*l O(k N) 5*l => O(N), len(l)*l => O(N2)

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ (tuples) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ структуру Π΄Π°Π½Π½Ρ‹Ρ… – ΠΈ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ классы слоТности, ΠΊΠ°ΠΊ Ρƒ списков.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° (sets)

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ
Π Π°Π·ΠΌΠ΅Ρ€ мноТСства len(s) O(1)
Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнта s.add(5) O(1)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия значСния x in/not in s O(1) Для списков ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ => O(N)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ значСния (remove) s.remove(..) O(1) Для списков ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ => O(N)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ значСния (discard) s.discard(..) O(1)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ значСния (pop) s.pop() O(1) УдаляСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выбираСтся "Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎ"
ΠžΡ‡ΠΈΡ‰Π΅Π½ΠΈΠ΅ мноТСства s.clear() O(1) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ s = set()
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ set(...) O(len(...)) Зависит ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ структуры (...)
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ мноТСств (==, !=) s != t O(len(s)) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ len(t)
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ мноТСств (<=/<) s <= t O(len(s)) issubset
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ мноТСств (>=/>) s >= t O(len(t)) issuperset s <= t == t >= s
ОбъСдинСниС (union) s | t O(len(s)+len(t))
ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ (intersection) s & t O(len(s)+len(t))
Π Π°Π·Π½ΠΎΡΡ‚ΡŒ (difference) s – t O(len(s)+len(t))
БиммСтричная Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ s ^ t O(len(s)+len(t))
ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ мноТСства for v in s: O(N) Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС, Π±Π΅Π· прСрывания Ρ†ΠΈΠΊΠ»Π° (return/break)
ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ s.copy() O(N)

Ряд ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со мноТСствами ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1), Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со списками ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ. Π‘ΠΎΠ»Π΅Π΅ быстрая рСализация обусловлСна Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ мноТСствам Π½Π΅ трСбуСтся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ порядкС элСмСнтов.

НСизмСняСмыС мноТСства (frozen sets) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ структуру Π΄Π°Π½Π½Ρ‹Ρ… – ΠΈ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ классы слоТности, ΠΊΠ°ΠΊ Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… мноТСств.

Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ (dict ΠΈ defaultdict)

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ элСмСнта d[k] O(1)
Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ элСмСнта d[k] = v O(1)
Π Π°Π·ΠΌΠ΅Ρ€ словаря len(d) O(1)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта (del) del d[k] O(1)
get/setdefault d.get(k) O(1)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ (pop) d.pop(k) O(1)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ (popitem) d.popitem() O(1) УдаляСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выбираСтся "Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎ"
ΠžΡ‡ΠΈΡ‰Π΅Π½ΠΈΠ΅ словаря d.clear() O(1) Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ s = {} ΠΈΠ»ΠΈ s = dict()
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ d.keys() O(1) Π’ΠΎ ΠΆΠ΅ для d.values()
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ словаря dict(...) O(len(...))
ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ элСмСнтов for k in d: O(N) Для всСх Ρ‚ΠΈΠΏΠΎΠ²: keys, values, items. Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС, Π±Π΅Π· прСрывания Ρ†ΠΈΠΊΠ»Π°

Как Π²ΠΈΠ΄Π½ΠΎ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со словарями ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1).

Π’ΠΈΠΏ defaultdict ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ классами слоТности. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Π·ΠΎΠ² конструктора Π² Ρ‚ΠΎΠΌ случаС, Ссли значСния Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Π² defaultdict, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1).

Вонкости Π°Π½Π°Π»ΠΈΠ·Π°

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ опСрация for i in range(...) ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(len(...)). Для for i in range(1, 10) ΠΎΠ½Π° Ρ€Π°Π²Π½Π° O(1).

Если len(alist) – это N, Ρ‚ΠΎΠ³Π΄Π° for i in range(len(alist)) Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ†ΠΈΠΊΠ» выполняСтся N Ρ€Π°Π·.

ΠŸΡ€ΠΈ этом for i in range(len(alist)/2) Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N). Π’ этом случаС Ρ†ΠΈΠΊΠ» выполняСтся N/2 Ρ€Π°Π·, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ константу 1/2. ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка Π²Π΄Π²ΠΎΠ΅ выполняСмая Ρ€Π°Π±ΠΎΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ удваиваСтся.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ for i in range(len(alist)/1000000) ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N). Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ нас интСрСсуСт, Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° N стрСмится ΠΊ бСсконСчности.

***

ΠŸΡ€ΠΈ сравнСнии Π΄Π²ΡƒΡ… списков Π½Π° равСнство, класс слоТности Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ O(N), ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²Ρ‹ΡˆΠ΅. Однако Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° O==(...), Π³Π΄Π΅ O==(...) это класс слоТности для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния (==) Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² спискС. Если ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами (int), Ρ‚ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сравнСния Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° O(1), Ссли со строками (string), Ρ‚ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ O(len(string)).

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ любом сравнСнии, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΡ‹ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… расчСтах Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта опСрация ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1) – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для чисСл ΠΈ строк ΠΌΠ°Π»ΠΎΠΉ/фиксированной Π΄Π»ΠΈΠ½Ρ‹.

БоставныС классы слоТности

Π Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

Π—Π°ΠΊΠΎΠ½ слоТСния для O-Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

O(f(n))+O(g(n))=O(f(n)+g(n))

ΠŸΡ€ΠΈ слоТСнии Π΄Π²ΡƒΡ… классов слоТности ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ этих классов. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, O(f(n) + g(n)) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ ΠΈΠ· Π΄Π²ΡƒΡ… исходных классов – Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ мСньший Ρ‡Π»Π΅Π½ выраТСния просто отбрасываСтся.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ,

O(N)+O(log⁑N)=O(N+log⁑N)=O(N)

Ρ‚Π°ΠΊ ΠΊΠ°ΠΊN растСт быстрСС, Ρ‡Π΅ΠΌ log N:

limxβ†’βˆžlog⁑NN=0

Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ класс слоТности для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. НапримСр, сначала ΠΌΡ‹ выполняСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(f(n)), Π° слСдом Π·Π° Π½ΠΈΠΌ – O(g(n)). Π’ΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ) Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(f(n)) + O(g(n)), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ O(f(n) + g(n)).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f(...) ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N), Π° Π²Ρ‹Π·ΠΎΠ² g(...) – O (N * log N). Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ:

f(...)
g(...)

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этого дСйствия Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π°:

O(N)+O(Nlog⁑N)=O(N+Nlog⁑N)=O(Nlog⁑N)

Если ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f(...) Π΄Π²Π°ΠΆΠ΄Ρ‹:

f(...)
f(...)

Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

O(N)+O(N)=O(N+N)=O(2N)=O(N)

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° 2 Π² вычислСниях отбрасываСтся.

Условия

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ исполнСниС условий (if). Π‘Π½Π°Ρ‡Π°Π»Π° выполняСтся само условиС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ² (if ΠΈΠ»ΠΈ else).

if test:
  block 1
else:
  block 2

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ вычислСниС условия test ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(T), Π±Π»ΠΎΠΊΠ° block 1 – O(B1), Π° Π±Π»ΠΎΠΊΠ° block 2 – O(B2).

Π’ΠΎΠ³Π΄Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ всСго ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π°:

O(T)+max(O(B1),O(B2))

test выполняСтся всСгда, Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ² слСдом Π·Π° Π½ΠΈΠΌ – Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π±Π»ΠΎΠΊ с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠ΅ΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.

ΠŸΠΎΠ΄ΡΡ‚Π°Π²ΠΈΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ значСния:

  • test – O(N),
  • block 1 – O(N2),
  • block 2 – O(N).

ΠΈ вычислим ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°:

O(N)+max(O(N2),O(N))=
O(N)+O(N2)=O(N+N2)=O(N2)

Если Π±Ρ‹ опСрация test ΠΈΠΌΠ΅Π»Π° класс слоТности O(N3), Ρ‚ΠΎ общая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° составила Π±Ρ‹ O(N3).

O(N3)+max(O(N2),O(N))=
O(N3)+O(N2)=O(N3+N2)=O(N3)

ЀактичСски, ΠΎΠ±Ρ‰ΠΈΠΉ класс слоТности для if-условий ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅:

O(T)+O(B1)+O(B2)

Для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² этом случаС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

O(N)+O(N2)+O(N)=O(N2)

Π’ O-Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΌΡ‹ всСгда отбрасываСм ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅ элСмСнты – ΠΏΠΎ сути это Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ max. Π—Π°ΠΏΠΈΡΡŒ с max Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΡƒΡ‚ΡŒ вычислСния, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для вас Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π—Π°ΠΊΠΎΠ½ умноТСния для O-Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

O(f(n))βˆ—O(g(n))=O(f(n)βˆ—g(n))

Если ΠΌΡ‹ повторяСм O(N) Ρ€Π°Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ процСсс с классом слоТности O(f(N)), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ класс слоТности Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½:

O(N)Γ—O(f(N))=O(NΓ—f(N))

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, нСкоторая функция f(...) ΠΈΠΌΠ΅Π΅Ρ‚ класс слоТности O(N2). Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅ N Ρ€Π°Π·:

for i in range(N):
    f(...)

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этого ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π°:

O(N)Γ—O(N2)=O(NΓ—N2)=O(N3)

Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ класс слоТности для выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ нСсколько Ρ€Π°Π· выраТСния. НСобходимо ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ класс слоТности количСства ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π½Π° класс слоТности самого выраТСния.

БтатичСский Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ – ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, состоит Π»ΠΈ список ΠΈΠ· ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ²). Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вычислим класс слоТности.

Для всСх Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ списка ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ ΠΊΠ°ΠΊ N, Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния элСмСнтов ΠΏΡ€ΠΈΠΌΠ΅ΠΌ Π·Π° O(1).

Алгоритм 1

Бписок ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, Ссли ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ встрСчаСтся Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ индСксС. Для значСния alist[i] ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ списка Π±ΡƒΠ΄Π΅Ρ‚ срСз alist[i+1:].

def is_unique1 (alist : [int]) -> bool:
  for i in range(len(alist)):             # 1
    if alist[i] in alist[i+1:]:           # 2
      return False                        # 3
  return True                             # 4

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

  1. O(N) – для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ индСкса. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° range Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ выполнСния Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: вычислСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΈΡ… Π² __init__ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° __init__. Π”Π²Π΅ послСдниС ΠΈΠΌΠ΅ΡŽΡ‚ класс слоТности O(1). Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ len(alist) Ρ‚Π°ΠΊΠΆΠ΅ O(1), поэтому общая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выраТСния range(len(alist)) – O(1) + O(1) + O(1) = O(1).
  2. O(N) – ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ индСкса + слоТСниС + созданиС срСза + ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° in: O(1) + O(1) + O(N) + O(N) = O(N)
  3. O(1) – Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выполняСтся, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.
  4. O(1) – Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС всСгда выполняСтся.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, класс слоТности Ρ†Π΅Π»ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_unique1 Ρ€Π°Π²Π΅Π½:

O(N)Γ—O(N)+O(1)=O(N2)

Если Ρ€Π°Π·ΠΌΠ΅Ρ€ списка увСличится Π²Π΄Π²ΠΎΠ΅, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°ΠΉΠΌΠ΅Ρ‚ Π² 4 Ρ€Π°Π·Π° большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

***

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

O(N)Γ—(O(N)+O(1))+O(1)

вСдь Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ if cостоит ΠΈΠ· вычислСния самого условия (O(N)) ΠΈ Π±Π»ΠΎΠΊΠ° return False (O(1)). Но Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС этот Π±Π»ΠΎΠΊ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΈ Ρ†ΠΈΠΊΠ» продолТится, поэтому ΠΌΡ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ Π² Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ. Но Π΄Π°ΠΆΠ΅ Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнится, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ O(N) + O(1) – это ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ O(N).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС вычисляСмый срСз списка – это alist[1:]. Π•Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ – O(N-1) = O(N). Однако, ΠΊΠΎΠ³Π΄Π° i == len(alist) этот срСз Π±ΡƒΠ΄Π΅Ρ‚ пуст. Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ срСз содСрТит N/2 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π΄Π°Π΅ΠΌ Π½Π°ΠΌ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N).

***

ВмСсто срСзов ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ». Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ измСнится.

def is_unique1 (alist : [int]) ->bool:
  for i in range(len(alist)):          # O(N)
    for j in range(i+1, len(alist)):   # O(N)
      if alist[i] == alist[j]          # O(1)
        return False                   # O(1)
 return True                           # O(1)

Класс слоТности Ρ†Π΅Π»ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅:

O(N)Γ—O(N)Γ—O(1)+O(1)=O(N2)

Алгоритм 2

Бписок ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, Ссли послС Π΅Π³ΠΎ сортировки рядом Π½Π΅ находятся ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ значСния.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ список, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ структуру сортировкой – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° входящиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

def is_unique2 (alist : [int]) -> bool:
  copy = list(alist)             # 1
  copy.sort()                    # 2
  for i in range(len(alist)-1):  # 3
    if copy[i] == copy[i+1]:     # 4
      return False               # 5
  return True                    # 6

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ строчкам:

  1. O(N).
  2. O(N log N) – для быстрой сортировки.
  3. O(N) – Π½Π° самом Π΄Π΅Π»Π΅ N-1, Π½ΠΎ это Ρ‚ΠΎ ΠΆΠ΅ самоС. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ получСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка ΠΈ вычитания ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1).
  4. O(1) – слоТСниС, Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ получСния элСмСнта ΠΏΠΎ индСксу ΠΈ сравнСниС – всС со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(1).
  5. O(1) – Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выполняСтся.
  6. O(1) – Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС всСгда выполняСтся.

ΠžΠ±Ρ‰ΠΈΠΉ класс слоТности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_unique2:

O(N)+O(NΓ—log⁑N)+O(N)Γ—O(1)+O(1)=
O(N+Nlog⁑N+O(NΓ—1)+1)=
O(N+Nlog⁑N+N+1)=O(Nlog⁑N+2N+1)=O(Nlog⁑N)

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ мСньшС, Ρ‡Π΅ΠΌ is_unique1. Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ N is_unique2 Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС.

ΠΠ°ΠΈΠ±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ опСрация сортировки – ΠΎΠ½Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΡ€ΠΈ ΡƒΠ΄Π²ΠΎΠ΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка ΠΈΠΌΠ΅Π½Π½ΠΎ сортировка Π·Π°ΠΉΠΌΠ΅Ρ‚ большС ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ добавившСгося Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

Класс слоТности O(N log N) Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ O(N), Π½ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ O(N2).

ЀактичСски, Π² ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ внСсти ΠΎΠ΄Π½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅:

# Π±Ρ‹Π»ΠΎ
copy = list(alist)    # O(N)
copy.sort()           # O(N log N)

# стало
copy = sorted(alist)  # O(N log N)

Ѐункция sorted создаСт список с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ значСниями ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ трСбуСтся явно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ копию.

Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ускорит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π½ΠΎ Π½Π΅ повлияСт Π½Π° Π΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ O(N + N log N) = O(N log N). УскорСниС – это всСгда Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π΅Π΅ Π½Π°ΠΉΡ‚ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ с минимальной ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.

НуТно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ is_unique2 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли всС значСния Π² спискС сравнимы ΠΌΠ΅ΠΆΠ΄Ρƒ собой (для сортировки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния <). Если список Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ строками ΠΈ числами, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ получится. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя is_unique1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ==, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ значСния Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· выбрасывания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Алгоритм 3

Бписок ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, Ссли ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Π² мноТСство (set) Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ измСняСтся.

def is_unique3 (alist : [int]) -> bool:
  aset = set(alist)               # O(N)
  return len(aset) == len(alist)  # O(1)

Π Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ класс слоТности для всСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ просто:

O(N)+O(1)=O(N+1)=O(N)

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Ρ€Π΅Ρ‚ΡŒΡ рСализация оказалась самой эффСктивной ΠΈΠ· всСх с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния. ΠŸΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка Π² Π΄Π²Π° Ρ€Π°Π·Π°, врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ is_unique3 увСличится всСго Π² Π΄Π²Π° Ρ€Π°Π·Π°.

Π’Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ строчку:

return len(set(alist)) == len(alist)

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ этом Π½Π΅ измСнится.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ is_unique2, эта рСализация ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ со ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹ΠΌΠΈ списками (числа ΠΈ строки). Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС значСния Π±Ρ‹Π»ΠΈ Ρ…Π΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ/нСизмСняСмыми. НапримСр, is_unique3 Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для списка списков.

***

ΠžΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ΄Π½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ эффСктивнСС Π΄Ρ€ΡƒΠ³ΠΈΡ…. БтатичСский Π°Π½Π°Π»ΠΈΠ· (Π±Π΅Π· запуска ΠΊΠΎΠ΄Π°) позволяСт ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… – Ρ‡Π΅ΠΌ большС Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π΅ΠΌ большС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ.

Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ… классы слоТности нСэффСктивны. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² этом случаС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ константы ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ низшСго порядка. Π’Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ эмпиричСский, ΠΈΠ»ΠΈ динамичСский, Π°Π½Π°Π»ΠΈΠ·.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π²Π°ΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ограничСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…).

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ зависимости Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ слоТности ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° – ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ значСния;
  • ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ значСния с самым высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ.

Π Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ классы слоТности этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

add remove
РСализация 1 O(1) O(N)
РСализация 2 O(N) O(1)
РСализация 3 O(log N) O(log N)

РСализация 1

НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ добавляСтся Π² ΠΊΠΎΠ½Π΅Ρ† списка (list) ΠΈΠ»ΠΈ Π² Π½Π°Ρ‡Π°Π»Π° связного списка (linked list) – O(1).

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для удалСния осущСствляСтся поиск ΠΏΠΎ списку – O(N).

Π›Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

РСализация 2

Для Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния опрСдСляСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ мСсто – для этого ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ элСмСнты списка (ΠΈΠ»ΠΈ связного списка) – O(N).

Π—Π°Ρ‚ΠΎ самоС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСгда находится Π² ΠΊΠΎΠ½Ρ†Π΅ списка (ΠΈΠ»ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ связного списка) – O(1).

Π›Π΅Π³ΠΊΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Π½ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ.

РСализация 3

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ двоичная ΠΊΡƒΡ‡Π°, которая позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со "срСднСй" ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(log N), Ρ‡Ρ‚ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Π»ΠΈΠΆΠ΅ ΠΊ O(1), Ρ‡Π΅ΠΌ ΠΊ O(N).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ· этих Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ….

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ N Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½ΡƒΠΆΠ½ΠΎ сначала Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ всС значСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… всС.

РСализация 1

NΓ—O(1)+NΓ—O(N)=O(N)+O(N2)=O(N2)

РСализация 2

NΓ—O(N)+NΓ—O(1)=O(N2)+O(N)=O(N2)

РСализация 3

NΓ—O(log⁑N)+NΓ—O(log⁑N)=
O(Nlog⁑N)+O(Nlog⁑N)=O(Nlog⁑N)

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: N * O(...) – это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ O(N) * O(...).

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈ вторая Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ быстро, Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ класс слоТности опрСдСляСт самая мСдлСнная опСрация.

Π’Ρ€Π΅Ρ‚ΡŒΡ рСализация оказываСтся быстрСС всСх, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π΅ срСднСС врСмя O(N log N) Π±Π»ΠΈΠΆΠ΅ ΠΊ O(1), Ρ‡Π΅ΠΌ ΠΊ O(N).

10 ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΉΠ΄Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ 10 ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Для этого Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ N элСмСнтов, Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 10.

РСализация 1

NΓ—O(1)+10Γ—O(N)=O(N)+O(N)=O(N)

РСализация 2

NΓ—O(N)+10Γ—O(1)=O(N2)+O(1)=O(N2)

РСализация 3

NΓ—O(log⁑N)+10Γ—O(log⁑N)=
O(Nlog⁑N)+O(log⁑N)=O(Nlog⁑N)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрвая рСализация оказываСтся самой эффСктивной, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ опСрация добавлСния элСмСнта Ρƒ Π½Π΅Π΅ ΠΎΡ‡Π΅Π½ΡŒ дСшСвая ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

***

ΠœΠΎΡ€Π°Π»ΡŒ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ сущСствуСт "самой Π»ΡƒΡ‡ΡˆΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ". Π’ зависимости ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹.

А Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ :)

МнС слоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ?

Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСпростая Ρ‚Π΅ΠΌΠ° для ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния: Π½Π΅ Ρƒ ΠΊΠΎΠ³ΠΎ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ запустили курс «Алгоритмы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…Β», Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π΅ΠΆΠ΅Π½Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Π±ΠΈΠ½Π°Ρ€ΠΎΠ² Π²Ρ‹:

  • ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ слСнг, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ говорят всС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ нСзависимо ΠΎΡ‚ языка программирования: язык Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ…;
  • Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ;
  • ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ ΠΊ тСхничСскому собСсСдованию ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

ΠšΡƒΡ€Ρ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ junior, Ρ‚Π°ΠΊ ΠΈ middle-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...