【发布时间】:2020-03-11 01:22:28
【问题描述】:
我已经阅读了一些关于两种常见数据结构的教程,它们可以在 O(lg N) 中实现范围更新和查询:Segment tree 和 Binary Indexed Tree (BIT / Fenwick Tree)。
我发现的大多数示例都是关于一些关联和交换操作,例如“范围内的整数之和”、“范围内的整数异或”等。
我想知道这两种数据结构(或任何其他数据结构/算法,请提出)是否可以在O(lg N)中实现以下查询? (如果不是,那么 O(sqrt N) 怎么样)
给定一个整数数组 A,查询 [l,r] 范围内不同整数的个数
PS:假设可用整数的个数约为 10^5,所以used[color] = true 或位掩码是不可能的
例如:A = [1,2,3,2,4,3,1], query([2,5]) = 3,其中范围索引从 0 开始。
【问题讨论】:
-
A 中没有任何结构(例如,beeing 排序)
O(n)是下限,因为您需要查看每个元素。 -
@sascha 明白了,但同时你的意思是如果A是排序的,那么查询可以在O(lg N)中完成?在排序之前似乎很难追踪每个元素的原始索引......
-
我不确定,但是上限当然会降低到
O(r-l)。 -
@sascha 该参数会产生预处理 + 查询时间的下限,但 OP 对查询时间感兴趣。这类似于如何在次线性查询时间内完成范围求和。
标签: algorithm data-structures segment-tree fenwick-tree