假设您有一个包含键值对的列表。也不 密钥,值,或对都必须是唯一的。
以下示例
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.
我想知道是否有很好的方法可以做到这一点,如果这些值不具有可比性或者没有 不想改变条目的顺序。
一些想法:
基本上这个问题已经得到了回答。但是,我对是否感兴趣 有更优雅的解决方案可能使用一些适应数据结构
编辑:澄清Sunny Agrawal评论,我的意思是员工。那么这也是如何很好地安排数据结构的问题的一部分。 在我的例子中,我将获得另一个列表/地图,其中(k-> v)为关键,V为值。但是,不以这种方式排列数据可能是有意义的。我要求,V以这样的方式存储:对于给定的k,它需要恒定的时间来获得V。
答案 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将很困难