用于从API调用有效访问随机数据片段的数据结构

时间:2011-03-29 18:19:49

标签: api caching data-structures

我们正在为Api编写一个库,它可以下载有序的数据流。通过此Api,您可以通过切片调用数据。例如,如果我想要15-25项,我可以为此打电话。

我们正在编写的库将允许客户端调用任何数据片段,但我们希望库尽可能高效地使用这些api调用。因此,如果我已经要求提供项目21-30,我不想再次请求这些个别数据项。如果有人要求图书馆15-25,我们要打电话给api 15-20。我们需要搜索已有的数据,并避免再次请求该数据。

用于存储这些api调用结果的最有效数据结构是什么?数据集不会很大,因此本地内存中的搜索时间不是很大。我们正在寻找简单和清洁的代码。这个问题有几个明显的答案,但我很好奇是否有任何数据结构书呆子有一个优雅的解决方案,不会想到。

作为参考,我们使用Python进行编码,但实际上只是在寻找能够优雅地解决这个问题的数据结构。

2 个答案:

答案 0 :(得分:0)

我使用平衡二叉树(例如http://pypi.python.org/pypi/bintrees/0.4.0)来映射begin - > (结束,数据)。当[b,e]范围的新请求进入时,搜索b(后跟如果b!=键移动到上一个记录),另一个搜索e(也回退),扫描生成的键之间的所有条目,下拉缺失的范围,并将所有缓存间隔和新数据合并为一个间隔。对于缓存中的N个间隔,您将获得每个缓存更新的摊销O(log-N)成本。

您还可以简单地保留(开始,结束,数据)元组的列表,按开头排序,并使用bisect_right进行搜索。成本:在最坏的情况下每次更新的O(N =缓存间隔数),但如果客户端倾向于按递增顺序请求数据,则缓存更新将为O(1)。

在任何一种情况下,缓存搜索本身都是O(log-N)。

答案 1 :(得分:0)

经常用于解决此问题的规范数据结构是间隔树。 (参见this Wikipedia article。)您的问题可以被认为是需要知道您发送的内容(间隔时间)与您尝试发送的内容重叠 - 然后切出与您的内容相交的间隔'试图发送(这是相对于你发现重叠的间隔数的线性时间),你就在那里。维基百科文章中间的“增强”树在实现中看起来更简单,所以我坚持这一点。应该是“log N”时间复杂度,还是不摊销。