ЁЯз╡ рдзрдбрд╛ 03 тАФ Linked lists: рдЦрдЬрд┐рдиреНрдпрд╛рдЪрд╛ рд╢реЛрдз
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдкреБрдвреЗ: lesson-04-stacks-queues
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03. arrays рдиреЗрдордХреЗ рдЬреНрдпрд╛ operation рдордзреНрдпреЗ рд╣рд░рддрд╛рдд рддреЗ рдЬрд┐рдВрдХрдгрд╛рд░рд╛ structure тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдЦрддрдХрд╛рд░ рд╡рд┐рдЪрд╛рд░рддреЛ рддреЗ рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдЙрд▓рдЯреЗ рдХрд░рдгреЗ (in-place reversal).
- dsa/structures.py тАФ
Node,LinkedListрд╕рд╣push_front,find(steps рдореЛрдЬрддреЛ),reverse - dsa/demo.py тАФ
linked
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдпрд╛ рд╡реЗрд│реА lockers рдирд╛рд╣реАрдд тАФ рдПрдХ рдЦрдЬрд┐рдиреНрдпрд╛рдЪрд╛ рд╢реЛрдз. рдкреНрд░рддреНрдпреЗрдХ рдЪрд┐рдареНрдареАрдд рдПрдХ рдирд╛рд╡ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреА рд╕рд╛рдВрдЧрддреЗ рдкреБрдврдЪреА рдЪрд┐рдареНрдареА рдХреБрдареЗ рдЖрд╣реЗ. рдЪреМрдереНрдпрд╛ рдЪрд┐рдареНрдареАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рддреАрди рд╡рд╛рдЪрд╛рд╡реНрдпрд╛рдЪ рд▓рд╛рдЧрддрд╛рдд; "рдЪрд┐рдареНрдареА рдХреНрд░рдорд╛рдВрдХ 17" рдЕрд╕реЗ рдХрд╛рд╣реА рдирд╕рддреЗ. рдкрдг рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЪрд┐рдареНрдареА рдЬреЛрдбрдгреЗ рд▓рдЧреЗрдЪ рд╣реЛрддреЗ: рддреА рд▓рд┐рд╣рд╛, рддрд┐рд▓рд╛ рдЬреБрдиреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдЪрд┐рдареНрдареАрдХрдбреЗ рджрд╛рдЦрд╡рд╛, рдЭрд╛рд▓реЗ тАФ рдХреЛрдгреАрд╣реА рд╕рд░рдХрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
H["head"] --> A["Aishwarya ┬╖ next"] --> S["Katrina ┬╖ next"] --> K["Dipika ┬╖ next"] --> M["Meera ┬╖ next"] --> N["None"]
тЭУ рдХрд╛рдп
- node = value + рдкреБрдврдЪреНрдпрд╛ node рдХрдбреЗ pointer. list рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдкрд╣рд┐рд▓рд╛
node (
head). Doubly linked: рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдирд╛ pointers. - рдЦрд░реНрдЪ: рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ push/pop O(1); рдЖрдзреАрдЪ рд╣рд╛рддрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ node рдЬрд╡рд│ insert/delete O(1); i-рд╡рд╛ node рдЧрд╛рдардгреЗ O(n); search O(n); рдкреНрд░рддреНрдпреЗрдХ element рдорд╛рдЧреЗ рдПрдХрд╛ pointer рдЪреА memory; cache рд▓рд╛ рди рдЖрд╡рдбрдгрд╛рд░реЗ (nodes рдХреБрдареЗрд╣реА рд░рд╛рд╣рддрд╛рдд).
- рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдЙрд▓рдЯреЗ рдХрд░рд╛: рддреАрди рдирд╛рд╡реЗ (
prev,cur,next) рдШреЗрдКрди рдЪрд╛рд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдг рдЙрд▓рдЯрд╛ рдлрд┐рд░рд╡рд╛: O(n) рд╡реЗрд│, O(1) рдЬрд╛рд╕реНрддреАрдЪреА рдЬрд╛рдЧрд╛. - Python рдордзреНрдпреЗ built-in linked list рдирд╛рд╣реА;
collections.dequeрд╣реА doubly linked block list рдЖрд╣реЗ рдЖрдгрд┐ queues рд╕рд╛рдареА рддреАрдЪ рд╡рд╛рдкрд░рддрд╛рдд.
ЁЯдФ рдХрд╛
queues, LRU caches, adjacency lists рдЖрдгрд┐ memory allocators linked lists рд╡рд╛рдкрд░реВрдирдЪ рдмрдирд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд, рдЖрдгрд┐ рддреАрди pointers рдбреЛрдХреНрдпрд╛рдд рдзрд░реВрди рдареЗрд╡рддрд╛ рдпреЗрддрд╛рдд рдХрд╛ рдпрд╛рдЪреА reversal рд╣реА рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд░реАрдХреНрд╖рд╛ рдЖрд╣реЗ. linked list рдХрдзреА рд╡рд╛рдкрд░реВ рдирдпреЗ (Python рдордзреНрдпреЗ рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ) рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рдгреЗ рд╣рд╛ рджреБрд╕рд░рд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
push_front Node(value, self.head) рддрдпрд╛рд░ рдХрд░рддреЛ; find рдХрд┐рддреА рдЪрд┐рдареНрдареНрдпрд╛рдВрдорд╛рдЧреЗ рдЧреЗрд▓рд╛
рддреЗ рдореЛрдЬрддреЛ; reverse рдореНрд╣рдгрдЬреЗ рддреАрди-pointer loop, рд╕рд╣рд╛ рдУрд│реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dsa/demo.py linked
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import LinkedList
ll = LinkedList()
for x in range(5, 0, -1): ll.push_front(x)
print(ll.to_list(), "find 4 in", ll.find(4), "steps")
ll.reverse(); print(ll.to_list())
# a deque does the same job at work:
from collections import deque; d = deque([1, 2, 3]); d.appendleft(0); d.pop(); print(d)
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
['Aishwarya', 'Katrina', 'Dipika', 'Meera', 'Rohan'], 2 рдЪрд┐рдареНрдареНрдпрд╛рдВрдирдВрддрд░ find 'Katrina',
рд╕рдЧрд│реНрдпрд╛ 5 рдкрд╛рд░ рдХреЗрд▓реНрдпрд╛рд╡рд░ find 'Zoya' = -1, рдЖрдгрд┐ рдЙрд▓рдЯреА рдХреЗрд▓реЗрд▓реА list. рддреБрдордЪреА рд╕реНрд╡рддрдГрдЪреА list
[1, 2, 3, 4, 5] print рдХрд░рддреЗ, 4 рд╣реЗ 4 steps рдордзреНрдпреЗ рд╢реЛрдзрддреЗ, рдордЧ рдЙрд▓рдЯреА рд╣реЛрддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рдлрдХреНрдд nodes рдЖрдгрд┐ pointers рдкрд╛рд╕реВрди list рдмрдирд╡рд▓реА, O(1) insertion рдЖрдгрд┐ O(n) search рдкрд╛рд╣рд┐рд▓реЗ, рдЖрдгрд┐ рдЬрд╛рд╕реНрддреАрдЪреНрдпрд╛ memory рд╢рд┐рд╡рд╛рдп рддреА рдЙрд▓рдЯреА рдХреЗрд▓реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЙрд▓рдЯреА рдХрд░рддрд╛рдирд╛ list рдЪрд╛ рдЙрд░рд▓реЗрд▓рд╛ рднрд╛рдЧ рдЧрдорд╛рд╡рдгреЗ (
nextoverwrite рдХрд░рдгреНрдпрд╛рдЖрдзреА save рдХрд░рд╛). - рдкреНрд░рддреНрдпреЗрдХ insert рд╢реЗрд╡рдЯреАрдЪ рд╣реЛрдд рдЕрд╕рддрд╛рдирд╛ "insert O(1) рдЖрд╣реЗ рдореНрд╣рдгреВрди" linked list рдирд┐рд╡рдбрдгреЗ.
- рд╣рд╛рддрд╛рдиреЗ рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ list рд╡рд░
len()O(n) рдЕрд╕рддреЛ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ, рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рд╕реЛрдмрдд рдореЛрдЬрдд рдирд╛рд╣реА.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рддреБрдордЪреНрдпрд╛ database рд╕рдореЛрд░рдЪрд╛ LRU cache рдореНрд╣рдгрдЬреЗ hash map рдЖрдгрд┐ doubly linked list; OS scheduler рдЪреА run queue рдЖрдгрд┐ memory allocator рдордзрд▓реА free-list рдпрд╛ linked lists рдЖрд╣реЗрдд. рддреБрдореНрд╣реА рддреНрдпрд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╡рд╛рдЪрд╛рд▓ рдЬрд╛рд╕реНрдд.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 04 тАФ stacks рдЖрдгрд┐ queues: рдЯреНрд░реЗрдЪреА рдЪрд│рдд рдЖрдгрд┐ рдЬреЗрд╡рдгрд╛рдЪреА рд░рд╛рдВрдЧ, рдЖрдгрд┐
list.pop(0) рд╣рд╛ рд╕рд╛рдкрд│рд╛ рдХрд╛ рдЖрд╣реЗ.