יול.24

LRU Cache

LRU Cache

יש לממש LRU Cache ע''י שימוש במבנה מהיר שיאפשר גישה מהירה ועידכון מהיר. חשוב ש cache מוגבל בגודלו ופריטים שלא ניגשו אליהם הרבה זמן ימחקו ראשונים.

  1. public class LRUCache {
  2. int maxCapacity = 0;
  3. LinkedList lst = new LinkedList();
  4. Dictionary<int, Node> cache = new Dictionary<int, Node>();
  5. public LRUCache(int capacity) {
  6. maxCapacity = capacity;
  7. }
  8. public int Get(int key) {
  9. if(!cache.ContainsKey(key))
  10. return -1;
  11. lst.SetHead(cache[key]);
  12. return cache[key].Value;
  13. }
  14. public void Put(int key, int value) {
  15. if(!cache.ContainsKey(key)) {
  16. if(cache.Count() == maxCapacity)
  17. evictLeastRecent();
  18. Node node = new Node(key, value);
  19. cache.Add(key, node);
  20. lst.SetHead(node);
  21. }
  22. else {
  23. Node node = cache[key];
  24. node.Value = value;
  25. lst.SetHead(node);
  26. }
  27. }
  28. private void evictLeastRecent() {
  29. int key = lst.Tail.Key;
  30. lst.RemoveTail();
  31. cache.Remove(key);
  32. }
  33. public class LinkedList {
  34. public Node Tail;
  35. public Node Head;
  36. public void SetHead(Node node) {
  37. if(Head == node) return;
  38. if(Head == null) {
  39. Head = Tail = node;
  40. } else if (Head == Tail) {
  41. Tail.Prev = node;
  42. Head = node;
  43. Head.Next = Tail;
  44. } else {
  45. if(Tail == node)
  46. RemoveTail();
  47. node.RemoveRelations();
  48. Head.Prev = node;
  49. node.Next = Head;
  50. Head = node;
  51. }
  52. }
  53. public void RemoveTail() {
  54. if (Tail == null) return;
  55. if(Head == Tail) {
  56. Head = Tail = null;
  57. }
  58. else {
  59. Tail = Tail.Prev;
  60. Tail.Next = null;
  61. }
  62. }
  63. }
  64. public class Node {
  65. public Node Next;
  66. public Node Prev;
  67. public int Key;
  68. public int Value;
  69. public Node(int key, int value) {
  70. this.Key = key;
  71. this.Value = value;
  72. }
  73. public void RemoveRelations() {
  74. if(Prev != null)
  75. Prev.Next = Next;
  76. if(Next != null)
  77. Next.Prev = Prev;
  78. Next = null;
  79. Prev = null;
  80. }
  81. }
  82. }


תגיות:
שתף את הסיפור הזה:

תגובות(0)

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה