gpt4 book ai didi

列出包 `MoveToFront` 不适合我

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:27 24 4
gpt4 key购买 nike

Go 的新手并在 Go 中构建一个简单的 LRU 缓存以习惯语法和 Go 开发。

MoveToFront 列表方法有问题,它在 MoveToFront 正文中的以下检查中失败

if e.list != l || l.root.next == e 

当我从缓存中检索它时,我想将元素 (e) 移动到列表的前面,就像这样

if elem, ok := lc.entries[k]; ok {
lc.list.MoveToFront(elem) // needs fixing
return elem
}
return nil

出现问题的代码可以看这里第32行

https://github.com/hajjboy95/golrucache/blob/master/lru_cache/lrucache.go#L32

最佳答案

对我来说似乎有两个问题。首先,这不是 List 数据类型的用途:lc.list.PushFront()创建 List.Element 并返回指向它的指针。这不是致命的,但至少有点烦人——调用者在使用 Get 时必须深入挖掘返回的 List.Element,而不是仅仅获取值.

与此同时,您看到的失败大概是因为当 LRU 列表空间不足时,您在 Put 中删除了元素,但没有从相应的映射中删除它们。因此,稍后对刚刚删除的键的 Put 将尝试在适当的位置重新使用该元素,即使该元素已从列表中删除也是如此。要解决此问题,您需要同时持有键和值。 (在我的简单实验中,我没有看到任何失败,但问题变得很清楚。)

我稍微重组了代码并将其变成了 working example on the Go Playground .我不对适用性等做出任何 promise 。

关于列出包 `MoveToFront` 不适合我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com