任务是为周期性值实现缓存。更具体地说 - 这些是与银行账户相关的一些记录。每条记录都有一个日期和一天内的某个位置。因此,每个记录可以通过这些属性进行比较。缓存必须包含与查询期间相关的记录列表。当执行更大周期的查询时,也可以合并缓存的值。
让我们考虑几个例子。某个特定帐户的历史记录有10条记录(日期格式为MM / dd / yyyy:
01/01/2012
02/01/2012
03/01/2012
04/01/2012
05/01/2012
06/01/2012
07/01/2012
08/01/2012
09/01/2012
10/01/2012
示例1
第一次查询是针对02/15/2012期间 - 2012年3月15日。
查询结果将是一条记录:
03/01/2012
缓存应包含记录:密钥“02/15/2012 - 03/15/2012”,值[“03/01/2012”]
该期间或子期间(即02/16 / 2012-03 / 15/2012)的所有查询都应从缓存中返回“03/01/2012”。
执行的第二次查询是针对01/15/2012 - 02/16/2012期间的。
查询结果将是两条记录:
02/01/2012
03/01/2012
有以下几点要提及:
1)对基础数据存储的查询应仅在01/15/2012 - 02/14/2012期间执行。这是因为缓存已包含02/15/2012的所有条目。
2)单个缓存条目的边界将随其存储的记录数一起更新。
结果缓存然后应包含单个记录:键“01/15/2012 - 03/15/2012”,值[“02/01/2012”,“03/01/2012”]。
然后,对子句点的任何查询都应按键查找缓存条目,然后从缓存中选择所需的记录。
示例2
当前缓存状态为:
Entry 1: "01/15/2012 - 03/15/2012" => ["02/01/2012", "03/01/2012"]
Entry 2: "04/15/2012 - 05/15/2012" => ["05/01/2012"]
Entry 3: "07/02/2012 - 09/02/2012" => ["08/01/2012", "09/01/2012"]
查询将在01/01/2012 - 10/01/2012期间执行。结果包含所有记录历史记录:
01/01/2012
02/01/2012
03/01/2012
04/01/2012
05/01/2012
06/01/2012
07/01/2012
08/01/2012
09/01/2012
10/01/2012
缓存应包含单个条目:key“01/01/2012”,value [“01/01/2012”,“02/01/2012”,“03/01/2012”,“04/01 / 2012“,”05/01/2012“,”06/01/2012“,”07/01/2012“,”08/01/2012“,”09/01/2012“,”10/01/2012“ ]
我正在挑战这个任务一个星期,找不到任何美观的简单算法来处理这样的缓存。
任何帮助表示感谢。
答案 0 :(得分:0)
我认为Interval Tree可能符合您的需求 - here is a Java implementation。区间树存储间隔,可以按间隔查询(例如,您可以存储[1,5],[2,7],[6,10],在[3,5]上查询它,它返回[1,5] ],[2,7]即与查询重叠的所有区间)。您存储点而不是间隔,但只需将点存储为足够小的非重叠间隔,您就可以了。
因为这是一个缓存,您可能希望将密钥和值存储在SoftReferences中 - 如果您遇到OutOfMemoryError
,这将允许垃圾收集器释放它们。 / p>