ЁЯОп рдзрдбрд╛ 12 тАФ рдпреЛрдЧреНрдп structure рдирд┐рд╡рдбрдгреЗ: рдкреНрд░рд╢реНрди рдард░рд╡рддреЛ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 ┬╖ ЁЯОУ рд╢реЗрд╡рдЯрдЪрд╛
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ12 тАФ рдкреВрд░реНрдг рдХреЛрд░реНрд╕. рдирд┐рд░реНрдгрдп рддрдХреНрддрд╛, complexity cheat sheet, рдХреЛрдгрддреНрдпрд╛рд╣реА problem рд╕рд╛рдареА рд╕рд╛рдд рдкрд╛рдпрд▒реНрдпрд╛рдВрдЪреА рдкрджреНрдзрдд, рдЖрдгрд┐ рдХрд│рд╕-рдкреНрд░рдХрд▓реНрдк (capstone).
- dsa/demo.py тАФ
choose: рдирд┐рд░реНрдгрдп рддрдХреНрддрд╛ - dsa/test_dsa.py тАФ рд╕рдЧрд│реНрдпрд╛рд╡рд░рдЪрд╛ smoke test
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрддрд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрдХрд░рд╛ рдЬрд╛рдЧрд╛ рдЖрдгрд┐ рдЪрд╛рд▓реА рдЖрд╣реЗрдд. рд╢реЗрд╡рдЯрдЪреЗ рдХреМрд╢рд▓реНрдп рдореНрд╣рдгрдЬреЗ рдкреНрд░рд╢реНрди рдРрдХреВрди рддреЛ рдХрд╢рд╛рдЪреА рдорд╛рдЧрдгреА рдХрд░рддреЛ рддреЗ рдУрд│рдЦрдгреЗ. "рдЬрд╛рдЧреЗрдиреБрд╕рд╛рд░?" тАФ lockers. "рдирд╛рд╡рд╛рдиреЗ?" тАФ рдХрдкреНрдкреЗ. "рд╕рд░реНрд╡рд╛рдд рдЕрд▓реАрдХрдбрдЪрд╛ рдЖрдзреА?" тАФ рдЯреНрд░реЗрдЪреА рдЪрд│рдд. "рдЖрдзреА рдЖрд▓реЗрд▓реНрдпрд╛рд▓рд╛ рдЖрдзреА?" тАФ рдЬреЗрд╡рдгрд╛рдЪреА рд░рд╛рдВрдЧ. "рдиреЗрд╣рдореА рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди?" тАФ рд╡реНрдпрд╛рд╕рдкреАрда. "Sorted, рдЖрдгрд┐ рд╕рддрдд рдмрджрд▓рдд рд░рд╛рд╣рдгрд╛рд░реЗ?" тАФ рдХреЕрдЯрд▓реЙрдЧрдЪрд╛ рдЦрдг. "рдЦреЛрд▓реНрдпрд╛ рдЖрдгрд┐ рдХреЙрд░рд┐рдбреЙрд░?" тАФ рдирдХрд╛рд╢рд╛. "рддреЛрдЪ рдЫреЛрдЯрд╛ рдкреНрд░рд╢реНрди рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛?" тАФ рдлрд│рд╛. рдкреНрд░рд╢реНрди рдореЛрдареНрдпрд╛рдиреЗ рдмреЛрд▓рд╛; structure рд╕реНрд╡рддрдГ рдЙрддреНрддрд░ рджреЗрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TD
Q{"what does the question ask for?"}
Q -->|"the i-th thing"| A["array"] ; Q -->|"by name"| H["hash map / set"]
Q -->|"most recent first"| S["stack"] ; Q -->|"first come first served"| U["queue"]
Q -->|"smallest / biggest, repeatedly"| P["heap"] ; Q -->|"sorted while changing"| T["balanced tree"]
Q -->|"rooms and corridors"| G["graph + BFS / DFS / Dijkstra"] ; Q -->|"overlapping sub-problems"| D["DP"]
тЭУ рдХрд╛рдп
Cheat sheet
| Structure / рдЪрд╛рд▓ | рдЦрд░реНрдЪ | рдХреЗрд╡реНрд╣рд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ |
|---|---|---|
| list index / append | O(1) | рдЬрд╛рдЧрд╛ (position), batches |
| list insert front / pop(0) | O(n) | loop рдордзреНрдпреЗ рдХрдзреАрдЪ рдирд╛рд╣реА тАФ deque рд╡рд╛рдкрд░рд╛ |
| dict / set | рд╕рд░рд╛рд╕рд░реА O(1) | рдирд╛рд╡рд╛рдиреЗ, рдореЛрдЬрдгреА, dedupe, caching |
| deque | рджреЛрдиреНрд╣реА рдЯреЛрдХрд╛рдВрдирд╛ O(1) | queues, windows |
| heapq push/pop | O(log n) | рдкреБрдврдЪрд╛ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди, top-k, Dijkstra |
| sorted() | O(n log n) | рдПрдХрджрд╛, рдордЧ bisect рдХрд┐рдВрд╡рд╛ sweep |
| bisect | O(log n) | sorted рдЖрдгрд┐ рди рдмрджрд▓рдгрд╛рд░реЗ |
| balanced tree / B-tree | O(log n) | sorted рдЖрдгрд┐ рдмрджрд▓рдгрд╛рд░реЗ, ranges |
| BFS / DFS | O(V + E) | hops, reachability, рдХреНрд░рдо |
| Dijkstra | O(E log V) | weighted рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди path |
| DP | poly | overlapping sub-problems |
рдкрджреНрдзрдд (рдореБрд▓рд╛рдЦрддреА рдЖрдгрд┐ design reviews рджреЛрдиреНрд╣реАрдВрд╕рд╛рдареА): 1 рдкреНрд░рд╢реНрди рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╣ рдкреБрдиреНрд╣рд╛ рдорд╛рдВрдбрд╛ ┬╖ 2 brute force рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ O рд╕рд╛рдВрдЧрд╛ ┬╖ 3 pattern рдУрд│рдЦрд╛ (two pointers? рдирд╛рд╡рд╛рдиреЗ? рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди path?) ┬╖ 4 structure рдирд┐рд╡рдбрд╛ ┬╖ 5 code рд▓рд┐рд╣рд╛ ┬╖ 6 рдЯреЛрдХрд╛рдЪреНрдпрд╛ cases test рдХрд░рд╛ (рд░рд┐рдХрд╛рдореЗ, рдПрдХ, duplicates, рдкреНрд░рдЪрдВрдб) ┬╖ 7 рд╡реЗрд│ рдЖрдгрд┐ space рд╕рд╛рдВрдЧрд╛, рдЖрдгрд┐ рддреБрдореНрд╣реА рдирд┐рд╡рдбрд▓реЗрд▓рд╛ trade-off.
ЁЯдФ рдХрд╛
heap implement рдХрд░рд╛рдпрдЪреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдкреИрд╕реЗ рдорд┐рд│рдд рдирд╛рд╣реАрдд; nested loop рдПрдХрдЪ loop рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡рд╛ рд╣реЛрддрд╛ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рдЪреЗ рдорд╛рддреНрд░ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдорд┐рд│рддрд╛рдд. рддрдХреНрддрд╛ рдЖрдгрд┐ рдкрджреНрдзрдд рдПрдХрд╛ рдзреВрд╕рд░ "рдЬрд▓рдж рдХрд░рд╛" рдЪреЗ рдкрд╛рдЪ рдорд┐рдирд┐рдЯрд╛рдВрдЪреНрдпрд╛ рдирд┐рд░реНрдгрдпрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдХрд░рддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
demo.py choose рдирд┐рд░реНрдгрдп рддрдХреНрддрд╛ print рдХрд░рддреЛ; repo рдордзрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ structure рдЖрдгрд┐ рдХреГрддреА
рддрд┐рдЪреНрдпрд╛ docstring рдиреЗ рджрд┐рд▓реЗрд▓реЗ рд╡рдЪрди рдкрд╛рд│рддреЗ рдпрд╛рдЪрд╛ рдкреБрд░рд╛рд╡рд╛ рдореНрд╣рдгрдЬреЗ test_dsa.py.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dsa/demo.py choose
python3 dsa/test_dsa.py
python3 - <<'EOF'
# capstone: the timetable clash finder тАФ which pairs of meetings overlap?
import random, time
random.seed(9); M = [(s, s + random.randint(1, 3)) for s in random.choices(range(0, 200), k=500)]
t = time.perf_counter(); n2 = sum(1 for i in range(len(M)) for j in range(i + 1, len(M)) if M[i][0] < M[j][1] and M[j][0] < M[i][1]); t2 = time.perf_counter() - t
t = time.perf_counter(); ev = sorted([(s, 1, i) for i, (s, e) in enumerate(M)] + [(e, 0, i) for i, (s, e) in enumerate(M)]); open_ = set(); sw = 0
for _, kind, i in ev: # sort + sweep: ends (0) before starts (1) at the same time
if kind: sw += len(open_); open_.add(i)
else: open_.discard(i)
t1 = time.perf_counter() - t
print(f"O(n┬▓): {n2} clashes in {t2*1000:.1f} ms ┬╖ sort+sweep O(n log n): {sw} clashes in {t1*1000:.1f} ms")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдирд┐рд░реНрдгрдп рддрдХреНрддрд╛; 12 checks рд╕рд╣ tests рдХрдбреВрди OK; рджреЛрдиреНрд╣реА clash counts
рд╕рдорд╛рди, рдЖрдгрд┐ 500 meetings рд▓рд╛ sweep рдЕрдиреЗрдХ рдкрдЯреАрдВрдиреА рдЬрд▓рдж тАФ рдЖрдгрд┐ k рд╡рд╛рдврд╡рд▓рд╛ рддрд░
рд╣реЗ рдЕрдВрддрд░ рд╡рд╛рдврдд рдЬрд╛рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдирд╡реАрди рдкреНрд░рд╢реНрди рджрд┐рд▓рд╛ рддрд░ рддреБрдореНрд╣реА brute force, pattern, structure рдЖрдгрд┐ рдЦрд░реНрдЪ рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА capstone рджреЛрдиреНрд╣реА рдкреНрд░рдХрд╛рд░реЗ рдмрдирд╡рд▓рд╛ рдЖрдгрд┐ рдлрд░рдХ рдореЛрдЬрд▓рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- brute force рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЖрдзреАрдЪ рд╣реБрд╢рд╛рд░ structure рдХрдбреЗ рдзрд╛рд╡ рдШреЗрдгреЗ (рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░реВрди test рдХрд░рд╛рдпрд▓рд╛ рддреЛ рд▓рд╛рдЧрддреЛ).
- рдЪреБрдХреАрдЪрд╛ рднрд╛рдЧ optimise рдХрд░рдгреЗ: рдЖрдзреА рдореЛрдЬрд╛ (рдзрдбрд╛ 01).
- рдЯреЛрдХрд╛рдЪреЗ cases рд╡рд┐рд╕рд░рдгреЗ: рд░рд┐рдХрд╛рдорд╛ input, рдПрдХ item, рд╕рдЧрд│реЗ рд╕рдорд╛рди, рдЖрдзреАрдЪ sorted, рдкреНрд░рдЪрдВрдб.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рд╣рд╛ рддрдХреНрддрд╛ рдореНрд╣рдгрдЬреЗрдЪ performance review рдЪреА checklist: рдкреНрд░рддреНрдпреЗрдХ hot path рд▓рд╛ рддреА рдХреЛрдгрддреНрдпрд╛ row рд╡рд░ рдЖрд╣реЗ рдЖрдгрд┐ рдХрд╛, рд╣реЗ рд╕рд╛рдВрдЧрддрд╛ рдЖрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ.
ЁЯПЖ рдХрд│рд╕-рдкреНрд░рдХрд▓реНрдк (Capstone)
clash finder рд╡рд╛рдврд╡рд╛: рдХреЛрдгрддреНрдпрд╛ meetings clash рд╣реЛрддрд╛рдд рддреЗ рд╕рд╛рдВрдЧрд╛ (рдлрдХреНрдд рдХрд┐рддреА рдирд╛рд╣реА), рдЕрдиреЗрдХ рдЦреЛрд▓реНрдпрд╛рдВрдордзрд▓реНрдпрд╛ meetings рд╣рд╛рддрд╛рд│рд╛ (sweeps рдЪрд╛ dict), рдЖрдгрд┐ рд░рд┐рдХрд╛рдореНрдпрд╛ timetable, рдПрдХрдЪ meeting, рдЖрдгрд┐ рджреЛрди рд╕рд╛рд░рдЦреНрдпрд╛ meetings рд╕рд╛рдареА test рд▓рд┐рд╣рд╛. рдордЧ рдПрдХрд╛ рдкрд░рд┐рдЪреНрдЫреЗрджрд╛рдд рд╕рдордЬрд╛рд╡рд╛ рдХреА sort-and-sweep O(n log n) рдХрд╛ рдЖрд╣реЗ.
ЁЯОУ рдХреЛрд░реНрд╕ рдкреВрд░реНрдг рдЭрд╛рд▓рд╛
рдЕрднреНрдпрд╛рд╕ рдпреЛрдЬрдирд╛ рдмрд╛рд░рд╛рд╣реА рдзрдбреНрдпрд╛рдВрд╡рд░ рдЦреВрдг рдХрд░рддреЗ; quiz рддреНрдпрд╛рдВрдЪреА рддрдкрд╛рд╕рдгреА рдХрд░рддреЗ; Database school рдзрдбрд╛ 09 рдЪреЗ trees disk рд╡рд░ рдиреЗрддреЗ, рдЖрдгрд┐ School portal рд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЖрд╣реЗ.