2024. 1. 26. 19:15ใCS - Roadmap.sh/3. Common Algorithms
CS - 3. Common Algorithms - 3.4. Cache - 3.4.2 LFU Cache
๐กLFU Cache is a data structure that stores key-value pairs. It has a fixed size and when it is full, it removes the least frequently used key-value pair. It is a variation of the LRU Cache and is used in many applications such as caching web pages, caching database queries, and caching images.
LFU ์บ์๋ ํค-๊ฐ ์์ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์์ผ๋ฉฐ, ํฌ๊ธฐ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์ฌ์ฉ ๋น๋๊ฐ ๊ฐ์ฅ ๋ฎ์ ํค-๊ฐ ์์ ์ ๊ฑฐํฉ๋๋ค. LRU ์บ์์ ๋ณํ์ผ๋ก ์น ํ์ด์ง ์บ์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์บ์ฑ, ์ด๋ฏธ์ง ์บ์ฑ ๋ฑ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
LFU(Least Frequently Used) ์บ์๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋ ํญ๋ชฉ์ ์บ์์์ ์ ๊ฑฐํ๋ ์ ๋ต์ ์ฌ์ฉํ๋ ์บ์์ ๋๋ค.
์ด๋ ์บ์์ ํฌ๊ธฐ๊ฐ ์ ํ๋์ด ์๊ณ , ์๋ก์ด ํญ๋ชฉ์ ์ถ๊ฐํด์ผ ํ ๋ ๊ณต๊ฐ์ด ๋ถ์กฑ
์ด ๊ฒฝ์ฐ, LFU ์บ์๋ ๊ฐ์ฅ ์ ๊ฒ ์ก์ธ์ค๋ ํญ๋ชฉ์ ์ ๊ฑฐํ์ฌ ๊ณต๊ฐ์ ํ๋ณดํฉ๋๋ค.
In Python
LFU ์บ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํฉ๋๋ค๋ง, ์ด ๊ธ์์๋ ํด์๋งต๊ณผ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
import collections
import heapq
class LFUCache:
def __init__(self, capacity):
self.capacity = capacity
self.val_map = collections.defaultdict(int) # ๊ฐ๊ณผ ๋น๋
self.freq_map = collections.defaultdict(list) # ๊ฐ๊ณผ ๋น๋ ๋ฆฌ์คํธ
self.min_freq = 0
self.size = 0
def get(self, key):
if key in self.val_map:
self.update(key)
return self.val_map[key][0]
else:
return -1
def put(self, key, value):
if self.capacity == 0:
return
if key in self.val_map:
self.update(key, value)
else:
if self.size == self.capacity:
to_remove = self.freq_map[self.min_freq].pop(0)
del self.val_map[to_remove]
self.size -= 1
self.val_map[key] = [value, 1]
self.freq_map[1].append(key)
self.min_freq = 1
self.size += 1
def update(self, key, new_val=None):
value, freq = self.val_map[key]
if new_val != None:
value = new_val
self.freq_map[freq].remove(key)
if not self.freq_map[freq]:
del self.freq_map[freq]
if self.min_freq == freq:
self.min_freq += 1
self.val_map[key] = [value, freq+1]
self.freq_map[freq+1].append(key)
์ด๋ฐ์์ผ๋ก LFU ์บ์ฌ๋ฅผ ๊ตฌ์ฑํด๋ณผ์ ์์ต๋๋ค.
์ ๋ง ๊ฐ๋จํ ์์๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
LFU ์บ์ฌ์ ์ฉ๋์ 2๋ก ์ค์ ํ์๊ธฐ์
1='A', 2='B', 3='C', 4='D'๋ฅผ ์ฐจ๋ก๋๋ก ๋ฃ์ผ๋ฉด
๋์ค์ key 1๋ก ๋ถ๋ฅด๋ฉด -1 ๋ก ์์์ ๋ณด์ฌ์ค๋๋ค.
๊ทผ๋ฐ ์ด ์์์๋ ์ต์ ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ์ค๋๋ ๊ฒ๋ค์ ์ ๊ฑฐํ๊ณ ๊ทธ์๋ฆฌ์ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒ์ธ์ง, ์ฆ LRU ์ธ์ง LFU ์ธ์ง ํ๋จํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๊ทธ๋์ 1='A' ๋ฅผ ๊ฐ์ฅ ์ฒ์ ๋ง์ด ๋ฃ์๋ค์ 2='B', 3, 4 ๋ฅผ ํ๋ฒ์ฉ ๋ฃ๊ณ 1์ด ์ญ์ ๋๋์ง ๋ณด๋ฉด ๋ฉ๋๋ค.
๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ฅ ๋ค์์ธ 1='A'๋ ๋จ์์๊ณ 2='B'๋ ์ ๊ฑฐ, 3,4 ๊ฐ ์ ์ฅ๋์ด ์์ต๋๋ค.
ํ์ฉ
LFU ์บ์๋ ํน์ ํญ๋ชฉ์ ์ฌ์ฉ ๋น๋๊ฐ ๋์ ๊ฒฝ์ฐ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ฆ, ์ผ๋ถ ํญ๋ชฉ์ด ์์ฃผ ์ก์ธ์ค๋๊ณ , ๊ทธ ํญ๋ชฉ๋ค์ด ์บ์์์ ์ ๊ฑฐ๋๋ ๊ฒ์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์๋ ์ํฉ์์ LFU ์บ์๋ ํฐ ๋์์ด ๋ฉ๋๋ค.
1. ์น ํ์ด์ง ์บ์
- ํน์ ์น ํ์ด์ง์ ๋ํ ์์ฒญ์ด ๋น๋ฒํ ๊ฒฝ์ฐ,
LFU ์บ์ ๋ฅผ ์ฌ์ฉํด ์น ํ์ด์ง๋ฅผ ์บ์์ ์ ์ง, ๋น๋๊ฐ ๋ฎ์ ๋ค๋ฅธ ์นํ์ด์ง๋ฅผ ์บ์์์ ์ ๊ฑฐ.
์ด๋ฐ์์ผ๋ก ์์ฃผ ์ก์ธ์คํ๋ ์น ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ค์ ๋๋ค.
2. DB ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์ฑ
- ์ผ๋ถ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์์ฃผ ์์ฒญ๋๋ ๊ฒฝ์ฐ,
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํจ์ผ๋ก์จ ๋น ๋ฅด๊ฒ ์ ๊ณต.
3.ML ๋ชจ๋ธ ์์ธก ๊ฒฐ๊ณผ ์บ์ฑ
- ML ๋ชจ๋ธ์์ ๋์ผํ ์ ๋ ฅ์ ๋ํ ์์ธก์ ์์ฃผ ์ํํ ๊ฒฝ์ฐ,
์์ธก ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ์ฌ ๋ค์ ๊ณ์ฐํ๋ ์๊ฐ์ ์ ์ฝํจ.
๋ฌธ์ ์ ์
"Recently" ์ต๊ทผ์ฑ์ ๊ณ ๋ คํ์ง ์๋๋ค๋ ์ ์ ๋๋ค.
3.4.1์์ LRU ์ ๋ํด์ ๋ค๋ค์ต๋๋ค. LRU ์บ์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ๋ ์บ์๋ฅผ ์ ์ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ด์๋ฐํด 3.4.2 LFU ๋ ์์ ์ ์์ฃผ ์ฌ์ฉ๋์์ง๋ง ํ์ฌ๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ํญ๋ชฉ์ด LFU ์บ์์ ๊ณ์ ์ ์ง๋ ์ ์๋ ๋จ์ ์ด ์์ต๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ์ํด LRU๊ณผ LFU๋ฅผ ๊ฒฐํฉํ LRU-LFU ์บ์ ์ ๋ต์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
( LRU-LFU ์บ์ ์ ๋ต์ ์ถํ์ ๋ค๋ฃจ๊ธฐ)
'CS - Roadmap.sh > 3. Common Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3.5 Graph & 3.6 Tree (0) | 2024.01.27 |
---|---|
3.4. Cache - 3.4.3 MFU Cache (0) | 2024.01.27 |
3.4. Cache - 3.4.1 LRU Cache (2) | 2024.01.25 |
3.3. Search - 3.3.2 Linear Search (1) | 2024.01.24 |
3.3. Search - 3.3.1 Binary Search (0) | 2024.01.23 |