在键值对上计算功能的巧妙方法

时间:2013-10-03 17:29:03

标签: data-structures map

假设您有一个包含键值对的列表。也不 密钥,值,或对都必须是唯一的。

以下示例

a -> 1
b -> 2
c -> 3
a -> 3
b -> 1

是有效的。

现在假设我想要将任何键值对(k-> v)与另一个值V相关联, 它具有以下属性:

  • 对于两对,如果它们的键完全相同则是相同的
  • 它由整个列表中的一组键值对唯一确定

这听起来很抽象,但是例如总和,最大值和计数功能都有资格作为例子

 Pair    SUM    MAX  COUNT
a -> 1    4      3     2
b -> 2    3      2     2
c -> 3    3      3     1
a -> 3    4      3     2
b -> 1    3      2     2

我正在寻找一种快速的方法/数据结构来计算整个列表中的这些函数。

如果可以对键进行排序,可以简单地对列表进行排序,然后遍历排序列表,并使用相同的键计算每个块中的函数V.

我想知道是否有很好的方法可以做到这一点,如果这些值不具有可比性或者没有 不想改变条目的顺序。

一些想法:

  1. 当然,可以将哈希函数应用于键,以获得可排序键。
  2. 当然,还可以存储每对的原始位置,然后进行排序,然后进行计算 该函数,最后撤消排序。
  3. 基本上这个问题已经得到了回答。但是,我对是否感兴趣 有更优雅的解决方案可能使用一些适应数据结构

    编辑:澄清Sunny Agrawal评论,我的意思是员工。那么这也是如何很好地安排数据结构的问题的一部分。 在我的例子中,我将获得另一个列表/地图,其中(k-> v)为关键,V为值。但是,不以这种方式排列数据可能是有意义的。我要求,V以这样的方式存储:对于给定的k,它需要恒定的时间来获得V。

1 个答案:

答案 0 :(得分:1)

维持2 DS

1. List< Pair< Key_Type, Value_Type > >
2. Map<Key_Type, Stats>

其中Stats是结构如下

struct Stats
{
    int Sum;
    int Count;
    int Max;
};

First DS包含您要存储的所有key,val对, 其次,维护每个密钥的数据统计信息,如示例所示

Insert将按如下方式工作(伪C ++代码)

void Insert(key,val)
{
    list.insert(Pair(key,val))

    Stats curr;
    if(map.contains(key))
    {
        curr = map[key];
        curr.Max = Max(curr.Max, val);
        curr.Count++;
        curr.Sum += val;
    }
    else
    {
        curr.Max = val
        curr.Count = 1;
        curr.Sum = val;
    }
    map[key] = curr; 
}

复杂性将是用于更新列表的O(1)和用于更新地图的O(lgM) 其中M不是唯一的密钥和 如果N是列表中对象的总数 插入的总时间将为O(N)+ O(NlogM)

注意:如果我们只有插入,这将有效,如果删除,则更新Max将很困难