題目鏈結
題目要求使用o(1)的get、put方法實現lfu快取
lfu快取是基於lru快取的乙個優化,使用頻次優化元素命中情況,進一步提高命中率,其餘概念不再贅述
基本思路:使用乙個雙端鍊錶+兩個hashmap實現
雙端列表儲存原始資料、資料在hashmap的key、資料的訪問頻率
第乙個hashmap與lru的實現類似,儲存key對應鍊錶元素指標,以o(1)的效率定位元素
第二個hashmap用以儲存每個訪問頻率對應的元素集合中最近訪問的那個
例:put 1 1
put 2 2
put 3 3
get 1
經過三個操作後,第二個hasmap內容如下:
key(訪問頻率)
value(鍊錶內元素指標)
2元素1
1元素3(因為它訪問時間晚於2號)
具體實現可以參考**注釋
runtime: 132 ms (beats 80.6%)
memory usage: 16 mb
type dataitem struct
type lfucache struct
func
constructor
(capacity int
) lfucache
}func
(this *lfucache)
get(key int
)int
else
if fv, fok := this.frequencyhashmap[data.frequency -1]
; fok
}// 新訪問頻率無元素,構造新的頻率
this.frequencyhashmap[data.frequency]
= v return data.value
}return-1
}func
(this *lfucache)
put(key int
, value int
)if v, ok := this.listhashmap[key]
; ok
if this.linklist.
len(
)>= this.
capif v, ok := this.frequencyhashmap[1]
; ok
, v)
this.listhashmap[key]
= this.frequencyhashmap[1]
}else
) this.listhashmap[key]
= this.frequencyhashmap[1]
}}// 轉移訪問頻率最高的元素
func
(this *lfucache)
transmitfrequency
(element *list.element)
data := element.value.
(*dataitem)
if v, ok := this.frequencyhashmap[data.frequency]
; ok && v == element
else}}
/** * your lfucache object will be instantiated and called as such:
* obj := constructor(capacity);
* param_1 := obj.get(key);
* obj.put(key,value);
*/
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...
Safebreaker 解題報告
又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...
路由 解題報告
路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...