Junior — Middle
Ar turite patirties įgyvendinant mažiausiai neseniai naudotų elementų (LRU) talpyklos algoritmą?
sobes.tech AI
Atsakymas iš AI
Taip, mažiausiai neseniai naudoto (LRU) talpyklos algoritmą galima įgyvendinti Go kalba naudojant duomenų struktūrą, kuri užtikrina greitą prieigą ir naudojimo tvarkos atnaujinimą. Paprastai tam naudojama maišos lentelė ir dvipusė sąrašas:
Paprastas LRU talpyklos pavyzdys Go kalba:
package main
import "container/list"
// LRUCache struktūra
// capacity - maksimalus dydis
// cache - greitos prieigos maišos lentelė
// list - dvipusis sąrašas naudojimo tvarkai
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) // ištrins raktą 2
_, ok2 := cache.Get(2) // ok2=false
_ = val
_ = ok2
}
Šiame pavyzdyje, pridedant naują elementą, jei talpykla pilna, ištrinamas mažiausiai neseniai naudotas elementas (sąrašo pabaiga). Kai pasiekiamas elementas, jis perkeliama į sąrašo pradžią, rodant, kad jis yra naujausiai naudotas.