查询类型1 : 在multiset中询问第k个频率较低(发生较少)的数字。如果有多个可能的答案,请返回最大答案。
对于multiset = {1,2,2,2,3,3}和k = 3,答案是2。
freq(1)= 1,freq(3)= 2,freq(2)= 3;所以第3次不太频繁就是2。
查询类型2 : 将整数x添加到多集。
查询类型3 : 从多集中删除整数x。
查询类型1是最常见的查询。
我需要一种能够处理这些查询的算法,其复杂性优于或等于每个查询的O(sqrt N),其中N是多集的当前大小。
答案 0 :(得分:2)
首先,我们可以使用哈希表并存储每个数字的频率。然后我们需要一个自平衡搜索树,其中包含一对(frequency(number), number)
形式的密钥。
查询1.在O(log(n))
中的自平衡搜索树中搜索第k个元素
查询2和3.更改O(1)
中哈希表中的频率,然后更改O(log(n))
中树(或一对删除/插入操作)中的更新键操作。