【发布时间】:2017-08-06 06:50:05
【问题描述】:
让我们对大小为K 的数组B[1:K] 定义一个操作,即计算子数组B[2:K] 中小于B[1] 的元素数。
现在我有一个大小为N 的数组A[1:N],我的目标是对大小为K 的所有连续子数组执行上述操作。
例子
A = [4, 3, 6, 2, 1] and K = 3 有3 大小为3 的连续子数组。
-
B = [4, 3, 6]count = 1[(3 < 4)] -
B = [3, 6, 2]count = 1[(2 < 3)] -
B = [6, 2, 1]count = 2[(2 < 6), (1 < 6)]
蛮力方法的时间复杂度将为O((N-K+1)*K),因为对大小为K 的连续子数组执行上述操作为O(K)。
如果我可以设计数据结构,我可以有效地做到这一点,即在Nlog(M)
它具有以下属性
- 插入
log(M) - 删除
log(M) - 计算
log(M)中小于X的元素数
我是C++ 用户,我认为没有任何数据结构可以满足所有提到的要求。还有其他改进的方法吗?请帮忙。
【问题讨论】:
-
前两个是
std::set,但最后一个操作将是O(M),尽管找到上限是O(logM)本身。 -
如果您的目标只是计数,我会想到一个算法,它在 O(nlogn) 中运行
-
@StoryTeller 是的,我知道。
-
@marvel308 是的,计数就足够了。
标签: c++ algorithm data-structures