package main
/*
算法:頁面cache算法之LFU(Least Frequently Used),優(yōu)先淘汰最少使用的數(shù)據(jù)
基于:如果一個數(shù)據(jù)最近被使用的次數(shù)很少抵碟,將來被使用的可能性也很小
特點:優(yōu)先淘汰最少使用的數(shù)據(jù)
實現(xiàn):最小堆+hashmap。最小堆按使用次數(shù)來排隊,hashmap用來加速查找
插入/刪除:O(logN),查找:O(1)
*/
import (
"container/heap"
"fmt"
//"errors"
)
type Item struct {
value string
priority int
index int
}
type PriorityQueue []*Item
func (pq PriorityQueue) Len() int { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool {
return pq[i].priority < pq[j].priority
}
func (pq PriorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
pq[i].index = i
pq[j].index = j
}
func (pq *PriorityQueue) Push(x interface{}) {
n := len(*pq)
item := x.(*Item)
item.index = n
*pq = append(*pq, item)
}
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
item.index = -1 // for safety
*pq = old[0 : n-1]
return item
}
// update modifies the priority and value of an Item in the queue.
func (pq *PriorityQueue) update(item *Item, value string, priority int) {
item.value = value
item.priority = priority
heap.Fix(pq, item.index)
}
func minheap_test() {
items := map[string]int{
"banana": 3, "apple": 2, "pear": 4,
}
// Create a priority queue, put the items in it, and
// establish the priority queue (heap) invariants.
pq := make(PriorityQueue, len(items))
i := 0
for value, priority := range items {
pq[i] = &Item{
value: value,
priority: priority,
index: i,
}
i++
}
heap.Init(&pq)
// Insert a new item and then modify its priority.
item := &Item{
value: "orange",
priority: 1,
}
heap.Push(&pq, item)
pq.update(item, item.value, 5)
// Take the items out; they arrive in decreasing priority order.
for pq.Len() > 0 {
item := heap.Pop(&pq).(*Item)
fmt.Printf("%.2d:%s\n", item.priority, item.value)
}
}
type cache_lfu struct {
minheap PriorityQueue
kmap map[string] *Item
}
func (lfu* cache_lfu)init(size int) {
lfu.minheap = make([]*Item, 0, size)
heap.Init(&(lfu.minheap))
lfu.kmap = make(map[string] *Item)
}
func (lfu* cache_lfu)set(val string) {
if(len(lfu.minheap) == cap(lfu.minheap)) {
item := heap.Pop(&(lfu.minheap)).(*Item)
fmt.Printf("pop %s\n", item.value);
}
item := &Item{value:val, priority:0}
heap.Push(&(lfu.minheap), item)
heap.Fix(&(lfu.minheap), item.index)
lfu.kmap[val] = item
}
func (lfu* cache_lfu)get(val string) {
item,ok := lfu.kmap[val]
if(ok) {
item.priority += 1
heap.Fix(&(lfu.minheap), item.index)
}
}
func (lfu *cache_lfu)print() {
for lfu.minheap.Len() > 0 {
item := heap.Pop(&(lfu.minheap)).(*Item)
fmt.Printf("%d:%s\n", item.priority, item.value)
}
}
func lfu_test() {
var lfu cache_lfu
lfu.init(5)
items := [5]string {"banana","apple","pear", "mango", "watermelon"}
for _,val := range items {
lfu.set(val)
}
lfu.get("apple")
lfu.get("apple")
lfu.get("pear")
lfu.print()
for _,val := range items {
lfu.set(val)
}
lfu.get("apple")
lfu.get("apple")
lfu.get("apple")
lfu.get("apple")
lfu.get("apple")
lfu.get("pear")
lfu.get("pear")
lfu.get("pear")
lfu.get("pear")
lfu.get("banana")
lfu.get("banana")
lfu.get("banana")
lfu.get("mango")
lfu.get("mango")
lfu.get("watermelon")
// pop watermelon this time
lfu.set("pipeapple")
//lfu.print()
}
func main() {
minheap_test()
lfu_test()
}
go實現(xiàn)LFU算法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門豪诲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职员,“玉大人,你說我怎么就攤上這事跛溉『盖校” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵芳室,是天一觀的道長专肪。 經(jīng)常有香客問我,道長堪侯,這世上最難降的妖魔是什么嚎尤? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮伍宦,結(jié)果婚禮上芽死,老公的妹妹穿的比我還像新娘。我一直安慰自己次洼,他們只是感情好关贵,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卖毁,像睡著了一般揖曾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼绿鸣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了站玄?” 一聲冷哼從身側(cè)響起枚驻,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響鬓照,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缝左,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浓若。 院中可真熱鬧渺杉,春花似錦、人聲如沸挪钓。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽诵原。三九已至英妓,卻和暖如春挽放,著一層夾襖步出監(jiān)牢的瞬間绍赛,已是汗流浹背蔓纠。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 姓名:白國樂 學(xué)號:17021210898 專業(yè):信號與信息處理 轉(zhuǎn)載自:http://blog.csdn.net...
- 續(xù)下一篇《(24)Go實現(xiàn)紅黑樹-實現(xiàn)和總結(jié)》:http://www.reibang.com/p/172c271...
- 最近由于工作的需要箩言,需要的實現(xiàn)一個go的Blowfish算法硬贯。其實go本身有一個加密算法庫crypto,其中有Bl...
- 具體實現(xiàn)和測試接另一篇(22)Go實現(xiàn)AVL樹-實現(xiàn)和測試http://www.reibang.com/p/c5...
- PoW共識算法是一種基于算力的共識算法陨收,我們需要在挖礦的過程當(dāng)中找到其相應(yīng)的解饭豹,從而獲得“挖礦獎勵”,但要找到這個...