Python range() 上的“in”运算符时间复杂度

2024-02-19

我有以下功能:

def foo(length, num):
  return num in range(length)

这个函数的时间复杂度是多少?注意到range()在Python 3上创建一个Range对象,这个函数的时间复杂度是O(1)还是O(N)?

我想知道不同 Python 版本之间的时间复杂度是否存在差异(2 与 3)。


In python-3.x /questions/tagged/python-3.x a range(..)是一个对象,它不构造列表。如果您执行成员检查int作为项目,那么它可以非常快地做到这一点。该算法有点复杂,因为有正向步骤和反向步骤。你可以查一下[GitHub] https://github.com/python/cpython/blob/3.7/Objects/rangeobject.c#L338。具有正步数的简单算法(c > 0) for x in range(a, b, c)是这样的:

x ≥ a &楔形; x .

对于负步数 (c < 0) 非常相似:

x≤a&楔形; x > b &楔形; mod(x-a, c) = 0.

如果我们考虑进行比较O(1)并计算模数,它是O(1)算法。实际上,对于巨大的数字,它会按数字的位数进行缩放,因此它是O(log n)算法。

然而这仅适用于ints。事实上,如果你使用floats, complex、其他数值或非数值类型,则不执行上述计算。然后它将回退到迭代range(..)目的。这当然会花费相当长的时间。如果您有一百万个元素的范围,它将迭代所有这些元素并最终到达范围的末尾,并返回False,或找到匹配项,然后返回True。将来,也许可以为某些数字类型实现一些额外的功能,但通常不能这样做,因为您可以使用不同工作方式的相等运算来定义自己的数字类型。

In python-2.x /questions/tagged/python-2.x, range(..)是一个返回列表的函数。的确:

>>> range(15)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> type(range(15))
<type 'list'>

为了检查某个元素是否是列表的成员,它将迭代列表,并检查所有项目的相等性,直到找到相等的元素,或者列表已耗尽。如果我们考虑检查两项是否等于常数时间,那么这需要线性时间O(n)。实际上,对于巨大的数字,检查两个数字是否相等,与“位数”成线性比例,因此O(log m) with m该数字的值。

python-2.x /questions/tagged/python-2.x has an xrange(..)也反对,但这不会使用上述演示的技巧检查成员资格。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python range() 上的“in”运算符时间复杂度 的相关文章

