使用地图的近期未使用算法

时间:2018-11-15 20:41:57

标签: go hashmap

我需要在哪里实现NRU(近期免费)算法。 当前的数据结构只是简单的地图,类似

map[string]bool

基本上,这是用于字符串可用性的哈希映射。但 我想加入一些时间戳,而不仅仅是bool,以便 不管是否有特定的string,我还将选择“最近未释放(最旧)”字符串。想知道如何修改围棋 数据结构。

我在想

map[string]bool+timestamp 

这样,如果设置最高位,则表明是否可用 时间戳会帮助我根据时间进行搜索。

2 个答案:

答案 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)
        }
}