Sobes.tech
Junior — Middle

Имали ли сте опит с реализирането на алгоритъм за кеш с най-малко наскоро използвани елементи (LRU)?

sobes.tech AI

Отговор от AI

Да, алгоритъмът за кеш с най-малко наскоро използвани елементи (LRU) може да бъде реализиран в Go с помощта на структура от данни, която поддържа бърз достъп и актуализира реда на използване на елементите. Обикновено се използва комбинация от хеш таблица и двусвързана листа.

Пример за проста реализация на LRU кеш в Go:

package main

import "container/list"

// Структура на LRUCache
// capacity - максимален размер
// cache - хеш таблица за бърз достъп
// list - двусвързана листа за реда на използване

type LRUCache struct {
    capacity int
    cache    map[int]*list.Element
    list     *list.List
}

type entry struct {
    key   int
    value int
}

func NewLRUCache(capacity int) *LRUCache {
    return &LRUCache{
        capacity: capacity,
        cache:    make(map[int]*list.Element),
        list:     list.New(),
    }
}

func (c *LRUCache) Get(key int) (int, bool) {
    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        return elem.Value.(*entry).value, true
    }
    return 0, false
}

func (c *LRUCache) Put(key int, value int) {
    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        elem.Value.(*entry).value = value
        return
    }

    if c.list.Len() == c.capacity {
        back := c.list.Back()
        if back != nil {
            c.list.Remove(back)
            delete(c.cache, back.Value.(*entry).key)
        }
    }

    elem := c.list.PushFront(&entry{key, value})
    c.cache[key] = elem
}

func main() {
    cache := NewLRUCache(2)
    cache.Put(1, 1)
    cache.Put(2, 2)
    val, ok := cache.Get(1) // val=1, ok=true
    cache.Put(3, 3)         // ще премахне ключ 2
    _, ok2 := cache.Get(2)  // ok2=false
    _ = val
    _ = ok2
}

В този пример, при добавяне на нов елемент, ако кешът е пълен, се премахва най-малко използваният елемент (край на списъка). При достъп до елемент, той се преместват в началото на списъка, което отразява неговата недавна употреба.