Algorithm 使用现有数组中的

Algorithm 使用现有数组中的,algorithm,heap,Algorithm,Heap,给定一个整数数组A[1…n-1],其中n是数组A的长度。构造一个数组B,使得B[i]=min(A[i],A[i+1],…,A[i+K-1]),其中将给出K。数组B将有N-K+1个元素 我们可以使用最小堆来解决这个问题,为k个元素-O(k)构造最小堆。对于下一个元素,删除第一个元素并插入新元素和heapify 因此,最坏情况下的时间-O((n-k+1)*k)+O(k)空间-O(k) 我们可以做得更好吗?如果在OP的算法中,我们将昂贵的“heapify”过程改为更便宜的“uptap”或“downhe

给定一个整数数组
A[1…n-1]
,其中
n
是数组A的长度。构造一个数组
B
,使得
B[i]=min(A[i],A[i+1],…,A[i+K-1])
,其中将给出
K
。数组B将有N-K+1个元素

我们可以使用最小堆来解决这个问题,为k个元素-O(k)构造最小堆。对于下一个元素,删除第一个元素并插入新元素和heapify

因此,最坏情况下的时间-O((n-k+1)*k)+O(k)空间-O(k)


我们可以做得更好吗?

如果在OP的算法中,我们将昂贵的“heapify”过程改为更便宜的“uptap”或“downheap”,我们可以做得更好。这就给出了O(n*log(k))的时间复杂度


或者,如果我们迭代输入数组,并将每个元素放入大小为“k”的最小队列,我们可以在O(n)时间内完成。Min queue是一个可以在O(1)时间内执行查找Min的队列。它可以实现为一对最小堆栈。有关详细信息,请参阅。

这可能会有所帮助:但在删除时,我们必须搜索元素,因此这里的日志(k)不是O(k)。这就是为什么我说最坏的情况复杂性是O((n-k+1)*k)+O(k)@Luv:如果我们跟踪每个堆元素的位置,就没有必要搜索已删除的元素。