这个问题在投资银行公司的一次采访中提出。 我必须设计myCache,它保存studentRecords对象的缓存,并且可以有一个studentRecords集合的myCache对象。当用户想要在studentRecords中插入记录时,如果集合中记录的记录少于20,则只会插入记录。否则它将删除来自studentRecords的最少使用的记录并插入记录。将根据学生记录的排序顺序插入记录。当用户想要阅读记录时,它将检查myCache中是否存在studentRecords,如果不存在则将从studentRecords collection。
我创建了一个双向链表并根据排名插入记录。也可以创建一个单独的mycache类并从缓存中读取记录。但是如何删除最少使用的记录。
我可以创建一个数组列表,删除数组顶部的记录(最少使用的记录)但不能保留基于排名顺序的元素。并且根据排名阅读记录再次昂贵。
是否有任何其他解决方案会给面试官留下深刻印象。
myCache类具有以下功能:
public void removeRecordFromStudentRecords(String rank);
public void addRecordToStudentRecords(StudentRecords st);
public Student readRecordFromStudentRecords(String rank);
StudentRecords表
SrNo等级名称数学科学总百分比
1 1 rohan 90 90 180 90
2 2 sohan 80 90 160 80
3 3 abhi 70 70 140 70
答案 0 :(得分:1)
如果我们谈论的是缓存,我们应该首先优化时间复杂度,然后再优化内存。
因此,在这种情况下,我可以提供下一个解决方案:
Map
(即HashMap)存储记录(key: recordId, value: Record
)。Stack
用于上次使用的项目(value: recordId
)。Tree
(即BST)来保持排名(key: rankValue, value: recordId
)。这种树数据结构的组合允许提供最快的解决方案(我猜)。
这只是对问题的简要概述。猜猜,这是了解主要想法的足够信息。
答案 1 :(得分:0)
为了跟踪最少使用的记录,你需要存储每条记录的点击次数(如果你不知道“点击”是什么,我建议你查看“点击和未命中的缓存” )因此每个studentRecord可以是一个类的对象,如下所示:
class StudentRecord{
int unique_id;
int ranking;
int hits
}
StudentRecord studentRecord = new StudentRecord();
根据studentRecord.ranking对缓存进行排序,当您需要决定删除哪个studentRecord时,只需在命中的基础上遍历缓存并删除具有最小匹配的元素。
为了维持点击量,每当你根据unique_id获得studentRecord的查询时,你的点击数就会增加1.因此,点击数将为你提供一个最常用/最少使用的studentRecord指标
编辑:您的问题现在更加清晰了。对于排序,您可以使用简单的插入排序。原因是1)你的缓存中有20个元素,2)当你尝试插入一个新元素时,插入排序将帮助你完美地找到你可以放置元素的索引。事实上,从技术上讲,你只需要排序一次。然后你只需要找出插入未来元素的位置。
我想说一个具有任意访问权限的简单链表(如java.util.ArrayList)就足够了。它将为您提供数组中的随机访问,以及容纳少于20个元素的规定。我认为没有理由建立一个双向链表,因为这里不需要访问元素的左右邻居......
答案 2 :(得分:-1)
这里可以应用最近最少使用的调度技术,您可以为列表中的每个条目保留一个字节字段。
因此,每次使用对象的条目时,您都可以将1推到字节(b>> 1)。
因此,对于更频繁使用的条目,您的字节的二进制表示中会有很多1。
对于数据,根本不使用的数据将全部为0。
每次都需要从缓存中删除一个条目,只需删除0或者该字节字段值最小的那个。
另外,要记住超过8个时间跨度的引用,可以使用更大的数据类型。