如何确定这个Python算法使用恒定的内存? 理论证明可以。
一本教科书*给出了这个练习:编写一个算法来“旋转”一个由n个整数组成的列表,换句话说,将列表值向右移动k个索引。但问题是该算法应在线性时间(与n成比例)和恒定内存(对于任何n都是相同的数量)内运行。 这个旋转可以通过切片完成:
>>> n = 5
>>> k = 3
>>> a = [i for i in range(n)]
>>> a = a[k:] + a[:k]
>>> a
[3, 4, 0, 1, 2]
我已经验证了将n加倍会使时间加倍,因此该算法的时间复杂度为线性。但是,我不确定它需要常量内存。我假设Python创建了一个新的数组作为两个切片的连接,并重新分配变量a给该数组。如果是这样的话,那么我认为所使用的内存与n成正比。但是,我如何验证呢?
练习还给出了一个对我来说很神秘的提示:“提示:反转三个子数组。”为什么需要创建三个子数组,而且为什么要反转它们?这是使用常量内存的诀窍吗?我知道你可以反转元素0到k-1的顺序,然后反转元素k到n-1的顺序,最后反转所有元素的顺序,但那似乎需要更多操作,而不是更少。
*书名为《Python编程导论》,作者为Sedgewick、Wayne和Dondero。我正在自学,不是为了学分。