Python“;在;范围()上的运算符时间复杂性

Python“;在;范围()上的运算符时间复杂性,python,python-3.x,algorithm,python-2.7,range,python-2.x,Python,Python 3.x,Algorithm,Python 2.7,Range,Python 2.x,我有以下功能: def foo(长度,num): 返回范围内的数值(长度) 这个函数的时间复杂度是多少?注意range()在Python3上创建了一个range对象,这个函数的时间复杂度是O(1)还是O(N) 想知道不同Python版本之间的时间复杂度是否也有差异(2对3)。在范围(…)是一个对象,它不构造列表。如果您使用int作为项目执行成员检查,那么它可以非常快地完成。算法有点复杂,因为有正反两个步骤。你可以查一下。对于范围(A,b,c)中的x,一个具有正阶跃计数(c>0)的简单算法类似于

我有以下功能:

def foo(长度,num):
返回范围内的数值(长度)
这个函数的时间复杂度是多少?注意
range()
在Python3上创建了一个range对象,这个函数的时间复杂度是O(1)还是O(N)

想知道不同Python版本之间的时间复杂度是否也有差异(2对3)。

范围(…)
是一个对象,它不构造列表。如果您使用
int
作为项目执行成员检查,那么它可以非常快地完成。算法有点复杂,因为有正反两个步骤。你可以查一下。对于范围(A,b,c)中的
x,一个具有正阶跃计数(
c>0
)的简单算法类似于:

x≥ a∧x 对于负阶跃计数(
c<0
),则非常相似:

x≤ a&wedge;x>b&wedge;模(x-a,c)=0

如果在O(1)中进行比较和模运算,则为O(1)算法。实际上,对于巨大的数字,它是按数字的位数进行缩放的,因此它是一个O(logn)算法

但是,这仅适用于
int
s。实际上,如果您使用
浮点
s、
复数
、其他数值或非数值类型,则它不会执行上述计算。然后,它将返回到迭代
范围(..)
对象。这当然需要相当长的时间。如果您有一百万个元素的范围,那么它将遍历所有这些元素并最终到达范围的末尾,然后返回
False
,或者找到匹配项,然后返回
True
。将来,也许可以为某些数值类型实现一些额外的功能,但通常不能这样做,因为您可以使用工作方式不同的相等操作定义自己的数值类型

在中,
range(..)
是一个返回列表的函数。事实上:

>>> range(15)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> type(range(15))
<type 'list'>
>范围(15)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>>类型(范围(15))
为了检查一个元素是否是列表的成员,它将在列表上迭代,并检查所有项的相等性,直到找到相等的元素,或者列表用尽。如果我们考虑检查两个项目是否等于常数,那么这需要线性时间O(n)。事实上,对于巨大的数字,检查两个数字是否相等,与“位数”成线性比例,因此O(logm)与m是该数字的值


还有一个
xrange(…)
对象,但这不会检查上面演示的技巧的成员身份。

如果该项是
int
,则在Python-3.x中需要O(1),在Python-2.x中需要O(n)。对于
float
s,两者都是O(n)。太好了!你想回答这个问题,我可以把它标记为正确吗?相关-@geckos这里没有涉及生成器。@geckos,当你从范围(…)创建一个集合时,它已经是O(n)复杂度了,因为范围(…)的所有元素都将存储在内存中。