lru的主要思想基本是,設定乙個固定大小的容器,不斷新增元素。
當容器放滿時,把最前面的元素清除,在對尾新增新元素,如果元素是重複的元素,則找出那個元素放到隊尾。
lru演算法主要步驟是:
1.判斷新元素的key是否在lru中,如果在,就把此元素找出來然後拿到鍊錶尾部
2.判斷元素是否填滿到指定大小,如果滿了,就清除第一條,在尾部加入新資料
package mainimport (
"fmt"
)func
main()
type lrucatchnode struct
}var catchsize int
var currentsize int
var nodes *lrucatchnode
var first string
var last string
//初始化lru大小
func
lrucatch(i int)
//像lru中新增資料
func
put(key string
, value inte***ce{})
last = key
if h(key, nodes) == "" else
} else
add(key, value)
}//檢查此key是否在lru鍊錶中
func
h(key string
, node *lrucatchnode) string
if node.key == key
return h(key, node.prev)
}//像鍊錶中新增資料
func
add(key string
, value inte***ce{})
//向鍊錶中新增資料
func
w(node *lrucatchnode
, n *lrucatchnode
, key string
, value inte***ce{}) *lrucatchnode
node = nn
return node
}else
}return w(node.next, node, key, value)
}//刪除相同key的鍊錶資料
func
deletesamekey(key string
, node *lrucatchnode) *lrucatchnode
if last == key
if node.prev != nil
if node.next != nil
}return node
}return deletesamekey(key, node.prev)
}//當新key不存在於鍊錶時,刪除第一條資料
func
delete(node *lrucatchnode) *lrucatchnode
return delete(node.prev)
}//列印所有資料
func
f(node *lrucatchnode) *lrucatchnode
return f(node.prev)
}
LRU 演算法簡單實現
在學習很多伺服器軟體中,當記憶體不夠,而需要淘汰記憶體的時候,一般會使用lru演算法,便產生了濃厚的興趣。在學習作業系統的過程中發現lru在系統中用暫存器和棧來實現。所以我就嘗試著學習用棧來解決lru的問題。當然也參考了別人的 1 23 typedef struct ustack 78 void i...
LRU簡單實現
lru的設計原理就是,當資料在最近一段時間經常被訪問,那麼它在以後也會經常被訪問。這就意味著,如果經常訪問的資料,我們需要然其能夠快速命中,而不常訪問的資料,我們在容量超出限制內,要將其淘汰。主要使用linkedhashmap簡單實現lru演算法效果 public class lrucache ex...
LRU演算法實現
jdk 中的實現 在jdk 中linkedhashmap 可以作為lru 演算法以及插入順序的實現,linkedhashmap 繼承自hashmap 底層結合hash 表和雙向鍊錶,元素的插入和查詢等操作通過計算hash 值找到其陣列位置,在做插入或則查詢操作是,將元素插入到鍊錶的表頭 當然得先刪除...