【问题标题】:LRU Algorithm In JavaJava中的LRU算法
【发布时间】:2013-02-21 12:26:38
【问题描述】:

我目前有一个自定义类的数组,如下所示:

Phy[] memory = new Phy[256];

在我的Phy 类中,我具有以下功能:

  • 获取时间戳(返回时间戳)
  • 更新时间戳(使用系统时间,获取自 1970 年以来的毫秒并设置)

当涉及到 LRU 部分来查找 LRU 类时,我会这样做:

public int getLeastRecentlyUsed(){
    long leastUsed = memory[0].getTimeStamp();
    int  leastUsedPosition = 0;
    for(int i = 0; i < memory.length; i++){
        if(memory[i].getTimeStamp() < leastUsed){
            leastUsed = memory[i].getTimeStamp();
            leastUsedPosition = i;
        }
    }
    return leastUsedPosition;
}

这基本上是寻找最旧的时间戳。

我刚刚意识到的问题是,处理器可以在 MS 中执行许多这样的操作,而留下一个无用的算法。

我该怎么做才能排序?

【问题讨论】:

    标签: java date timestamp lru


    【解决方案1】:

    您不需要为此设置时间戳。每次使用时只需将每个项目移动到列表的头部。那么 LRU 项平均在列表的末尾。

    Knuth 第 1 卷中还有一个相当不错的算法,它不会提供真正的 LRU,但会及时稳定到一个非常好的近似值。它只是由一个位环组成:您在每次访问时设置项目的位,并且在寻找空闲插槽时扫描环,清除设置位,直到找到一个已经清除的位。这意味着它至少没有被用于环周围的一次旅行。下次扫描时,从本次停止的地方开始。

    【讨论】:

    • 如果数组很大,例如256只会有表演效果吗?
    • @LmC 当然,但这只是一个数据结构问题。您可以使用例如LinkedHashMap 而不是数组。有很多可能性。
    【解决方案2】:

    代替时间戳,给每个“phy”对象一个唯一的值,每次分配时都会增加。

    所以做这样的事情:

    class phy {
       private static int uniqueIdentifier = 0;
    
       private int timestamp;
    
       // Or give it a new (proper) name
       void updateTimestamp() {
           timestamp = uniqueIdentifier;
           uniqueIdentifier++;
       }
    }
    

    每次更新“时间戳”时,您都会分配一个新的(更高/最高)数字,您可以使用它来查找最近最少使用的“phy”。

    注意:如果您有多个线程,则需要进行一些同步以防止同时访问uniqueIdentifier(导致非唯一的timestamp 值)。

    【讨论】:

    • 这听起来很愚蠢...但是请删除最近最少使用的,例如最高的 unqiueIdentifer 还是最低的?
    • uniqueIdentifier 与您的时间戳基本相同,但与测量时间的准确性(或其他任何事情)无关。每次更新时间戳时它都会增加。不会增加在数组中移动 phy 项的任何开销。
    【解决方案3】:

    尝试使用LinkedHashMap 来实现它怎么样?

    查看 thisthis 以获取有关如何实现它的示例

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2023-03-28
      • 2013-12-06
      相关资源
      最近更新 更多