线性时间和常数存储中的旋转数组(列表)

问题描述 投票:2回答:3

如何确定此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成正比。但是我该如何验证?

该练习也给我带来了一个神秘的提示:“提示:反转三个子数组。”为什么需要创建三个子数组,为什么要反转它们呢?那是使用恒定内存的诀窍吗?我知道您可以颠倒元素0k-1的顺序,颠倒元素kn-1的顺序,然后颠倒所有元素的顺序,但这似乎需要更多的操作,而不是更少。

*这本书是Sedgewick,Wayne和Dondero撰写的Python编程简介。我在自学,而不是学分课程。

python algorithm memory-management
3个回答
3
投票

提示所指的技巧是这样:


1
投票

而不是执行交换,您可以携带一个元素并将其移至下一个位置:


-1
投票

我知道此解决方案返回一个迭代器而不是列表,但这对正在寻找此问题的其他人来说可能很好。

© www.soinside.com 2019 - 2024. All rights reserved.