两次调用的递归函数的时间复杂度

2024-04-03

考虑这段代码:

def count_7(lst):
    if len(lst) == 1:
        if lst[0] == 7:
            return 1
        else:
            return 0

    return count_7(lst[:len(lst)//2]) + count_7(lst[len(lst)//2:])

note:切片操作将被视为 O(1)。

所以,我的直觉告诉我它是 O(n*logn),但我正在努力科学地证明它。
很高兴获得帮助!


好吧,从数学上(有点;)我得到这样的东西:

T(n) = 2T(n/2) + c
T(1) = 1

推广方程:

T(n) = 2^k * T(n/2^k) + (2^k - 1) * c
T(1) = 1

n/2^k == 1 when k == logN so:

T(n) = 2^logN * T(1) + (2^logN - 1) * c

since T(1) = 1并应用对数属性

T(n) = n * 1 + (n-1) * c
T(n) = n + n * c
T(n) = n * (1+c)
T(n) = O(n)

一个线索表明这不是O(n*logn)是你不必将两个子问题结合起来。不像mergesort,当你必须组合两个子数组时,这个算法不需要对递归结果做任何事情,所以它的时间可以表示为常数c.

UPDATE:直觉背后

这个算法应该是 O(n) 因为您仅访问数组中的每个元素一次。这可能看起来并不微不足道,因为递归从来都不是微不足道的。

例如,您将问题分为两个大小一半的子问题,然后每个子问题也分为大小的一半,并且将继续下去,直到每个子问题的大小为 1。完成后,您将有 n 个大小为 1 的子问题,即n*O(1) = O(n).

从第一个问题开始到 N 个大小为 1 的问题的路径是对数的,因为在每一步中您都将其细分为两部分。但在每个步骤中,您不对结果执行任何操作,因此这不会增加解决方案的时间复杂性。

希望这可以帮助

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

两次调用的递归函数的时间复杂度 的相关文章

随机推荐

  • 错误:未指定模块(IntelliJ IDEA)

    我试图在 IntelliJ IDEA 中作为静态 Web 项目执行一个简单的程序 我是新手 正在学习使用 Node js 进行 Web 开发 我向IntelliJ IDEA官网寻求帮助 但错误还是一样 不过 我还配置了设置和项目结构 Err
  • 我怎样才能说服 IE 只显示 application/json 而不是提供下载它?

    在调试使用 AJAX 的 jQuery 应用程序时 我经常需要查看服务返回到浏览器的 json 因此 我会将 JSON 数据的 URL 放入地址栏中 这对于 ASPNET 来说很好 因为如果出现编码错误 我可以在浏览器中看到 ASPNET
  • 从 SQL 脚本调用 aspnet_regsql.exe

    如何打电话aspnet regsql exe来自 SQL 脚本 谢谢 你可以看看xp cmdshell http msdn microsoft com en us library aa260689 SQL 80 aspx xp cmdshe
  • 需要与 Microsoft.SqlServer.Management.Smo Transfer 类连接的帮助

    我试图复制所有内容 数据 索引 触发器 存储过程 在 C 中从一个数据库到另一个数据库 这是我的代码 SqlConnection connection new SqlConnection ConnectionString Server my
  • 通过减去属性来获取两个对象的差异

    我试图找出两个物体之间的差异 previousChart BWP 1 ZAR 1 3 USD 0 09324 number 1 currentChart BWP 1 ZAR 1 35 USD 0 01 number 2 期望的答案是 new
  • 如何让 Swing 应用程序感知屏幕尺寸变化?

    当我的 swing 应用程序运行时 我更改屏幕尺寸 例如从 1024x768 更改为 800x600 我可以收听任何活动以获得有关此事件的通知吗 或者 我可以每隔几秒检查一次屏幕尺寸 但 Toolkit getScreenSize 不断告诉
  • 在 Apache Spark SQL 中我们可以回滚事务吗

    我想让spark sql将数据持久化 这样的话我可以使用回滚我们已经持久化的数据吗 前任 假设我们有 3 个表 t1 t2 和 t3 t1 和 t2 表数据已成功保留 但 t3 在数据完整性级别上失败了 那么我可以回滚我已经坚持的 t1 和
  • python 中的日志精度

    以下是检查数字是否可以用幂表示的源代码 但为什么代码失败n 76 89 1 and n 76 89 我该如何解决这个错误 对于两个 n 给出x log n 2 log i 2 89 0 from math import log sqrt f
  • Amazon ElasticBeanStalk 工作线程层无法连接到 SQS

    目前 我在允许我的工作人员连接到 SQS 时遇到问题 这是日志 2014 07 21T21 37 26Z error AWS SQS Errors AccessDenied Access to the resource https sqs
  • 从 java.util.date 转换为 JodaTime

    我想转换一个java util Date to JodaTime以便在日期之间进行减法 有没有一个好的简洁方法来转换Date to JodaTime java util Date date DateTime dateTime new Dat
  • 如何在网页中动态显示 ping 输出?

    作为诊断页面的一部分 我希望用户能够运行 ping 即一个普通的 shell 命令 将 ICMP ECHO REQUST 发送到某个 IP 并在浏览器的 div 中动态显示结果 后端是 Ruby Rails 我已经在服务器端运行该命令并读取
  • 如何使用 FCM 向特定用户发送通知?

    我为 FCM 准备了接收器 可以向所有设备发送通知 gcm http googleapis com gcm send使用此链接可以发送给注册的目标用户并发布到目标设备 如下所示 json notification title sample
  • R 错误:某些组对于“qda”来说太小

    我用的是MASS qda 找到我的数据的分类器 它总是报告 某些群体对于 qda 来说太小了 是由于我用于模型的测试数据的大小吗 我将测试样本大小从 30 增加到 100 它报告了相同的错误 求助啊啊啊啊啊 set seed 1345 Al
  • Spring Integration TCP - 在发送数据之前启动消息握手

    我正在使用 MessagingGateway 将数据发送到服务器 我为出站网关配置了 AbstractClientConnectionFactory 和 ServiceActivator 为了将数据发送到我的服务器 我需要在启动连接时发送握
  • delete *p 是删除 [] p 的替代方法吗?

    以下代码来自微软文档 https learn microsoft com en us cpp cpp new operator cpp view vs 2019 int p new int 7 delete p 我觉得delete p应该在
  • QUnit 与 Jasmine? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这两个测试框架的主要区别是什么 我是测试驱动开发的新手 从头开始 QUnit 非常容易上手 因为您只需要包含两个文件和一点标记 然后就可以开始编
  • 链增量运算符

    为什么不能连锁经营 int test 5 test OR int test 5 test 此代码给出编译时错误 递增或递减运算符的操作数必须是变量 属性或索引器 我完全理解这一点 如果允许的话 将是一个完整的代码味道 几乎没有现实世界的用途
  • 当 AWS 存在时,为什么人们还使用 Heroku? Heroku 与 AWS 有何不同? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一名初级 RoR 程序员 计划使用 Heroku 部署我的应用程序 我的其他顾问朋友说 Heroku 真的很简单 很好用 唯一的问题是我仍然
  • 安装到 USB 驱动器根目录时出现 Inno Setup 错误:“您必须输入带驱动器号的完整路径”

    我想知道如何修复此类错误 您必须输入带驱动器号的完整路径 例如 C APP 或以下形式的 UNC 路径 server share 每当我尝试强制 Inno Setup Compiler 5 5 5 u 将我的东西放入其中时 就会出现这种情况
  • 两次调用的递归函数的时间复杂度

    考虑这段代码 def count 7 lst if len lst 1 if lst 0 7 return 1 else return 0 return count 7 lst len lst 2 count 7 lst len lst 2