日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#简单实现LRU缓存

發(fā)布時間:2024/10/12 C# 119 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#简单实现LRU缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  最近跟同學(xué)吃飯扯淡的時候,由技術(shù)扯到薪資,又由薪資扯到他找工作時跟面試官是怎么扯淡拿高工資的,各種技術(shù)一頓侃,總之只要啥都了解就沒問題了。談到緩存的時候,我試探性的問了問- -你還記得LRU怎么寫嗎,他說啥完?我說沒事。。

 寫完這篇文章發(fā)給他- -鄙視完他讓他請我再吃飯,標準的緩存LRU實現(xiàn)為哈希表+鏈表,這是熱乎的雙向鏈表,也是C#版本的。。C#實現(xiàn)雙向鏈表?

代碼:

public class LRUCache<T>{private int _size;//鏈表長度private int _capacity;//緩存容量 private Dictionary<int, ListNode<T>> _dic;//key +緩存數(shù)據(jù)private ListNode<T> _linkHead;public LRUCache(int capacity){_linkHead = new ListNode<T>(-1, default(T));_linkHead.Next = _linkHead.Prev = _linkHead;this._size = 0;this._capacity = capacity;this._dic = new Dictionary<int, ListNode<T>>();}public T Get(int key){if (_dic.ContainsKey(key)){ListNode<T> n = _dic[key];MoveToHead(n);return n.Value;} else{return default(T);}}public void Set(int key, T value){ListNode<T> n;if (_dic.ContainsKey(key)){n = _dic[key];n.Value = value;MoveToHead(n);}else{n = new ListNode<T>(key, value);AttachToHead(n);_size++;} if (_size > _capacity){RemoveLast();// 如果更新節(jié)點后超出容量,刪除最后一個_size--;}_dic.Add(key, n);}// 移出鏈表最后一個節(jié)點private void RemoveLast(){ListNode<T> deNode = _linkHead.Prev;RemoveFromList(deNode);_dic.Remove(deNode.Key);}// 將一個孤立節(jié)點放到頭部private void AttachToHead(ListNode<T> n){n.Prev = _linkHead;n.Next = _linkHead.Next;_linkHead.Next.Prev = n;_linkHead.Next = n;}// 將一個鏈表中的節(jié)點放到頭部private void MoveToHead(ListNode<T> n){RemoveFromList(n);AttachToHead(n);}private void RemoveFromList(ListNode<T> n){//將該節(jié)點從鏈表刪除n.Prev.Next = n.Next;n.Next.Prev = n.Prev;}}public class ListNode<T>{public ListNode<T> Prev;public ListNode<T> Next;public T Value;public int Key;public ListNode(int key, T val){Value = val;Key = key;this.Prev = null;this.Next = null;}}

測試:

LRUCache<int> cache = new LRUCache<int>(3);cache.Get(1);cache.Set(1, 1);cache.Set(2, 2);cache.Get(3);cache.Set(3, 3); cache.Set(4, 4);cache.Get(2);

?

轉(zhuǎn)載于:https://www.cnblogs.com/ylsforever/p/6511000.html

總結(jié)

以上是生活随笔為你收集整理的C#简单实现LRU缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。