Algorithm 伪LRU树算法

Algorithm 伪LRU树算法,algorithm,binary-tree,Algorithm,Binary Tree,许多关于伪LRU算法的描述都涉及到使用二叉搜索树,以及在每次访问树时将标志设置为“指向远离”正在搜索的节点 这导致了LRU的合理近似值。然而,从描述中可以看出,所有被视为LRU的节点都是叶节点。在确定非叶节点是合适的LRU候选节点的同时,是否有一个伪LRU算法来处理静态树,该静态树仍将表现良好 编辑: 我已经使用hashmaps和LinkedList实现了一个LRU。我对使用伪lru树(特别是在并发读取上)的性能影响很感兴趣。 这就是我特别询问伪lru树算法的原因,但我应该说得更清楚。您可以使用

许多关于伪LRU算法的描述都涉及到使用二叉搜索树,以及在每次访问树时将标志设置为“指向远离”正在搜索的节点

这导致了LRU的合理近似值。然而,从描述中可以看出,所有被视为LRU的节点都是叶节点。在确定非叶节点是合适的LRU候选节点的同时,是否有一个伪LRU算法来处理静态树,该静态树仍将表现良好

编辑: 我已经使用hashmaps和LinkedList实现了一个LRU。我对使用伪lru树(特别是在并发读取上)的性能影响很感兴趣。
这就是我特别询问伪lru树算法的原因,但我应该说得更清楚。

您可以使用红黑树将内部节点向下推到叶子上


在这样做的同时保持树的平衡可能很困难。但是您可以选择下推哪个子树,因此可能并非不可能……

您始终可以使用红黑树将内部节点下推到叶子上


在这样做的同时保持树的平衡可能很困难。但是您可以选择下推哪个子树,所以可能不是不可能的…

根据此处提供的基准数字,伪LRU(PLRUm、PLRUt、MPLRU)似乎是实现的最佳候选。

根据此处提供的基准数字,伪LRU(PLRUm、PLRUt、MPLRU)作为实现的最佳候选者出现。

我试图保持树结构静态,以允许并发读取,同时出于性能原因。(我知道旗子上会有比赛条件,但我不在乎,因为它只是伪LRU。)如何保持树的静态?要删除的节点和要添加的节点没有相同的键,因此它们位于树的不同部分。你的意思是“在缓存命中期间是静态的”,这样你就可以使用读锁进行查找了吗?键保持不变。我将数据映射到任意索引(0到(2^深度)-1)。当我“删除”某个内容时,我只是将树的该节点添加到可用节点列表中。当我添加时,我不添加节点,我只是覆盖节点所持有的数据。这使树结构保持静态,但数据仍然是可变的,因此根本不需要树。只需使用一个带有move to front的双链接列表,就可以准确地执行LRU。然后使用我的ConcurrentLinkedHashMap(谷歌代码)来创建一个真正的LRU,它的性能与ConcurrentHashMap相当。如果您想详细讨论它/您的方法,请随时给我发电子邮件。我正试图保持树结构静态,以允许并发读取,同时出于性能原因。(我知道旗子上会有比赛条件,但我不在乎,因为它只是伪LRU。)如何保持树的静态?要删除的节点和要添加的节点没有相同的键,因此它们位于树的不同部分。你的意思是“在缓存命中期间是静态的”,这样你就可以使用读锁进行查找了吗?键保持不变。我将数据映射到任意索引(0到(2^深度)-1)。当我“删除”某个内容时,我只是将树的该节点添加到可用节点列表中。当我添加时,我不添加节点,我只是覆盖节点所持有的数据。这使树结构保持静态,但数据仍然是可变的,因此根本不需要树。只需使用一个带有move to front的双链接列表,就可以准确地执行LRU。然后使用我的ConcurrentLinkedHashMap(谷歌代码)来创建一个真正的LRU,它的性能与ConcurrentHashMap相当。如果你想详细讨论它/你的方法,请随时给我发电子邮件。也许这会说服你使用hashtable+linkedlist:也许这会说服你使用hashtable+linkedlist: