面试问题:HashSet - 如何获得最少使用的对象?

时间:2011-02-21 11:30:48

标签: .net hash hashtable hashcode hashset

天哪,我现在接受采访了。不管你准备多少,你都会忘记一切。 :)

我想我会分享这个问题,而这在脑子里是新鲜的。

1)您有1000个对象作为缓存保留。您应该以有效的方式创建缓存,以便搜索时间非常短。

显然他们正在寻找一个提供持续访问时间的HashSet。

2)如何在缓存中获取至少(不是最旧但最少)使用的对象?什么用作哈希码来实现这一点,以及如何在不进行任何昂贵搜索的情况下获得这个桶?

我正在考虑将对象的时间戳用作哈希码。但是,如果不进行任何搜索,我将如何获得最少使用的对象?

2 个答案:

答案 0 :(得分:1)

我认为他们的方式是使用最近最少使用的缓存算法。有关维基百科的更多信息:Cache Algorithms

StackOverflow question还有一个LRU缓存。

答案 1 :(得分:1)

我的解决方案(我最近实现了类似的东西)是同时拥有Dictionary(Hashset)和有序LinkedListLinkedList将包含访问项和计数器。当你想获得你的项目时,你会查看Dictionary以获取LinkedList的节点,然后你增加计数器并向前推送节点以保持列表排序。如果你想获得最不常用的项目,你可以选择列表的头部(或尾部)。

这使得检索O(1)和插入O(n)处于最差(非常罕见)和O(1)最佳情况。