【发布时间】:2017-07-24 08:16:25
【问题描述】:
是否有可能在恒定时间内得到一个数组的切片。如果是这样,方法是什么。最好在 python 中。
【问题讨论】:
标签: time-complexity slice
是否有可能在恒定时间内得到一个数组的切片。如果是这样,方法是什么。最好在 python 中。
【问题讨论】:
标签: time-complexity slice
让数组大小为n。构造一个占n 一部分的切片需要O(n) 时间。在this related post 中解释了python 符号。你也可以看看python documentation on the time complexities。所以答案通常是否定的,只有对于一个恒定大小的切片,它可以是恒定的时间。
【讨论】:
这是可能的,我不知道为什么人们的说法不同。你只需要编写自己的类来完成它并小心可变性。基本上您需要实现与列表相同的接口,但要小心处理切片的方式。
您可以创建一个名为SliceList 的类,它是可迭代的,并在内部存储一个列表和两个偏移量到该列表start 和end 中。您将重载[] 运算符,以便x[i] 真正访问x.internal_list[x.start + i]。您还将重载__len__ 以返回end - start。最大的问题是您将拥有内部数据结构的浅表副本,因此对原始列表的修改也会修改列表的任何部分。但这确实使某些算法(例如二进制搜索算法)的代码更简洁,因为数据结构将处理内部索引数学,而您必须显式传递所有这些。
然后切片返回一个新的SliceList 对象,该对象具有相同的内部列表,但起点和终点不同。切片现在是 O(1)。
【讨论】: