ЁЯЧВя╕П рдзрдбрд╛ 05 тАФ Hash maps рдЖрдгрд┐ sets: рдирд╛рд╡рд╛рдиреБрд╕рд╛рд░ рдХрдкреНрдкреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдкреБрдвреЗ: lesson-06-recursion
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ05. dict рдЖрдгрд┐ set рдорд╛рдЧрдЪрд╛ structure, рджрд┐рд╕рдгрд╛рд▒реНрдпрд╛ buckets рд╕рд╣ рдмрдирд╡рд▓реЗрд▓рд╛,
рдореНрд╣рдгрдЬреЗ collisions рдЖрдгрд┐ rehashing рдШрдбрддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕рддрд╛рдд.
- dsa/structures.py тАФ
HashMap: buckets,put/get, collision counter, 75% рднрд░рд▓реНрдпрд╛рд╡рд░ rehash - dsa/demo.py тАФ
hashmap: рдЪрд╛рд░ boxes рдордзреНрдпреЗ рдЖрда рд╡рд┐рджреНрдпрд╛рд░реНрдереА, рдордЧ рд╕реЛрд│рд╛ boxes; рд╢рдмреНрдж рдореЛрдЬрдгреЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рд▓рд╛ рдПрдХ рдХрдкреНрдкрд╛ рдорд┐рд│рддреЛ, рдЖрдгрд┐ рд╢рд┐рдкрд╛рдпрд╛рдХрдбреЗ рдПрдХ рдирд┐рдпрдо рдЖрд╣реЗ рдЬреЛ рдХреЛрдгрддреНрдпрд╛рд╣реА
рдирд╛рд╡рд╛рдЪреЗ box рдХреНрд░рдорд╛рдВрдХрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдХрд░рддреЛ: hash("Dipika") % 8 = 3. рджреАрдкрд┐рдХрд╛рдЪреЗ рдкрддреНрд░ рдареЗрд╡рд╛рдпрд▓рд╛
рдХрд┐рдВрд╡рд╛ рдХрд╛рдврд╛рдпрд▓рд╛ box рдореЛрдЬрд╛, рдЙрдШрдбрд╛ тАФ рдПрдХ step, рд╢рд╛рд│рд╛ рдХрд┐рддреАрд╣реА рдореЛрдареА рдЕрд╕реЛ.
рдХрдзреАрдХрдзреА рджреЛрди рдирд╛рд╡реЗ рдПрдХрд╛рдЪ box рдордзреНрдпреЗ рдпреЗрддрд╛рдд (collision): box рдордзреНрдпреЗ рдПрдХ рдЫреЛрдЯреА
list рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рдПрдХрд╛рдРрд╡рдЬреА рджреЛрди рдкрддреНрд░реЗ рддрдкрд╛рд╕рддрд╛. boxes рддреАрди
рдЪрддреБрд░реНрдерд╛рдВрд╢ рднрд░рд▓реЗ рдХреА рд╢рд┐рдкрд╛рдИ рддреНрдпрд╛рдВрдирд╛ рджреБрдкреНрдкрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рд╕рдЧрд│реЗ рдкреБрдиреНрд╣рд╛ рд▓рд╛рд╡рддреЛ, рдореНрд╣рдгрдЬреЗ boxes
рдЫреЛрдЯреЗ рд░рд╛рд╣рддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
K["'Dipika'"] -->|"hash % 8"| B3["box 3: (Dipika, 3A)"]
Z["'Zoya'"] -->|"hash % 8"| B3
S["'Katrina'"] -->|"hash % 8"| B6["box 6: (Katrina, 3A)"]
тЭУ рдХрд╛рдп
- Hash function: рдирд╛рд╡ тЖТ рд╕рдВрдЦреНрдпрд╛, рдЬрд▓рдж, рд╕рдорд╛рди рдкрд╕рд░рд▓реЗрд▓реА. Python рдордзреНрдпреЗ
hash(). - Bucket:
hash(key) % buckets; collisions bucket рдЪреНрдпрд╛ list рдордзреНрдпреЗ рдЬрд╛рддрд╛рдд (chaining) рдХрд┐рдВрд╡рд╛ рдкреБрдврдЪреНрдпрд╛ рд░рд┐рдХрд╛рдореНрдпрд╛ slot рдордзреНрдпреЗ (open addressing тАФ CPython рдЪрд╛ dict). - Load factor: items / buckets; buckets рдЫреЛрдЯреЗ рдареЗрд╡рд╛рдпрд▓рд╛ ~0.75 рдУрд▓рд╛рдВрдбрд▓реЗ рдХреА rehash (рджреБрдкреНрдкрдЯ) рдХрд░рд╛. Get/put рд╕рд░рд╛рд╕рд░реА O(1), рдлрдХреНрдд рдЕрддрд┐рд╢рдп рд╡рд╛рдИрдЯ hash рдЕрд╕реЗрд▓ рддрд░ O(n).
- Keys hashable рдЕрд╕рд╛рдпрд▓рд╛рдЪ рд╣рд╡реНрдпрд╛рдд (immutable): str, int, tuple тАФ list рдирд╛рд╣реА.
- Set = values рдирд╕рд▓реЗрд▓рд╛ hash map: membership рдЖрдгрд┐ dedupe O(1) рдордзреНрдпреЗ.
- Patterns: рдореЛрдЬрдгреА (
counts[w] += 1), grouping, dedupe (set(xs)), рдПрдХрд╛ pass рдордзреНрдпреЗ two-sum (seen[target - x]), caching (рдзрдбрд╛ 11).
ЁЯдФ рдХрд╛
"рдЬрд▓рдж рдХрд░рд╛" рдпрд╛рдЪрд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ рдореНрд╣рдгрдЬреЗ "рддреЛ рдЖрддрд▓рд╛ loop dict рдиреЗ рдмрджрд▓рд╛". рдирд╛рд╡рд╛рдиреЗ рдЧреЛрд╖реНрдЯреА рд╢реЛрдзрд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ рддреЗрд╡реНрд╣рд╛ рд╣рд╛рдЪ рдкрд╣рд┐рд▓рд╛ structure рд╣рд╛рддреА рдШреНрдпрд╛рдпрдЪрд╛, рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рджреЛрди рдЦрд░реНрдЪ (memory, рдХреНрд░рдо рдирд╛рд╣реА) рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗ рдХреА рддреЛ рдЯрд╛рд│рд╛рдпрдЪрд╛ рдЕрд╢реА рджреБрд░реНрдорд┐рд│ рдкреНрд░рдХрд░рдгреЗ рдХрд│рддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
HashMap 25 рдУрд│реАрдВрдЪрд╛ рдЖрд╣реЗ: _slot box рдореЛрдЬрддреЛ, put box рдордзреНрдпреЗ рдЖрдзреАрдЪреА key
рдЖрд╣реЗ рдХрд╛ рддреЗ рдкрд╛рд╣рддреЛ, box рд░рд┐рдХрд╛рдорд╛ рдирд╕реЗрд▓ рддрд░ рдПрдХ collision рдореЛрдЬрддреЛ, append рдХрд░рддреЛ, рдЖрдгрд┐
75% рдУрд▓рд╛рдВрдбрд▓реЗ рдХреА rehash рдХрд░рддреЛ. demo.py hashmap рдЪрд╛рд░ boxes рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЛ рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА
рддреЛ рд╡рд╛рдврддрд╛рдирд╛ рдкрд╛рд╣реВ рд╢рдХрддрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dsa/demo.py hashmap
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import HashMap
hm = HashMap(buckets=2)
for i in range(1000): hm.put(f"pupil{i}", i)
print(len(hm), "pupils in", len(hm._b), "boxes; longest box:", max(len(b) for b in hm._b))
# two-sum in one pass with a dict (unsorted input тАФ no two pointers needed):
xs, target, seen = [8, 3, 11, 6, 1], 14, {}
for i, x in enumerate(xs):
if target - x in seen: print("pair:", seen[target - x], i); break
seen[x] = i
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдЖрда рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд╢реЗрд╡рдЯреА 16 boxes рдордзреНрдпреЗ рдЬрд╛рддрд╛рдд (collision count рдкреНрд░рддреНрдпреЗрдХ run рд▓рд╛ рдмрджрд▓рддреЛ рдХрд╛рд░рдг
Python string hashes рдирд╛ salt рд▓рд╛рд╡рддреЛ); рд╢рдмреНрджрд╛рдВрдЪреА рдореЛрдЬрдгреА
{'the': 3, тАж}. рддреБрдордЪреЗ рд╣рдЬрд╛рд░ рд╡рд┐рджреНрдпрд╛рд░реНрдереА 2,048 boxes рдордзреНрдпреЗ рдмрд╕рддрд╛рдд рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд▓рд╛рдВрдм box рдордзреНрдпреЗ
рдлрдХреНрдд рдХрд╛рд╣реАрдЪ рдЕрд╕рддрд╛рдд; two-sum pair: 1 2 print рдХрд░рддреЛ (3 + 11).
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
hashing рдореБрд│реЗ lookup O(1) рд╣реЛрддрд╛рдирд╛ рддреБрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗ, collisions рд╣рд╛рддрд╛рд│рд▓реЗ рдЬрд╛рддрд╛рдирд╛ рдЖрдгрд┐ boxes рджреБрдкреНрдкрдЯ рд╣реЛрддрд╛рдирд╛ рдкрд╛рд╣рд┐рд▓реЗ, рдЖрдгрд┐ n┬▓ loop рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрдгрд╛рд░рд╛ рдПрдХрд╛ pass рдЪрд╛ dict pattern рд╡рд╛рдкрд░рд▓рд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- loop рдЪреНрдпрд╛ рдЖрдд
x in list(O(n┬▓)), рдЬрд┐рдереЗx in setрдПрдХреВрдг O(n) рдЖрд╣реЗ. - list рд▓рд╛ dict key рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдгреЗ (unhashable) рдХрд┐рдВрд╡рд╛ insertion рдирдВрддрд░ рдмрджрд▓рдгрд╛рд░рд╛ mutable object рд╡рд╛рдкрд░рдгреЗ.
- logic рд╕рд╛рдареА dict рдЪреНрдпрд╛ рдХреНрд░рдорд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд░рд╛рд╣рдгреЗ (insertion order рдЯрд┐рдХрддреЛ, рдкрдг рддреЗ sorting рдирд╛рд╣реА).
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: caches, sessions, indexes, deduplication, database engine рдордзрд▓реЗ joins, DNS resolvers тАФ hash maps рд╣реЗрдЪ рдХрд╛рдорд╛рдЪреЗ рдШреЛрдбреЗ рдЖрд╣реЗрдд. рд╡рд╛рдИрдЯ hash рдЕрд╕рд▓реЗрд▓рд╛ "O(1)" cache рдореНрд╣рдгрдЬреЗ рдПрдХ incident.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 06 тАФ recursion: рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрдХ рдЙрдкрдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрдХрд╛рдВрдирд╛ рд╡рд┐рдЪрд╛рд░рддрд╛рдд, рдЖрдгрд┐ рдлрд│реНрдпрд╛рд╢рд┐рд╡рд╛рдп fib рдХрд╛ рдлреБрдЯрддреЗ.