Skip to content

Latest commit

Β 

History

History
51 lines (30 loc) Β· 3.39 KB

File metadata and controls

51 lines (30 loc) Β· 3.39 KB

LRU μΊμ‹œ μ•Œκ³ λ¦¬μ¦˜

LRU μΊμ‹œ μ•Œκ³ λ¦¬μ¦˜ 은 μ‚¬μš©λœ μˆœμ„œλŒ€λ‘œ μ•„μ΄ν…œμ„ μ •λ¦¬ν•¨μœΌλ‘œμ¨, 였랜 μ‹œκ°„ λ™μ•ˆ μ‚¬μš©λ˜μ§€ μ•Šμ€ μ•„μ΄ν…œμ„ λΉ λ₯΄κ²Œ μ°Ύμ•„λ‚Ό 수 μžˆλ„λ‘ ν•œλ‹€.

ν•œλ°©ν–₯으둜만 μ˜·μ„ κ±Έ 수 μžˆλŠ” 옷걸이 ν–‰κ±°λ₯Ό μƒκ°ν•΄λ΄…μ‹œλ‹€. κ°€μž₯ μ˜€λž«λ™μ•ˆ μž…μ§€ μ•Šμ€ μ˜·μ„ μ°ΎκΈ° μœ„ν•΄μ„œλŠ”, ν–‰κ±°μ˜ λ°˜λŒ€μͺ½ 끝을 보면 λ©λ‹ˆλ‹€.

문제 μ •μ˜

LRUCache 클래슀λ₯Ό κ΅¬ν˜„ν•΄λ΄…μ‹œλ‹€:

  • LRUCache(int capacity) LRU μΊμ‹œλ₯Ό μ–‘μˆ˜ 의 capacity 둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  • int get(int key) key κ°€ μ‘΄μž¬ν•  경우 key 값을 λ°˜ν™˜ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ undefined λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • void set(int key, int value) key κ°€ μ‘΄μž¬ν•  경우 key 값을 μ—…λ°μ΄νŠΈ ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ key-value μŒμ„ μΊμ‹œμ— μΆ”κ°€ν•©λ‹ˆλ‹€. λ§Œμ•½ 이 λ™μž‘μœΌλ‘œ 인해 ν‚€ κ°œμˆ˜κ°€ capacity λ₯Ό λ„˜λŠ” 경우, κ°€μž₯ 였래된 ν‚€ 값을 제거 ν•©λ‹ˆλ‹€.

get() κ³Ό set() ν•¨μˆ˜λŠ” 무쑰건 평균 O(1) 의 μ‹œκ°„ λ³΅μž‘λ„ 내에 μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

κ΅¬ν˜„

버전 1: 더블 λ§ν¬λ“œ 리슀트 + ν•΄μ‹œλ§΅

LRUCache.js μ—μ„œ LRUCache κ΅¬ν˜„μ²΄ μ˜ˆμ‹œλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œμ—μ„œλŠ” (ν‰κ· μ μœΌλ‘œ) λΉ λ₯Έ O(1) μΊμ‹œ μ•„μ΄ν…œ 접근을 μœ„ν•΄ HashMap 을 μ‚¬μš©ν–ˆκ³ , (ν‰κ· μ μœΌλ‘œ) λΉ λ₯Έ O(1) μΊμ‹œ μ•„μ΄ν…œ μˆ˜μ •κ³Ό 제거λ₯Ό μœ„ν•΄ DoublyLinkedList λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. (ν—ˆμš©λœ μ΅œλŒ€μ˜ μΊμ‹œ μš©λŸ‰μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄)

Linked List

okso.app 으둜 λ§Œλ“¦

LRU μΊμ‹œκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 더 λ§Žμ€ μ˜ˆμ‹œλ‘œ ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ LRUCache.test.js](./test/LRUCache.test.js) νŒŒμΌμ„ μ°Έκ³ ν•˜μ„Έμš”.

버전 2: μ •λ ¬λœ 맡

더블 λ§ν¬λ“œ 리슀트둜 κ΅¬ν˜„ν•œ 첫번째 μ˜ˆμ‹œλŠ” μ–΄λ–»κ²Œ 평균 O(1) μ‹œκ°„ λ³΅μž‘λ„κ°€ set() κ³Ό get() 으둜 λ‚˜μ˜¬ 수 μžˆλŠ”μ§€ ν•™μŠ΅ λͺ©μ κ³Ό 이해λ₯Ό 돕기 μœ„ν•΄ 쒋은 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜, 더 μ‰¬μš΄ 방법은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ Map 객체λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 Map κ°μ²΄λŠ” ν‚€-κ°’ 쌍과 ν‚€λ₯Ό μΆ”κ°€ν•˜λŠ” μˆœμ„œ 원본 을 μ§€λ‹™λ‹ˆλ‹€. μš°λ¦¬λŠ” 이걸 μ•„μ΄ν…œμ„ μ œκ±°ν•˜κ±°λ‚˜ λ‹€μ‹œ μΆ”κ°€ν•˜λ©΄μ„œ 맡의 "κ°€μž₯ λ§ˆμ§€λ§‰" λ™μž‘μ—μ„œ μ΅œκ·Όμ— μ‚¬μš©λœ μ•„μ΄ν…œμ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Map 의 μ‹œμž‘μ μ— μžˆλŠ” μ•„μ΄ν…œμ€ μΊμ‹œ μš©λŸ‰μ΄ λ„˜μΉ  경우 κ°€μž₯ λ¨Όμ € μ œκ±°λ˜λŠ” λŒ€μƒμž…λ‹ˆλ‹€. μ•„μ΄ν…œμ˜ μˆœμ„œλŠ” map.keys() 와 같은 IterableIterator 을 μ‚¬μš©ν•΄ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή κ΅¬ν˜„μ²΄λŠ” LRUCacheOnMap.js 의 LRUCacheOnMap μ˜ˆμ‹œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 LRU μΊμ‹œ 방식이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 더 λ§Žμ€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ LRUCacheOnMap.test.js νŒŒμΌμ„ μ°Έκ³ ν•˜μ„Έμš”.

λ³΅μž‘λ„

평균
곡간 O(n)
μ•„μ΄ν…œ μ°ΎκΈ° O(1)
μ•„μ΄ν…œ μ„€μ •ν•˜κΈ° O(1)

μ°Έμ‘°