【发布时间】:2019-07-05 06:48:36
【问题描述】:
假设我有一个总限制为 10 个节点的 trie/前缀 trie。我限制为 10 个节点来模拟超出的内存。 (如果我无法将整个树加载到内存中,我总共有 10 个节点存储在磁盘上。
我现在将一个新字符串插入到树中,这将导致树超过 10 个节点的限制,所以现在是 LRU 缓存从树中驱逐最近最少访问的节点的时候了。
假设树包含单词 hello、help、hi 并且 LRU 节点是“h”。这意味着我需要从 trie 中删除“h”,在这种情况下这将删除整个树。我的困惑还在于更新缓存本身以删除所有孩子。在这种情况下这是如何工作的?
我假设缓存有“h”、“he”、“hel”、“help”等节点。如果我删除“h”节点,我假设我需要删除缓存中所有前缀为“ H”?我的整个假设似乎真的很低效。
【问题讨论】:
-
为什么会有一个限制节点数量的 trie 自动删除“旧”节点?这是什么意思?显然删除“h”是没有意义的——即使 LRU 节点是树的根节点,“h”又如何呢?怎么能少用它的孩子呢?
-
10 个节点的限制将是一个假设模拟,以模拟我可以一次加载到内存中的节点数量的限制。如果我在前缀树中插入“hello”,我会插入“h”,然后是“he”,然后是“hel”、“hell”、“hello”。在这种情况下,最新的插入节点是“hello”前缀中的“o”,而最旧的插入节点是“h”,不是吗?
-
LRU 最近最少使用;由于您没有从特里检索任何东西,我会说他们都有相同的年龄。删除除叶节点之外的任何东西似乎都不是很明智,因为删除任何非叶节点也会自动删除其所有子节点。但是删除单个节点似乎不太明智 - 只删除您插入到 trie 中的字符串;但是 trie 通常不会保留插入的原始字符串,因此除非您修改数据结构(可能按每个节点使用的字符串数来计算)否则很难删除它们
-
当达到内存限制时,是否有更明智的方法来读取/写入前缀 trie 片段到磁盘并返回到内存中?我假设一些基于内存使用的 LRU 策略将是它的工作原理,但节点的实际驱逐确实让我感到困惑。我不认为他们都具有相同的年龄,因为我认为 LRU 缓存通常表示为双向链表。