鱼C论坛

 找回密码
 立即注册
查看: 251|回复: 1

LRU构造的代码哪里有问题

[复制链接]
发表于 2024-10-29 15:59:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. class ListNode:
  2.     def __init__(self,key=None,value=None):
  3.         self.key = key
  4.         self.value = value
  5.         self.next = None
  6.         self.pre = None
  7. class LRUCache:
  8. #'''使用双向链表进行操作'''#
  9.     def __init__(self, capacity: int):
  10.         self.capacity = capacity #链表节点总数
  11.         self.hashmap = {} #哈希表存储节点的key值,用于指示节点
  12.         self.head = ListNode() #定义头结点和尾节点
  13.         self.tail = ListNode()
  14.         
  15.         self.head.next = self.tail #初始化链表,头尾结点相接
  16.         self.tail.pre = self.head
  17.    
  18.     def move_to_tail(self,key:int):
  19.         node = self.hashmap[key]
  20.         node.pre.next = node.next#将需要移动到尾部的结点从链表中拎出(相当于在原位置删除)
  21.         node.next.pre = node.pre

  22.         node.pre = self.tail.pre#将该节点插入到尾节点前面一个位置
  23.         node.next = self.tail
  24.         self.tail.pre.next = node
  25.         self.tail.pre = node



  26.     def get(self, key: int) -> int:
  27.         if key in self.hashmap:#defaultdict对于不存在的值返回空结点,dict对不存在的值会返回None
  28.             self.move_to_tail(key) #把该被访问的结点移到链表尾部
  29.             return self.hashmap[key].value
  30.         else:
  31.             return -1

  32.     def put(self, key: int, value: int) -> None:
  33.         if key in self.hashmap:#关键字key已存在于哈希表
  34.             self.hashmap[key].value = value
  35.             self.move_to_tail(key) #将更新后的key移动到链表尾部
  36.         else:#哈希表不存在该关键字
  37.             if len(self.hashmap) == self.capacity:#哈希表已达到最大容量
  38.                 self.hashmap.pop(self.head.next.key)
  39.                 self.head.next = self.head.next.next #头结点后删除该节点
  40.                 self.head.next.pre = self.head

  41.             #新结点添加在tail节点之前
  42.             new = ListNode()
  43.             self.hashmap[new.key] = new
  44.             new.pre = self.tail.pre#将该节点插入到尾节点前面一个位置
  45.             new.next = self.tail
  46.             self.tail.pre.next = new
  47.             self.tail.pre = new

  48. # Your LRUCache object will be instantiated and called as such:
  49. # obj = LRUCache(capacity)
  50. # param_1 = obj.get(key)
  51. # obj.put(key,value)
复制代码


上述代码哪里有错?半天没看出来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-29 15:59:36 | 显示全部楼层
你的代码有几个问题,我帮你指出来:

1. **`move_to_tail`方法的问题:**
  
  1. node = self.hashmap  # 应该是 `node = self.hashmap[key]`, 缺少[key]
复制代码


2. **`get`方法的问题:**
  
  1. return self.hashmap.value  # 应该是 `return self.hashmap[key].value`
复制代码


3. **`put`方法的问题:**
   - 更新`hashmap`时,应该是`self.hashmap[key] = new`而不是`self.hashmap = new`。
   - 如果达到最大容量时删除节点,不仅要更新链表,还要确保在`hashmap`中删除对应的`key`。

下面是修改后的代码:

  1. class ListNode:
  2.     def __init__(self, key=None, value=None):
  3.         self.key = key
  4.         self.value = value
  5.         self.next = None
  6.         self.pre = None

  7. class LRUCache:
  8.     def __init__(self, capacity: int):
  9.         self.capacity = capacity
  10.         self.hashmap = {}
  11.         self.head = ListNode()
  12.         self.tail = ListNode()
  13.         
  14.         self.head.next = self.tail
  15.         self.tail.pre = self.head

  16.     def move_to_tail(self, key: int):
  17.         node = self.hashmap[key]
  18.         node.pre.next = node.next
  19.         node.next.pre = node.pre

  20.         node.pre = self.tail.pre
  21.         node.next = self.tail
  22.         self.tail.pre.next = node
  23.         self.tail.pre = node

  24.     def get(self, key: int) -> int:
  25.         if key in self.hashmap:
  26.             self.move_to_tail(key)
  27.             return self.hashmap[key].value
  28.         else:
  29.             return -1

  30.     def put(self, key: int, value: int) -> None:
  31.         if key in self.hashmap:
  32.             self.hashmap[key].value = value
  33.             self.move_to_tail(key)
  34.         else:
  35.             if len(self.hashmap) == self.capacity:
  36.                 # Remove the least recently used node
  37.                 lru = self.head.next
  38.                 del self.hashmap[lru.key]
  39.                 self.head.next = lru.next
  40.                 lru.next.pre = self.head

  41.             # Add new node
  42.             new = ListNode(key, value)
  43.             self.hashmap[key] = new

  44.             new.pre = self.tail.pre
  45.             new.next = self.tail
  46.             self.tail.pre.next = new
  47.             self.tail.pre = new
复制代码


这个版本的代码修复了之前的错误,并实现了LRU缓存的功能。希望这能帮助到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表