golang使用雙向鍊錶實現LRU演算法

2021-10-24 11:20:30 字數 1367 閱讀 9668

//使用雙向鍊錶實現的lru演算法

type lrucache struct

//鍊錶節點

type dbnode struct

//雙向鍊錶

type dblist struct

//往鍊錶頭部插入資料

if node == nil

d.mutex.rlock()

defer d.mutex.runlock()

if d.size == 0 else

return true

}//將指定的鍊錶節點移動到頭部

func (d *dblist) movefront(node *dbnode) bool

if d.size <= 1

d.mutex.lock()

defer d.mutex.unlock()

switch node

}//刪除指定的節點

func (d *dblist) remove(node *dbnode) bool

if d.size == 0

d.mutex.lock()

defer d.mutex.unlock()

defer func(d *dblist, node *dbnode)

}(d, node)

if node == d.head && node == d.tail else if node == d.head else if node == d.tail else

d.size--

return true

}//初始化lru快取

func constructor(capacity int) lrucache ,

}}//獲取lru快取資料

func (this *lrucache) get(key int) int

}return -1

}//插入或者更新快取

func (this *lrucache) put(key int, value int)

//判斷是否超過了容量,超過則清除最久

if this.list.size >= this.capacity

//新增資料

node := &dbnode

this.store[key] = node}//

//["lrucache","put","get","put","get","get"]

//[[1],[2,1],[2],[3,2],[2],[3]]

func main()

for index, item := range value )

switch len(item)

}}

雙向鍊錶實現

template class link link link pre null,link ne null void operator new size t void operator delete void ptr template link link freelist null template v...

雙向鍊錶實現

雙向鍊錶的應用背景主要是單向鍊錶只能順序訪問,逆序訪問單向鍊錶 尤其是較大的單向鍊錶是一件極其費時費力的工作 相比於單向鍊錶,雙向鍊錶增加了乙個域,這個域裡面增加了乙個指向前驅節點的指標,使得整個鍊錶可以順序訪問或者逆序訪問,來去自如 定義的雙向鍊錶的標頭檔案,裡面包含了雙向鍊錶的宣告和資料型別的定...

實現雙向鍊錶

雙向鍊錶和單向鍊錶相比更加靈活,它的每乙個元素除了本身的值以為擁有兩個指標,分別指向上乙個和下乙個節點。維護成本上要高於單向鍊錶。鍊錶的大部分操作依賴於遍歷,這一方面雙向鍊錶會效率會好一些,可以根據查詢下標的位置從而選擇從煉表頭開始遍歷還是從鍊錶尾開始遍歷。返回元素個數 public intsize...