LRU演算法的GO語言實現

2021-08-31 00:15:49 字數 1864 閱讀 3656

lru演算法原理,來自

1.假設我們使用雜湊鍊錶來快取使用者資訊,目前快取了4個使用者,這4個使用者是按照時間順序依次從鍊錶右端插入的

2.此時,業務方訪問使用者5,由於雜湊鍊錶中沒有使用者5的資料,我們從資料庫中讀取出來,插入到快取當中。這時候,鍊錶中最右端是最新訪問到的使用者5,最左端是最近最少訪問的使用者1。

3.接下來,業務方訪問使用者2,雜湊鍊錶中存在使用者2的資料,我們怎麼做呢?我們把使用者2從它的前驅節點和後繼節點之間移除,重新插入到鍊錶最右端。這時候,鍊錶中最右端變成了最新訪問到的使用者2,最左端仍然是最近最少訪問的使用者1

4.接下來,業務方請求修改使用者4的資訊。同樣道理,我們把使用者4從原來的位置移動到鍊錶最右側,並把使用者資訊的值更新。這時候,鍊錶中最右端是最新訪問到的使用者4,最左端仍然是最近最少訪問的使用者1。

5.後來業務方換口味了,訪問使用者6,使用者6在快取裡沒有,需要插入到雜湊鍊錶。假設這時候快取容量已經達到上限,必須先刪除最近最少訪問的資料,那麼位於雜湊鍊錶最左端的使用者1就會被刪除掉,然後再把使用者6插入到最右端。

go程式實現:

/*

@time : 18-11-5 上午10:41

@author : xbx

@file : lru

@software: goland

*/package main

import "fmt"

type node struct

func (n *node)init(key string, value string)

var head *node

var end *node

var limit int

type lrucache struct

func getlrucache(limit int) *lrucache

lrucache.hashmap = make(map[string]*node, limit)

return &lrucache

}func (l *lrucache)get(key string) stringelse

}func (l *lrucache)put(key , value string)

node := node

l.addnode(&node)

l.hashmap[key] = &node

}else

}func (l *lrucache) refreshnode(node *node)

l.removenode(node)

l.addnode(node)

}func (l *lrucache) removenode(node *node) stringelse if(node == head)else

return node.key

}func (l *lrucache) addnode(node *node)

end = node

if (head == nil)

}func main()

lfu演算法實現c語言 lru演算法c語言實現

a 分配頁面 b 置換演算法 c 程式訪問 d 換出頁面 正確答案 d 單選題 22.設某程序的頁訪問串為 1 3 1 2 4,工作集為 3 塊,問 按 lru 頁面替換演算法,儲存管理採取虛擬儲存技術 組成 物理記憶體 主機板上的ram 和硬碟上的 虛擬記憶體聯合組成 頁面大小 4kb 例 頁面排...

Go語言實現bitmap演算法

有關bitmap演算法的介紹資料網上很多,這裡不贅述,各種語言的實現也不少,但是go語言版的bitmap不多,本文就來寫乙個go版的bitmap實現。首先建立乙個 bitmap.go 檔案,定義乙個bitmap結構體,再提供一些操作方法。詳細 如下 package bitmap import fmt...

排序演算法的GO語言實現

func bubblesort arr int,arrlength int if flag 把數字插入到合適的位置 package algo import testing 第乙個數字是有序的,從後面的數字取乙個出來,放在有序範圍內 func insertionsort arr int,arrleng...