【问题标题】:Is it possible to get a slice of an array in constant time?是否可以在恒定时间内获得数组的一部分?
【发布时间】:2017-07-24 08:16:25
【问题描述】:

是否有可能在恒定时间内得到一个数组的切片。如果是这样,方法是什么。最好在 python 中。

【问题讨论】:

    标签: time-complexity slice


    【解决方案1】:

    让数组大小为n。构造一个占n 一部分的切片需要O(n) 时间。在this related post 中解释了python 符号。你也可以看看python documentation on the time complexities。所以答案通常是否定的,只有对于一个恒定大小的切片,它可以是恒定的时间。

    【讨论】:

    • 它如何回答 OP 问题?
    • @gue 那么是否可以在任何编程语言中以恒定时间插入一个元素,因为我有一个算法可以在 O(log(n!)) 中排序,如果可以切片或插入恒定时间
    • 感谢您迄今为止的帮助
    • 复杂性不依赖于编程语言。如果我们说的是一个数组,我们有一个固定大小的内存块,它是连续寻址的。因此,插入一个新元素总是需要 O(sizeof(array)) 时间,因为必须移动后面的所有元素,或者调整数组的大小。在列表中这当然没问题。
    • 但在列表中访问任何第 i 个元素将花费 O(i) 时间。我不能让我需要 O(1) 时间来索引任何元素和 O(1) 时间来插入以便排序​​在 log(n!) 中工作
    【解决方案2】:

    这是可能的,我不知道为什么人们的说法不同。你只需要编写自己的类来完成它并小心可变性。基本上您需要实现与列表相同的接口,但要小心处理切片的方式。

    您可以创建一个名为SliceList 的类,它是可迭代的,并在内部存储一个列表和两个偏移量到该列表startend 中。您将重载[] 运算符,以便x[i] 真正访问x.internal_list[x.start + i]。您还将重载__len__ 以返回end - start。最大的问题是您将拥有内部数据结构的浅表副本,因此对原始列表的修改也会修改列表的任何部分。但这确实使某些算法(例如二进制搜索算法)的代码更简洁,因为数据结构将处理内部索引数学,而您必须显式传递所有这些。

    然后切片返回一个新的SliceList 对象,该对象具有相同的内部列表,但起点和终点不同。切片现在是 O(1)。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2021-08-18
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多