# To heapify subtree rooted at index i.
def maxHeapify(list, heapSize, i):
largest = i
leftChild = 2 * i
rightChild = 2 * i + 1
while leftChild < heapSize and list[largest] < list[leftChild]:
largest = leftChild
while rightChild < heapSize and list[largest] <
一般情况下,我对分析空间复杂性有点困惑。我不确定“算法占用的额外空间”是什么意思。什么是1的空格?在下面的示例中
int findMin(int[] x) {
int k = 0; int n = x.length;
for (int i = 1; i < n; i++) {
if (x[i] < x[k]) {
k = i;
}
}
return k;
}
空间复杂度为O( n ),我猜这是由于数组大小为n所致。
但是对于像heapsort这样的东西,它需要O(1)。就地堆排序
因此,当我在处理编程竞赛(ACM ICPC等)中的一些实践问题时,人们经常可以采用O(N^2)解决方案,甚至更糟,并使用堆(C++中的priority_queue)或use来降低复杂性。(作为某种优化,在注意到模式中的“某些东西”之后)
例如,在“滑动窗口最大值”问题中,这几乎是:
For each window of size K in an array of size N, compute the maximum.
这里有一个简单的O(NK)算法,一个相当简单的O(nlogn)解决方案(甚至我都可以看到,使用一个堆)和一个O(N)解决方案,使用一个双端队列。
这些原则似乎是基于“丢弃”无用
我试图了解是否有任何替代蛮力算法(或轻微的改进/最坏的性能比幼稚的蛮力算法)仍然将导致O(N^2)的时间复杂性和O(1)辅助空间。
这是我的蛮力伪码:
procedure distinct(Input: array)
for i=0 to i < length of array
for j=i+1 to j < length of array
if array[i] ==