LRU缓存将如何用于TRIE数据结构



假设我有一个Trie/prefix Trie,总限制为10个节点。我将限制为10个节点,以模拟超过的内存。(如果我不能将整棵树加载到内存中,我总共有10个存储在磁盘上的节点。

我现在将一个新字符串插入TRIE中,这将导致树超过10个节点限制,因此现在该是LRU缓存驱逐从TRIE驱逐最近访问的节点的时候了。

假设树包含单词Hello,help,嗨,LRU节点为" H"。这意味着我需要从Trie中删除" H",在这种情况下,这将删除整棵树。我的困惑在于还更新缓存本身以删除所有孩子。在这种情况下,这是如何工作的?

我假设缓存具有" H"," HE"," HEL"," HELS"等节点。如果我删除" H"节点,我假设我需要删除以"H"?我的整个假设似乎确实效率低下。

在谈论缓存时要牢记的一件事是它是冗余数据结构,其唯一的目标是加速数据获取。
因此,当从缓存中驱逐一块数据时,使用此数据的程序上没有任何后果(执行速度除外(,因为然后将其从主内存中获取。因此,无论如何,您的Trie都会具有完全相同的行为,而不管它位于缓存中是否位于该行为。

这非常重要,因为它允许我们以高级语言(例如Java(进行编码,而不必关心处理器实施的缓存的替换策略。如果不是这种情况,那将是一场噩梦,因为我们必须考虑到处理器中实施的所有现有(和未来?(替代政策。甚至没有提到这些策略不像LRU那样简单(有缓存集,将缓存分为"线",它们的行为也与其物理结构几乎链接(,并且该位置将有一块数据位于高速缓存中取决于其主内存中的地址,这不一定对于每个代码执行而言是相同的。

简而言之,您提到的两件事(Java中的Trie节点和LRU CACHE策略(相距太远(一个是非常非常低的编程,另一个高级编程(。这就是为什么我们很少考虑他们的互动的原因。
如果您在Java中实现了Trie,则您的工作是确保在所有情况下它都可以正常工作,因此设计良好,因此维护将更容易(可能(,以至于它是可读的,因此其他程序员可以在一天进行工作。最终,如果它仍然运行太慢,您可以尝试优化它(确定瓶颈在哪里,从来没有(。
但是,如果您想将您的Trie链接到缓存命中/错过和替换策略,则必须在Bytecode(由JVM完成(中阅读实现的翻译。

ps:在您的帖子中,您谈论的是模拟被执行的内存。程序没有这样的事情。当缓存已满时,我们填写主内存。当主内存完整时,操作系统通常保留硬盘驱动器的一部分来扮演主内存的角色(我们称其为交换,当它发生时,计算机与冷冻一样好(。交换满足后,程序崩溃。所有人。
在程序的"思维"中,操作系统给出了绝对巨大的内存数量(这是虚拟的,但对于程序和真实的程序一样好(,这将永远不会填写。该程序本身并不是"意识到"记忆的管理方式和剩余的内存数量,出于很多充分的理由(安全性,保证所有程序都将在所有程序中都有相当大的份额...(

最新更新