要通过最大值和ID检索的最佳数据结构?

时间:2009-12-16 07:50:50

标签: algorithm data-structures

我有相当多的固定大小记录。每条记录都有很多字段,ID和Value都在其中。我想知道什么样的数据结构是最好的,这样我才能

  1. 以ID(唯一)非常快速地找到记录,

  2. 列出具有最大值的100条记录。

  3. 最大堆似乎有效,但远非完美;你有更聪明的解决方案吗?

    谢谢。

3 个答案:

答案 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检索将是直截了当的。

我认为算法被称为二元树或平衡树不确定。