アレイはLRUキャッシュ除去戦略を実装します

LRUの概要

LRUキャッシュ除去アルゴリズムは一般的な戦略です。LRUのフルネームは「最近使用されていない」です。つまり、最近使用されたデータは「有用」である必要があります。長期間使用されていないデータは役に立たないはずです。メモリがいっぱいになると、長期間使用されていないデータを削除します。

プロセス思考

私の考えはこれです:私たちは配列を維持し、配列の終わりに近いノードはより早くアクセスされます。新しいデータにアクセスすると、データ
1をトラバースします。以前にデータが配列にキャッシュされている場合は、トラバースしてデータを取得し、成功を返し、元の位置から削除してから、配列のヘッドに挿入します。
2.データが配列にキャッシュされていない場合、次の2つの状況に分けることができます。

  • この時点でキャッシュがいっぱいでない場合は、このデータを配列の先頭に直接挿入します。
  • この時点でバッファがいっぱいの場合は、配列の最後のデータを削除し、新しいデータノードを配列の先頭に挿入します。

成し遂げる

// LRUを達成するためのアレイ、全体的な効率は高くありません。ここでは主に、除去戦略が何を行っているかを知るためです

package main

import "fmt"

type cache struct {
    
    
	arr []int
	MaxLen int //缓存的最大元素个数
}


func (c *cache)Get(value int)  {
    
    
	var flag bool
	for i,v:=range c.arr{
    
    
		if v==value{
    
    
			flag=true
			//数据在第一个
			if i==0{
    
    
				return
			}else {
    
    
				c.arr[i],c.arr[0]=c.arr[0],c.arr[i]
			}
		}
	}
	if !flag{
    
    
		//当前元素不在缓存中
		if c.Length()<c.MaxLen {
    
    
			//不用淘汰,在头部添加即可
			c.Add(value)
		}else {
    
    
			// 去掉最后一个元素,然后将新元素添加到头部
			c.arr=c.arr[:c.Length()-1]
			c.Add(value)
		}
	}
}

//在头部添加一个元素
func (c *cache)Add(value int)  {
    
    
	if c.MaxLen<c.MaxLen {
    
    
		return
	}
	c.arr = append(c.arr[:0], append([]int{
    
    value}, c.arr[0:]...)...)
}

// 获取当前缓存有哪些元素
func (c *cache)ShowData()[]int  {
    
    
	return c.arr
}

func (c *cache)Append(value int)  {
    
    
	if c.Length()>=c.MaxLen {
    
    
		return
	}
	c.arr=append(c.arr,value)
}

func (c *cache)Length() int {
    
    
	return len(c.arr)
}

func NewCache(max int)*cache  {
    
    
	res:=&cache{
    
    
		MaxLen:max,
	}
	return res
}

func main()  {
    
    
	cacheDome:=NewCache(3)
	cacheDome.Append(1)
	cacheDome.Append(2)
	cacheDome.Append(3)
	fmt.Println(cacheDome.ShowData())
	cacheDome.Append(4)
	fmt.Println(cacheDome.ShowData())
	cacheDome.Get(4)
	fmt.Println(cacheDome.ShowData())
	cacheDome.Get(5)
	fmt.Println(cacheDome.ShowData())
}

おすすめ

転載: blog.csdn.net/csdniter/article/details/112554930