Skip to content

Files

Latest commit

6509304 Β· Jul 13, 2024

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)

μ°Έμ‘°