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...