ЁЯФН рдзрдбрд╛ 08 тАФ Binary search: рдХреНрд░рдорд╛рдиреЗ рд▓рд╛рд╡рд▓реЗрд▓реА рдиреЛрдВрджрд╡рд╣реА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдкреБрдвреЗ: lesson-09-trees-heaps
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08. O(log n) рдЪреА рдЪрд╛рд▓, рдкреНрд░рддреНрдпреЗрдХрд╛рдХрдбреВрди рдПрдХрджрд╛ рддрд░реА рдЪреБрдХрдгрд╛рд░рд╛ loop, рдЖрдгрд┐ рдЙрддреНрддрд░рд╛рд╡рд░ binary search рдХрд░рдгреНрдпрд╛рдЪреА рдпреБрдХреНрддреА.
- dsa/algorithms.py тАФ
binary_search(index рдЖрдгрд┐ steps рдкрд░рдд рдХрд░рддреЛ),linear_search - dsa/demo.py тАФ
search: 50,000 рд╡рд┐рджреНрдпрд╛рд░реНрдереА, рдордЧ locker рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдЪрд╛ рдкреНрд░рд╢реНрди
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдиреЛрдВрджрд╡рд╣реА рдХреНрд░рдорд╛рдиреЗ рд▓рд╛рд╡рд▓реЗрд▓реА рдЖрд╣реЗ. рддреА рдордзреЛрдордз рдЙрдШрдбрд╛: "Dipika" тАФ рддреБрдордЪреЗ рдирд╛рд╡ рдЖрдзреА рдЖрд╣реЗ рдХреА рдирдВрддрд░? рдЪреБрдХреАрдЪрд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ рдлреЗрдХреВрди рджреНрдпрд╛ рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓рд╛ рдЕрд░реНрдзрд╛ рдордзреЛрдордз рдЙрдШрдбрд╛. рдкрдиреНрдирд╛рд╕ рд╣рдЬрд╛рд░ рдирд╛рд╡рд╛рдВрдирд╛ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рд╕реЛрд│рд╛ рдирдЬрд░рд╛ рд▓рд╛рдЧрддрд╛рдд; рджрд╣рд╛ рд▓рд╛рдЦрд╛рдВрдирд╛ рд╡реАрд╕. рд╣реАрдЪ рдпреБрдХреНрддреА рдиреЛрдВрджрд╡рд╣реА рдЕрдЬрд┐рдмрд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдВрдЪреАрд╣реА рдЙрддреНрддрд░реЗ рджреЗрддреЗ: "рд╕рдЧрд│реНрдпрд╛ рджрдкреНрддрд░рд╛рдВрдирд╛ рдкреБрд░реЗрд▓ рдЕрд╕рд╛ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди locker рдХреЛрдгрддрд╛?" рдПрдХ рдЖрдХрд╛рд░ рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рдмрд╕рддреЗ? рдордЧ рд▓рд╣рд╛рди рдХрд░реВрди рдкрд╛рд╣рд╛; рдмрд╕рдд рдирд╛рд╣реА? рдореЛрдард╛ рдХрд░реВрди рдкрд╛рд╣рд╛. рдЙрддреНрддрд░ рд╡рд╛рдврддрд╛рдирд╛ рдПрдХрджрд╛рдЪ рдЙрд▓рдЯрдгрд╛рд░рд╛ рдХреЛрдгрддрд╛рд╣реА рд╣реЛ/рдирд╛рд╣реА рдкреНрд░рд╢реНрди рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рд╢реЛрдзрддрд╛ рдпреЗрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
A["lo=0 ┬╖ hi=49,999 ┬╖ mid=24,999"] -->|"target bigger"| B["lo=25,000 ┬╖ hi=49,999"] -->|"target smaller"| C["lo=25,000 ┬╖ hi=37,499"] --> D["тАж 16 looks"]
тЭУ рдХрд╛рдп
- рдкреВрд░реНрд╡рдЕрдЯ: sorted (рдХрд┐рдВрд╡рд╛ monotonic). рдЦрд░реНрдЪ O(log n) рд╡реЗрд│, O(1) space.
- Loop:
lo, hi = 0, n-1; рдЬреЛрдкрд░реНрдпрдВрддlo <= hi:mid = (lo+hi)//2; рд╕рдорд╛рди тЖТ рд╕рд╛рдкрдбрд▓реЗ; рд▓рд╣рд╛рди тЖТlo = mid+1; рдореЛрдареЗ тЖТhi = mid-1; рдУрд▓рд╛рдВрдбрд▓реЗ тЖТ рд╕рд╛рдкрдбрд▓реЗ рдирд╛рд╣реА. - рдкреНрд░рдХрд╛рд░: рдкрд╣рд┐рд▓реА/рд╢реЗрд╡рдЯрдЪреА occurrence, insertion point (
bisect.bisect_left), рдЙрддреНрддрд░рд╛рд╡рд░ search (check pass рд╣реЛрдгрд╛рд░реА рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди value). - рдХрд╛рдорд╛рд╡рд░ рд╣реЗ рдХреБрдареЗ рдЕрд╕рддреЗ:
bisect, database B-tree indexes (Database school L06),git bisect, version ranges, rate-limit thresholds.
ЁЯдФ рдХрд╛
O(1) рдирдВрддрд░рдЪреА рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдЧреЛрд╖реНрдЯ O(log n) рдЖрд╣реЗ, рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рдлрдХреНрдд рдХреНрд░рдо рд▓рд╛рдЧрддреЛ. "scan рдкреЗрдХреНрд╖рд╛ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░рддрд╛ рдпреЗрдИрд▓ рдХрд╛?" рдпрд╛рдЪрд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ рдореНрд╣рдгрдЬреЗ "рд╣реЗ sorted рдЖрд╣реЗ рдХрд╛, рдХрд┐рдВрд╡рд╛ рд╣реЛрдК рд╢рдХрддреЗ рдХрд╛?" answer-search рдкреНрд░рдХрд╛рд░ optimisation рдкреНрд░рд╢реНрдирд╛рдВрдЪрд╛ рдПрдХ рдкреВрд░реНрдг рд╡рд░реНрдЧ рддреНрдпрд╛рдЪ рдЖрда рдУрд│реАрдВрдиреА рд╕реЛрдбрд╡рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
binary_search рдЖрдкрд▓реЗ loops рдореЛрдЬрддреЛ; demo.py search рддреНрдпрд╛рдЪ 50,000 рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрд╡рд░ рддреНрдпрд╛рдЪреНрдпрд╛ 15 рдирдЬрд░рд╛рдВрдЪреА
linear search рдЪреНрдпрд╛ 41,235 рд╢реА рддреБрд▓рдирд╛ рдХрд░рддреЛ, рдордЧ fits(cap) check рд╡рд╛рдкрд░реВрди locker
capacities 1тАУ240 рд╡рд░ binary search рдХрд░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dsa/demo.py search
python3 - <<'EOF'
import sys, bisect; sys.path.insert(0, "dsa"); from algorithms import binary_search
reg = [3, 7, 7, 7, 12, 20]
print(binary_search(reg, 12), binary_search(reg, 5)) # (4, steps), (-1, steps)
print("first 7 at", bisect.bisect_left(reg, 7), "┬╖ insert 10 at", bisect.bisect_left(reg, 10))
# search on the answer: the first version where the tests fail
def fails(v): return v >= 137
lo, hi = 1, 1000
while lo < hi:
mid = (lo + hi) // 2
if fails(mid): hi = mid
else: lo = mid + 1
print("first failing version:", lo, "found in ~10 checks")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Linear 41,235 рдирдЬрд░рд╛ рд╡рд┐рд░реБрджреНрдз binary 15 (logтВВ 50,000 тЙИ 15.6); locker рдЪреЗ рдЙрддреНрддрд░
90 kg; рддреБрдордЪрд╛ bisect рдкрд╣рд┐рд▓рд╛ 7 index 1 рд╡рд░ рдЖрдгрд┐ 10 рд╕рд╛рдареАрдЪрд╛ insertion point
index 4 рд╡рд░ print рдХрд░рддреЛ; "first failing version" 137 рдЖрд╣реЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА binary search рдЖрдард╡рдгреАрддреВрди рд▓рд┐рд╣реВ рд╢рдХрддрд╛, рдирд╕рд▓реЗрд▓реА key рд╣рд╛рддрд╛рд│реВ рд╢рдХрддрд╛, рдЖрдгрд┐ рд╣реЛ/рдирд╛рд╣реА рдкреНрд░рд╢реНрдирд╛рдЪреЗ рд╢реЛрдзрддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ range рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд░реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
mid - 1рдРрд╡рдЬреАhi = mid(рдХрд┐рдВрд╡рд╛ рдЙрд▓рдЯ) тЖТ рдЕрдирдВрдд loop рдХрд┐рдВрд╡рд╛ рд╕реБрдЯрд▓реЗрд▓рд╛ element.- unsorted list рдордзреНрдпреЗ search рдХрд░рдгреЗ. рддреЗ рд╢рд╛рдВрддрдкрдгреЗ рдирд┐рд░рд░реНрдердХ рдЙрддреНрддрд░ рджреЗрддреЗ.
- рдард░рд▓реЗрд▓реНрдпрд╛ рд░реБрдВрджреАрдЪреЗ ints рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ
(lo + hi)рдордзреНрдпреЗ overflow; Python рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ database index lookup, рдкреНрд░рддреНрдпреЗрдХ "рдпрд╛ timestamp рд╕рд╛рдареАрдЪрд╛ config рд╢реЛрдзрд╛", рдкреНрд░рддреНрдпреЗрдХ capacity-planning рдордзрд▓рд╛ "рдмрд╕рдгрд╛рд░рд╛ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди instance" рдореНрд╣рдгрдЬреЗ binary search тАФ рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓реЗрд▓рд╛, рдХрдзреАрдХрдзреА рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 09 тАФ trees рдЖрдгрд┐ heaps: рдХреЕрдЯрд▓реЙрдЧрдЪрд╛ рдЦрдг рдЖрдгрд┐ рд╡реНрдпрд╛рд╕рдкреАрда.