我有相当多的固定大小记录。每条记录都有很多字段,ID和Value都在其中。我想知道什么样的数据结构是最好的,这样我才能
以ID(唯一)非常快速地找到记录,
列出具有最大值的100条记录。
最大堆似乎有效,但远非完美;你有更聪明的解决方案吗?
谢谢。
答案 0 :(得分:2)
混合数据结构很可能是最好的。为了通过ID进行有效查找,良好的结构显然是一个哈希表。为了支持前100次迭代,最大堆或二叉树非常适合。插入和删除时,只需对两个结构进行操作即可。如果迭代情况的100是固定的,则迭代经常发生并且插入/删除不会严重偏向前100,只需将前100个作为排序数组保持溢出到最大堆。这不会修改结构的大O复杂性,但它会为迭代情况提供一个非常好的常数因子加速。
答案 1 :(得分:0)
最大堆符合第二个要求,但哈希映射或平衡搜索树对第一个要求更好。根据这些操作的频率做出选择。您需要多久按ID查找一个项目,以及需要多长时间才能检索前100个项目?
伪代码:
add(Item t)
{
//Add the same object instance to both data structures
heap.add(t);
hash.add(t);
}
remove(int id)
{
heap.removeItemWithId(id);//this is gonna be slow
hash.remove(id);
}
getTopN(int n)
{
return heap.topNitems(n);
}
getItemById(int id)
{
return hash.getItemById(id);
}
updateValue(int id, String value)
{
Item t = hash.getItemById(id);
//now t is the same object referred to by the heap and hash
t.value = value;
//updated both.
}
答案 2 :(得分:0)
我知道你想要伪代码算法,但在Java中我会使用TreeSet,按ID,值对添加所有记录。
树将按值排序添加它们,因此查询前100个将为您提供前100个。按ID检索将是直截了当的。
我认为算法被称为二元树或平衡树不确定。