返回

揭秘LeetCode第460题:LFU缓存算法的巧妙实现

前端

各位开发者们,欢迎来到LeetCode刷题之旅的第460站!今天,我们将共同探索LFU缓存算法的奇妙世界。

什么是LFU缓存算法?

LFU(Least Frequently Used)缓存算法是一种巧妙的策略,它根据元素被访问的频率对缓存中的项进行管理。该算法的目的是确保那些最不经常使用的项被首先逐出缓存,为更常用的项腾出空间。

如何实现LFU缓存算法?

实现LFU缓存算法的关键在于维护一个双向链表,其中每个节点表示缓存中的一个项。链表被分为多个队列,每个队列代表一个不同的频率。当一个项被访问时,它会被移动到更高的频率队列中。

同时,我们还需要维护一个哈希表,以快速查找缓存中的特定项。哈希表将每个项映射到其对应的双向链表节点。

LeetCode第460题的解决方案

LeetCode第460题要求我们实现LFU缓存算法。我们可以遵循以下步骤:

  1. 初始化一个哈希表和一个双向链表: 哈希表将项映射到双向链表节点,而双向链表将项分组到不同的频率队列中。
  2. 当get操作请求一个项时:
    • 如果项在缓存中,则更新其频率并将其移动到更高的频率队列中。
    • 如果项不在缓存中,则返回-1。
  3. 当put操作将一个新项添加到缓存时:
    • 如果缓存已满,则删除LFU队列中频率最低的项。
    • 将新项添加到哈希表和频率为1的队列中。
  4. 当需要逐出项时:
    • 从LFU队列中删除频率最低的项。

代码示例

class LFUCache:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.freq = {}  # 频率哈希表
        self.cache = {}  # 缓存哈希表
        self.min_freq = 0  # 最低频率

    def get(self, key: int) -> int:
        if key in self.cache:
            freq = self.freq[key]
            self.freq[key] += 1
            self.move_to_next_freq(key, freq)
            return self.cache[key]
        else:
            return -1

    def put(self, key: int, value: int) -> None:
        if self.capacity == 0:
            return

        if key in self.cache:
            self.freq[key] += 1
            self.move_to_next_freq(key, self.freq[key] - 1)
            self.cache[key] = value
        else:
            if len(self.cache) == self.capacity:
                self.remove_least_freq()
            self.freq[key] = 1
            self.min_freq = 1
            self.cache[key] = value
            self.move_to_next_freq(key, 0)

    def move_to_next_freq(self, key: int, freq: int):
        self.freq[key] = freq + 1
        if freq in self.freq:
            self.freq[freq].remove(key)
        if freq + 1 not in self.freq:
            self.freq[freq + 1] = set()
        self.freq[freq + 1].add(key)
        if freq == self.min_freq and not self.freq[freq]:
            self.min_freq += 1

    def remove_least_freq(self):
        while self.min_freq in self.freq and not self.freq[self.min_freq]:
            self.min_freq += 1
        key = self.freq[self.min_freq].pop()
        del self.cache[key]

总结

LFU缓存算法是一种巧妙的数据结构,它有助于优化缓存的性能。通过根据元素的访问频率对其进行管理,该算法确保了最不经常使用的项被优先逐出缓存,为更常用的项腾出空间。通过在LeetCode第460题中实现该算法,我们深入理解了其工作原理并掌握了如何在实际应用中利用它。

希望这篇文章能帮助各位开发者更好地掌握LFU缓存算法。祝大家LeetCode刷题之旅顺利愉快!