我需要在哪里实现NRU(近期免费)算法。 当前的数据结构只是简单的地图,类似
map[string]bool
基本上,这是用于字符串可用性的哈希映射。但
我想加入一些时间戳,而不仅仅是bool
,以便
不管是否有特定的string
,我还将选择“最近未释放(最旧)”字符串。想知道如何修改围棋
数据结构。
我在想
map[string]bool+timestamp
这样,如果设置最高位,则表明是否可用 时间戳会帮助我根据时间进行搜索。
答案 0 :(得分:2)
如果要在地图的值部分中存储两种类型,可以通过创建新的结构类型来实现:
type Value struct {
avail bool
timestamp time.Time
}
然后您可以按以下方式创建地图:
m := map[string] Value{}
并添加到地图:
m["some-value"] = Value{avail:true, timestamp: time.Now()}
答案 1 :(得分:1)
想在地图上保留空白位置是不寻常的。如果要从地图中删除元素,可以delete,然后可以使用two-result form index expression测试地图中是否有东西。
m := make(map[string]int)
m["x"] = 1
if _, ok := m["x"]; ok {
fmt.Printf("x is there")
}
delete(m, "x")
if _, ok := m["x"]; !ok {
fmt.Printf("x is not there")
}
通常,您不仅仅需要实现价值键就可以实现最近最少使用;您需要一些其他的侧面数据结构,例如doubly-linked list来记住它们的使用顺序。(如果您确实有一些持久性的值(例如时间戳),那么堆也可以工作。)您可以存储成对的实际数据。值和时间戳记中的值,但是您必须在整个列表中进行搜索以找到最早的列表。
import "container/list"
type CacheValue struct {
Key string
Value int
}
type Cache struct {
values map[string]*list.Element
lru *list.List
}
func makeCache() *Cache {
return &Cache{
values: make(map[string]*list.Element),
lru: list.New(),
}
}
func (c *Cache) Put(k string, v int) {
cv := CacheValue{Key: k, Value: v}
el := c.lru.PushFront(&cv)
c.values[k] = el
}
func (c *Cache) Get(k string) int {
el, ok := c.values[k]
if ok {
c.lru.MoveToFront(el)
return el.Value.(*CacheValue).Value
}
return 0
}
func (c *Cache) DeleteOldest() {
el := c.lru.Back()
if el != nil {
delete(c.values, el.Value.(*CacheValue).Key)
c.lru.Remove(el)
}
}