随机推荐

  • 如何使用位图将图像分享到社交媒体?

    我需要从 RecyclerAdapter 共享图像 因为该图像最初并不存在 即使用适配器在 Activity 中加载 如何将位图分享到社交媒体 每次我在应用程序中单击共享时 都会显示 没有应用程序可以执行此操作 feedItemView s
  • 删除 ToolStripControlHost 周围的空白

    我正在尝试删除 toolstripcontrolhost 控件周围的空白 该控件在上下文菜单中托管日历控件 请参阅附图和代码 VB Dim menuItem As ToolStripMenuItem New ToolStripMenuIte
  • 在 VBA-Selenium 中按 Enter 和向下键

    我想在 vba selenium 中编写一段代码以按 Enter 和向下箭头键 所以你可以帮助我吗 我已经尝试过下面的代码 但它不起作用 selenium keyDownNative 40 For Down Arrow key seleni
  • 如何在Azure VM上推出最新的.net框架?

    我使用 azure 门户创建了一个 Azure VM windows sever 2016 它安装了 net 4 6 2 现在我想在其上推出最新的可用 net 框架 4 7 4 7 1 一种选择是下载所需的框架并将其安装在虚拟机上 我确信应
  • 子进程的 waitpid 未成功

    我正在使用启动一个进程execv并让它写入文件 我同时启动一个线程来监视文件 以便它的大小不超过使用的特定限制stat st size 现在 当达到极限时 我waitpid对于子进程 但这会引发错误 并且我在后台启动的进程变成僵尸进程 当我
  • 同一个表上的内连接和左连接

    我有两个表 A 和 B 其中有两列 x 和 y 我想在 x 上内连接 A 和 B 但只保留 A 列 y 的值 左连接 我正在寻找一种组合两个 y 列的方法 不能只在 select 语句中指定 A y 我怎样才能做到这一点 Example T
  • Knockout.js:更新绑定?

    当我在 ko applyBindings 之后将任何新元素注入 DOM 时被调用 那么淘汰赛将无法识别这些新元素 我可以理解为什么会发生这种情况 它们只是没有被淘汰索引 因此 起初我认为在添加新元素后再次调用 ko applyBinding
  • 深入理解MVC.net中的延迟加载和错误处理

    我试图对以下问题写出完整详细的答案 为什么 Dispose 有效 而不是 using var db new DataContext https stackoverflow com questions 23110719 why does di
  • 为什么 WordPress 被认为编程很差劲? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • .NET 中的 ApplicationException 有何用途?

    为了引发异常 我通常使用内置异常类 例如ArgumentNullException and NotSupportedException 但是 有时我需要使用自定义异常 在这种情况下我会写 class SlippedOnABananaExce
  • 将所有内容都纳入范围内会影响 Angular 性能吗?

    我想知道是否有人对在模块内部使用 scope 与普通 JavaScript 对象有什么建议 例如 我在控制器中有一些变量 为了方便起见 我将它们附加到 scope 但它们可能只是控制器内的常规对象 没有任何功能差异 我的问题是 当 Angu
  • 颠覆和依赖

    我正在尝试为以下问题找到可行的策略 我们有几个依赖于我们框架的网络项目 所有内容都存储在我们的 SVN 中 并拥有自己的项目和所有必要的目录结构 主干 标签 分支 在一个示例中 我们有项目 webprj01 和 webprj02 并且我们有
  • 如何将 routerLinkActive 与空 routerLink 一起使用

    我有以下选项卡栏链接 第一个应该是空的
  • 如何使用 POCO 通过 HTTP 基本身份验证进行 HTTP Post?

    我正在尝试使用 POCO 进行 HTTP 基本身份验证 明文用户名和密码 的 HTTP Post 我找到了一个 Get 的示例并尝试修改它 但作为一个菜鸟 我认为我已经破坏了它的实用性 有人知道怎么做吗 是的 我已经看到了另一个关于此的问题
  • 使用 ctest/cmake 测试非零退出状态

    感兴趣的应用程序是一个编译器 当它在源代码中遇到错误时 它会返回非零退出代码 编译器的单元测试由故意触发错误的小片段组成 用于添加测试的函数是 function add compiler test test name options add
  • 检测 AngularJS 中自定义过滤器何时完成[重复]

    这个问题在这里已经有答案了 我有一个自定义过滤器函数 我正在调用 ng repeat 指令 div app title div 这显然会影响 appList 中每个应用程序的 assetFilter 函数 过滤完成后 我想运行另一个函数 如
  • Spring AOP中代理的使用

    我正在读一本书 其中谈到启用AspectJSpring AOP 的支持 下面是书中的一段话 要在 Spring IoC 容器中启用 AspectJ 注释支持 您只需定义一个空的 bean 配置文件中的 XML 元素 aop aspectj
  • Azure 表存储 API 是否缓存结果?

    当我对 Azure 表存储多次运行相同的查询时 它是否使用缓存并加速后续查询 换句话说 它是否缓存 HTTP 响应 Azure存储肯定使用缓存 http www scribd com doc 73458371 Windows Azure S
  • 单击 web.py python 中的按钮时下载/导出 csv 文件

    我正在使用Pythonweb py构建小型网络应用程序的框架 它由一个 Home page以 url 作为输入 Reads anchor text and anchor tags从中 将其写入 csv 文件并下载 当我们点击 a 时 就会发
  • Python range() 上的“in”运算符时间复杂度

    我有以下功能 def foo length num return num in range length 这个函数的时间复杂度是多少 注意到range 在Python 3上创建一个Range对象 这个函数的时间复杂度是O 1 还是O N 我