ЁЯУП рдзрдбрд╛ 01 тАФ DSA рдХрд╛ рдЖрдгрд┐ Big-O: рд╢рд╛рд│рд╛ рджреБрдкреНрдкрдЯ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдХрд╛рдо рдХрд╕реЗ рд╡рд╛рдврддреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-arrays
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдкреНрд░рддреНрдпреЗрдХ data structure рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ algorithm рдЬреНрдпрд╛ рдПрдХрд╛ рдкреНрд░рд╢реНрдирд╛рд╡рд░ рддрдкрд╛рд╕рд▓рд╛ рдЬрд╛рддреЛ рддреЛ рдкреНрд░рд╢реНрди: input рджреБрдкреНрдкрдЯ рдЭрд╛рд▓рд╛ рдХреА рдХрд╛рдо рдХрд╕реЗ рд╡рд╛рдврддреЗ? рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рддреНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- dsa/structures.py тАФ рдкреНрд░рддреНрдпреЗрдХ container рд╣рд╛рддрд╛рдиреЗ рдмрдирд╡рд▓реЗрд▓рд╛, рдХрд╛рдЪреЗрдЪреНрдпрд╛ рднрд┐рдВрддреАрдВрд╕рд╣ (рдЖрдд рд╕рдЧрд│реЗ рджрд┐рд╕рддреЗ): linked list, stack, ring-buffer queue, hash map, BST, heap, graph
- dsa/algorithms.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд▓ step counter рд╕рд╣: searches, sorts, recursion, BFS/DFS/Dijkstra, DP, greedy, two pointers
- dsa/demo.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рднрд╛рдЧ; рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЧ рдЦрд░реНрдЪ рдлрдХреНрдд рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА, рддреЛ рдореЛрдЬрддреЛ
- dsa/test_dsa.py тАФ smoke test: рд╕рдЧрд│реНрдпрд╛рд╡рд░ 12 checks
- dsa/expected-output.txt тАФ рдирд┐рд░реЛрдЧреА run рдХрд╛рдп print рдХрд░рддреЛ (timings рдкреНрд░рддреНрдпреЗрдХ machine рд╡рд░ рд╡реЗрдЧрд│реНрдпрд╛ рдЕрд╕рддрд╛рдд; step counts рдмрджрд▓рдд рдирд╛рд╣реАрдд)
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧреЗрд▓, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА. Loops, lists рдЖрдгрд┐ functions рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗрдд. рдЪрд╛рдВрдЧрд▓реЗ рд╢реЗрдЬрд╛рд░реА: Database school (indexes рдореНрд╣рдгрдЬреЗ disk рд╡рд░рдЪреЗ рдзрдбрд╛ 09 рдЪреЗ trees) рдЖрдгрд┐ Networking school (routing рдореНрд╣рдгрдЬреЗ рдзрдбрд╛ 10 рдЪреЗ graphs).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдд 1,000 рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдЖрд╣реЗрдд рдЖрдгрд┐ рдПрдХ рдиреЛрдВрджрд╡рд╣реА рдЖрд╣реЗ. "Dipika" рд╢реЛрдзрд╛рдпрд▓рд╛ рддреБрдореНрд╣реА рд╡рд░реВрди рд╡рд╛рдЪреВ рд╢рдХрддрд╛ тАФ рд╕рд░рд╛рд╕рд░реА 500 рдирд╛рд╡реЗ. рдкреБрдврдЪреНрдпрд╛ рд╡рд░реНрд╖реА рд╢рд╛рд│рд╛ рджреБрдкреНрдкрдЯ рд╣реЛрддреЗ: рд╕рд░рд╛рд╕рд░реА 1,000 рдирд╛рд╡реЗ. рд╣реЗ O(n): рд╢рд╛рд│рд╛ рджреБрдкреНрдкрдЯ, рдХрд╛рдо рджреБрдкреНрдкрдЯ.
рдиреЛрдВрджрд╡рд╣реА рдХреНрд░рдорд╛рдиреЗ рд▓рд╛рд╡рд▓реЗрд▓реА рдЕрд╕реЗрд▓ рддрд░ рддреА рдордзреЛрдордз рдЙрдШрдбрд╛: "Dipika" рдЖрдзреА рдЖрд╣реЗ рдХреА рдирдВрддрд░? рдЕрд░реНрдзреА рдлреЗрдХреВрди рджреНрдпрд╛, рдкреБрдиреНрд╣рд╛ рдХрд░рд╛ тАФ 1,000 рдирд╛рд╡рд╛рдВрд╕рд╛рдареА рджрд╣рд╛ рдирдЬрд░рд╛, 2,000 рд╕рд╛рдареА рдЕрдХрд░рд╛. рд╣реЗ O(log n): рд╢рд╛рд│рд╛ рджреБрдкреНрдкрдЯ, рдлрдХреНрдд рдПрдХ рдирдЬрд░ рдЬрд╛рд╕реНрдд.
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдЪрд╛ рдПрдХ рдХрдкреНрдкрд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдирд╛рд╡рд╛рд╡рд░реВрди рдХреЛрдгрддрд╛ рдХрдкреНрдкрд╛ рддреЗ рдореЛрдЬрддрд╛ рдпреЗрдд рдЕрд╕реЗрд▓, рддрд░ рдЖрдХрд╛рд░ рдХрд┐рддреАрд╣реА рдЕрд╕реЛ, рдПрдХрдЪ рдирдЬрд░: O(1).
Big-O рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛ рд╡рд╛рдвреАрдЪрд╛ рдЖрдХрд╛рд░. рд╕реЗрдХрдВрдж рдирд╛рд╣реА, computer рдирд╛рд╣реА тАФ рдлрдХреНрдд рдЖрдХрд╛рд░. рдХреЛрдгрддреНрдпрд╛рд╣реА loop рдЪрд╛ рдЖрдХрд╛рд░ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓рд╛ рдХреА рдпреЛрдЧреНрдп structure рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдЖрдкреЛрдЖрдк рдирд┐рд╡рдбрд▓рд╛ рдЬрд╛рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
A["n = 1,000"] -->|"├Ч2"| B["n = 2,000"]
B --> C["O(1): same ┬╖ O(log n): +1 ┬╖ O(n): ├Ч2 ┬╖ O(n log n): ├Ч2.1 ┬╖ O(n┬▓): ├Ч4 ┬╖ O(2тБ┐): squared"]
тЭУ рдХрд╛рдп
| рдЖрдХрд╛рд░ | рдирд╛рд╡ | input рджреБрдкреНрдкрдЯ рдХреЗрд▓рд╛ тЖТ | рдЙрджрд╛рд╣рд░рдг |
|---|---|---|---|
| O(1) | constant | рддреЗрд╡рдвреЗрдЪ | lockers[17], d[key], push/pop |
| O(log n) | logarithmic | +1 step | binary search, balanced tree, heap push |
| O(n) | linear | ├Ч2 | list scan рдХрд░рдгреЗ, рд╢рдмреНрдж рдореЛрдЬрдгреЗ |
| O(n log n) | linearithmic | ├Ч2 рдЖрдгрд┐ рдереЛрдбреЗ рдЬрд╛рд╕реНрдд | merge sort, sorted() |
| O(n┬▓) | quadratic | ├Ч4 | loop рдЪреНрдпрд╛ рдЖрдд loop, bubble sort |
| O(2тБ┐) | exponential | рд╡рд░реНрдЧ (squared) | рд╕рд╛рдзрд╛ fib, рдкреНрд░рддреНрдпреЗрдХ subset рдХрд░реВрди рдкрд╛рд╣рдгреЗ |
- рд╕реЗрдХрдВрдж рдирд╛рд╣реА, steps рдореЛрдЬрд╛. constants рдХрд╛рдврд╛ (3n тЖТ O(n)); рд╕рд░реНрд╡рд╛рдд рдореЛрдареЗ рдкрдж рдареЗрд╡рд╛ (n┬▓ + n тЖТ O(n┬▓)). рд╡реЗрдЧрд│реЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдирд╕реЗрд▓ рддрд░ worst case.
- Space рд▓рд╛рд╣реА рдЖрдХрд╛рд░ рдЕрд╕рддреЛ: merge sort рд▓рд╛ O(n) рдЬрд╛рд╕реНрддреАрдЪреА рдЬрд╛рдЧрд╛ рд▓рд╛рдЧрддреЗ, memo table рд▓рд╛ O(n), рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА swap рд▓рд╛ O(1).
- Amortised:
appendрдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ O(1) рдЕрд╕рддреЛ, рдЬрд░реА array рдЕрдзреВрдирдордзреВрди copy рдХрд░реВрди рд╡рд╛рдврддреЛ рддрд░реА тАФ рдЕрдиреЗрдХ appends рд╡рд░ рд╕рд░рд╛рд╕рд░реА рдХрд╛рдврд▓реНрдпрд╛рд╡рд░.
ЁЯдФ рдХрд╛
рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ рдпреЗрдгрд╛рд░рд╛ page рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдЖрдХрд╛рд░рд╛рдЪрд╛ рдкреНрд░рд╢реНрди рдЕрд╕рддреЛ: рджрд╣рд╛ рд▓рд╛рдЦ rows рд╡рд░
nested loop (n┬▓), loop рдордзреНрдпреЗ list.pop(0) (рдкреНрд░рддреНрдпреЗрдХ pop рд▓рд╛ n), dict рд╣рд╡рд╛ рд╣реЛрддрд╛
рддрд┐рдереЗ рдХреЗрд▓реЗрд▓рд╛ lookup. рдореБрд▓рд╛рдЦрддреАрдВрдордзреНрдпреЗ рд╣реЗ рд╡рд┐рдЪрд╛рд░рддрд╛рдд рдХрд╛рд░рдг production рдпрд╛рдЪреЗрдЪ рдмрдирд▓реЗрд▓реЗ рдЕрд╕рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
demo.py bigo 1k, 10k рдЖрдгрд┐ 100k рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдЪреА рдиреЛрдВрджрд╡рд╣реА рдмрдирд╡рддреЛ рдЖрдгрд┐
рд╢реЗрд╡рдЯрдЪрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рддреАрди рдкреНрд░рдХрд╛рд░реЗ рд╢реЛрдзрддреЛ тАФ linear, binary, hash тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА steps рдЖрдгрд┐ milliseconds
print рдХрд░рддреЛ. step counts functions рдордзреВрдирдЪ рдпреЗрддрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dsa/demo.py bigo
python3 dsa/test_dsa.py
python3 - <<'EOF'
import time
for n in (10_000, 20_000, 40_000):
xs = list(range(n)); t = time.perf_counter()
pairs = sum(1 for i in range(n) for j in range(i + 1, n, 97)) # a thinned n┬▓ loop
print(n, f"{(time.perf_counter() - t) * 1000:.0f} ms") # watch it ├Ч4 each time n doubles
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Linear steps 1,000 тЖТ 10,000 тЖТ 100,000 рдЕрд╕реЗ рд╡рд╛рдврддрд╛рдд (рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА ├Ч10); binary steps
10 тЖТ 14 тЖТ 17 (рдкреНрд░рддреНрдпреЗрдХ ├Ч10 рд▓рд╛ рд╕реБрдорд╛рд░реЗ +3); hash 1 рд╡рд░рдЪ рд░рд╛рд╣рддреЛ. n рджреБрдкреНрдкрдЯ рдЭрд╛рд▓рд╛ рдХреА n┬▓ loop рдЪрд╛
рд╡реЗрд│ рд╕рд╛рдзрд╛рд░рдг рдЪрд╛рд░рдкрдЯ рд╣реЛрддреЛ. test_dsa.py OK print рдХрд░рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Big-O рдбреЛрд│реНрдпрд╛рдВрдирд╛ рджрд┐рд╕рддреЛ: рддреБрдореНрд╣реА рд╕реНрд╡рддрдГрдЪреНрдпрд╛ machine рд╡рд░ рддреАрди рдЖрдХрд╛рд░ рд╡рд╛рдврддрд╛рдирд╛ рдкрд╛рд╣рд┐рд▓реЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд╛рдЧрдгреНрдпрд╛рд╡рд░реВрди рдирд╛рд╡ рджреЗрдК рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ machines рдордзрд▓реЗ milliseconds рддреБрд▓рдирд╛ рдХрд░рдгреЗ. рдЖрдХрд╛рд░рд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рд╛; steps рдореЛрдЬрд╛.
- "O(1) рдиреЗрд╣рдореА O(n) рдкреЗрдХреНрд╖рд╛ рдЬрд▓рдж рдЕрд╕рддреЛ." n = 5 рд╕рд╛рдареА рдирд╛рд╣реА. рдЖрдХрд╛рд░ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдард░рддрд╛рдд.
- рд▓рдкрд▓реЗрд▓рд╛ loop рд╡рд┐рд╕рд░рдгреЗ:
x in listO(n) рдЖрд╣реЗ;x in setO(1) рдЖрд╣реЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ scaling incident рдореНрд╣рдгрдЬреЗ рдЕрд╕рд╛ рдЖрдХрд╛рд░ рдЬреЛ n = 1,000 рд▓рд╛ рдареАрдХ рд╣реЛрддрд╛ рдЖрдгрд┐ n = 1,000,000 рд▓рд╛ рдШрд╛рддрдХ рдард░рд▓рд╛. ship рдХрд░рдгреНрдпрд╛рдЖрдзреА рдЖрдХрд╛рд░рд╛рд▓рд╛ рдирд╛рд╡ рджреЗрдгреЗ рд╣реЗ рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд performance рдХрд╛рдо рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 02 тАФ arrays рдЖрдгрд┐ strings: рд▓реЙрдХрд░реНрд╕рдЪреА рд░рд╛рдВрдЧ, рдЖрдгрд┐ рд╡рд╛рдЪрдгреЗ рдЬрд▓рдж рдкрдг рдордзреЗ рд╡рд╛рдврд╡рдгреЗ рдХрд╛ рдЬрд▓рдж рдирд╛рд╣реА.