O(n)和O(k)是什么意思?

时间:2019-12-10 22:27:27

标签: python performance

我有这个任务:

给出一个整数数组和一个数字k,其中1 <= k <=数组的长度,计算每个长度为k的子数组的最大值。 例如,给定array = [10,5,2,7,8,7]且k = 3,我们应该得到:[10,7,8,8],因为:

10 = max(10, 5, 2)
7 = max(5, 2, 7)
8 = max(2, 7, 8)
8 = max(7, 8, 7)

在O(n)时间和O(k)空间中执行此操作。您可以就地修改输入数组,而无需存储结果。您可以在计算时简单地将它们打印出来。

O(n)时间和O(k)空间是什么意思?

我得到了这个解决方案。这符合要求吗?如果没有,为什么不呢?

def foo(arr, k):
    for idx in range(0, len(arr) - k + 1):
        maxI = -1
        for i in arr[idx:idx + k]:
            if i > maxI:
                maxI = i

        print(maxI) #3; 3; 3; 5; 5; 5; 10; 22

arr = [0, 1, 3, 1, 2, 5, 5, 4, 10, 22]
k = 3

foo(arr, k)

1 个答案:

答案 0 :(得分:0)

我将用 n 来表示数组的长度,而用 k 来表示子数组的长度

Ο( n )时间将是算法花费的时间与数组的长度成正比。也就是说,长度为1000的数组的运行时间将是长度为2000的数组的运行时间的一半。

Ο( k )空间将是算法执行计算所需的内存量与子数组的大小成比例。这样说,它与输入的大小无关。


您的算法在进行 k 迭代的循环上进行了 n - k + 1次迭代。这使得其执行时间为 k ×( n - k + 1)。由于 k 可以随 n 的不同而变化,因此平均情况应为 k = n / 2 ,从而使运行时间为Ο(< em> n 2 )。

由于只需要几个整数变量,因此算法占用的空间为Ο(1)。

相关问题