当前位置:  开发笔记 > 编程语言 > 正文

什么是数据结构类似哈希表,但不常使用的键被删除?

如何解决《什么是数据结构类似哈希表,但不常使用的键被删除?》经验,为你挑选了1个好方法。

我正在寻找一个类似于哈希表的数据结构,但表中有一个大小限制.当散列中的项数达到大小限制时,应调用剔除函数以消除表中检索次数最少的键/值对.

这是我正在研究的一些伪代码:

class MyClass {
  private Map cache = new HashMap();
  public int myFunc(int n) {
    if(cache.containsKey(n))
      return cache.get(n);
    int next = . . . ; //some complicated math.  guaranteed next != n.
    int ret = 1 + myFunc(next);
    cache.put(n, ret);
    return ret;
  }
}

什么情况是,有一些价值n的,其myFunc()将被称为很多次,但许多其他值n将只计算一次.因此,缓存可以填满数百万个永远不需要的值.我想有一种方法让缓存自动删除不经常检索的元素.

这感觉就像一个必须解决的问题,但我不确定数据结构是什么,我将用它来有效地做到这一点.谁能指出我正确的方向?


更新我知道这必须是一个已经解决的问题.它被称为LRU Cache,通过扩展LinkedHashMap类很容易实现.以下是包含该解决方案的代码:

class MyClass {
  private final static int SIZE_LIMIT = 1000;
  private Map cache =
    new LinkedHashMap(16, 0.75f, true) {
      protected boolean removeEldestEntry(Map.Entry eldest)
      {
        return size() > SIZE_LIMIT;
      }
  };
  public int myFunc(int n) {
    if(cache.containsKey(n))
      return cache.get(n);
    int next = . . . ; //some complicated math.  guaranteed next != n.
    int ret = 1 + myFunc(next);
    cache.put(n, ret);
    return ret;
  }
}

ReneS.. 17

你正在寻找LRUList/ Map.退房LinkedHashMap:

removeEldestEntry(Map.Entry)可以重写该方法,以便在将新映射添加到映射时自动删除过时映射的策略.



1> ReneS..:

你正在寻找LRUList/ Map.退房LinkedHashMap:

removeEldestEntry(Map.Entry)可以重写该方法,以便在将新映射添加到映射时自动删除过时映射的策略.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有