大 O 时间复杂度中的指数分母(分数指数)从何而来?

2024-01-14

In algorithm descirptions, I sometimes encounter time complexities that look like: O(n29/20+m7/3). I see where + and numerators in powers come from: + means successive loops, and numerators mean nested loops. For example this (useless) algorithm has O(n2+m) time complexity:

public int compute(int n, int m) {
  int answer = 0;
  for (int i=0; i<n; i++) {
    for (int j=0; j<n; j++) {
      answer += i-j;
    }
  }
  for (int i=0; i<m; i++) {
      answer -= i;
  }
  return answer;
}

但我不明白什么可以引入分母(第一个例子中的 20 和 3)。


它们来自对复杂性函数的严格分析。

一个常见的例子是矩阵乘法 http://en.wikipedia.org/wiki/Matrix_multiplication,而朴素的解决方案是O(n^3)乘法运算,有一些更快的解决方案 http://en.wikipedia.org/wiki/Matrix_multiplication#Algorithms_for_efficient_matrix_multiplication.
第一个改进是使用 7 次(而不是 8 次)乘法运算来乘以两个 2X2 矩阵。

如果您对所有子矩阵递归调用此函数,您将看到它需要O(n^log_2(7)) ~= O(n^2.807)乘法。


另一个常见的例子是斐波那契数列 http://en.wikipedia.org/wiki/Fibonacci_number使用朴素的递归解决方案:

F(x) = x > 2? F(x-1) + F(x-2) : 1

虽然你可以用更宽松的界限来明确地分析它,并说上面是O(2^n),事实上 - 更仔细的分析会告诉你,你只生成F(x)stop 子句以计算值F(x).
因为我们知道 F(x) 在O(Phi^n),并使用一些基本代数来证明非停止子句的数量是停止子句数量的常数因子,我们可以得出该解决方案运行于O(Phi^n)~=O(1.62^n),这是一个更紧的界限。


对于实际分数,您也可以使用根函数来获取它们,其中最常见的是平方根。

例如,以下是一个 Naive 实现,用于查找数字是否n是否是质数:

for i from 2 to sqrt(n):
    if n % i == 0:
         return false
return true

正如你所看到的,上面的运行在O(sqrt(n)) = O(n^(1/2)) time.

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

大 O 时间复杂度中的指数分母(分数指数)从何而来? 的相关文章

  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 使用区间树的最大区间重叠[关闭]

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

    我试图将问题陈述总结如下 Given n k和一个数组 列表 arr where n len arr and k is an integer in set 1 n inclusive 对于数组 或列表 myList 不公平总和定义为sum中
  • 用于整数分区的优雅 Python 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试编写代码来解决标准整数分区问题 维基百科 http en wikipedia org wiki Partition 28numb
  • Dijkstra 算法不生成最短路径?

    我正在使用 Dijkstra 算法解决最短路径问题 我遇到了麻烦 因为该算法应该提供最短路径 但运行该算法后 我手动得到了一条短路路径 这只是该算法的副产品吗 我尝试生成的路径是从 a gt z 这是我通过应用该算法得到的路径 在我访问的每
  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 基数首先排序最重要的还是最不重要的,哪个更快?

    我一直在研究基数排序实现 到目前为止粘贴在下面的代码 代码是用 Java 编写的 但在 C C 中应该也能正常工作 正如您从实现中看到的 我首先执行最高有效位 即整数的第 31 位 这似乎更快 因为一旦子组完成 就不再需要迭代 例如 打个比
  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 用于基本要素匹配的最坏情况 NlogN 算法

    查找两个相同大小数组的元素之间的唯一映射 https stackoverflow com questions 4411940 find the unique mapping between elements of two same size
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 序列和与 GCD

    大约一个月前 我在编程挑战中遇到了这个问题 但社论尚未发布 所以我在这里问 有一个大小为 N 的数组 A 求 A 的 K 个长度子序列的总和 GCD Example 如果 A 1 2 3 且 K 2 1 2 3 总和 1 GCD 3 1 3
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现

随机推荐

  • 将 char 指针传递给接受 char 数组引用的函数

    我正在尝试调用这个方法 define SIZE 16 void DoSomething char value SIZE 从这个方法可以看出 void BeforeDoingSomething char value int len if le
  • 具有动态角色的基于角色的访问控制

    我们有一个应该实现 rbac 的 Nest 应用程序 我根据守卫文档为其添加了一个基本的守卫和装饰器 https docs nestjs com guards https docs nestjs com guards 问题 这仅允许静态角色
  • 如何在Python中正确应用赋值运算符?

    我必须对一个大数组进行一些数学运算 例如加法 乘法 为了防止任何 MemoryError 我正在按照此答案的建议进行计算thread https stackoverflow com questions 4318615 python nump
  • 从常规数组中创建一个具有相同键和值的关联数组

    我有一个看起来像的数组 numbers array first second third 我想要一个函数 它将将此数组作为输入并返回一个如下所示的数组 array first gt first second gt second third
  • 如何在C中动态分配字符串数组?

    我是菜鸟所以别太难了 而不是这样的东西 char string NUM OF STRINGS NUM OF LETTERS 是否可以使用 malloc 动态分配数组中的字符串数量 就像为 char 指针动态分配内存一样 像这样的事情 int
  • ThreadPoolExecutor - 在队列之前使用线程

    我正在用 java 给定的 ThreadPoolExecutor 替换旧线程池 在传统线程池中 启动时会创建 60000 个线程 但在 ThreadPoolExecutor 中 使用核心线程 最大线程和 prestartAllCoreThr
  • FabricJS:始终在画布上居中对象

    是否可以始终将对象置于 Fabricjs 画布的中心 背景 我正在构建一个网络工具 可以使用 Fabricjs 轻松创建复杂的动画 我希望能够将画布大小的宽度和高度设置为 100 因此 我想将所有对象放置在中心并为其添加 X Y 偏移 当我
  • 通过关系获取相关数据

    我正在使用 laravel 5 5 13 I have App Entity其中有很多App Comment的和许多App Thumb s 现在我可以像这样轻松获取评论和拇指 public function show Entity enti
  • Rails - 如何基于布尔字段进行搜索? (MySQL 错误)

    我正在运行以下查询 projects company projects where active true order created at ASC 我收到错误 ActiveRecord StatementInvalid Mysql Par
  • 使用数据注释进行 MVC 验证 - 模型类还是视图模型类?

    将数据验证注释放在模型或视图模型中是最佳实践吗 一种方法相对于另一种方法的优点 缺点是什么 我很想知道每个人都在哪里进行验证 我目前正在模型项目中进行验证 然而我看到一些人说这不是最佳实践 就最佳实践而言 我想说 两者都不是 验证应该是分开
  • 通过 Group By Pandas 创建两个聚合列

    我是 DataFrames 的新手 我想对多列进行分组 然后对最后一列进行求和并计数 例如 s pd DataFrame np matrix 1 2 3 4 3 4 7 6 3 4 5 6 1 2 3 7 columns a b c d a
  • Jenkins 是否自动创建上游/下游?

    我正在使用詹金斯进行持续集成 我创建了单独的视图 例如服务器 A 的视图 A 服务器 B 的视图 B 等 每个视图都根据服务器的环境属性构建我的项目 但我可以看到 即使没有明确创建 也会创建不相关的上游和下游 有什么解决办法吗 在 Jenk
  • 通过Data类发送类对象

    安卓最近推出了工作经理 https developer android com reference androidx work WorkManager用于调度任务 该功能的强大功能之一工作经理 https developer android
  • 如何使用 oauth2 安全性在资源服务器中配置资源 id

    我正在尝试创建授权服务器和资源服务器 当尝试从授权服务器获取访问令牌时 其工作并获取具有以下详细信息的访问令牌 access token 5ffbc2d7 2a27 4f08 921f f7de2410b5f5 token type bea
  • Gremlin Python createIndex (Tinkerpop)

    我目前正在使用 Tinkerpop 与gremlin python 客户端 https pypi python org pypi gremlinpython 3 2 4使用默认的TinkerGraph Gremlin https tinke
  • Python 字符串匹配

    如果一个字符串包含 SUBJECT123 如何确定字符串有subject在Python中 if subject in mystring lower do something
  • Redis 键中冒号的用途是什么

    我正在学习如何在我的项目中使用 Redis 我不明白的一件事是键名称中冒号的确切用途 我见过这样的键名 users bob color blue item bag 冒号是否可以将键分类并加快查找键的速度 如果是这样 您可以在命名键时使用多个
  • 仅使用 CSS 使相邻同级元素具有相同的宽度

    我提前表示抱歉 因为出于保密原因 我无法显示我正在处理的代码 图像 但我认为我可以很简单地解释它 我有一个 h1 充当我的网页标题的元素 该标题可以根据用户所在的特定页面的标题更改长度 因此它可以说 主页 也可以说 已保存的项目 等 长度各
  • 特定版本的 HTC DESIRE HD 中 SQLite 中缺少表

    我的应用程序在 asset 文件夹中有一个 SQLite 数据库 当用户启动我的应用程序时 将创建数据库和表 这适用于许多设备 Nexus One Htc Magic SGS X10 甚至 Htc Desire HD v2 2 我的应用程序
  • 大 O 时间复杂度中的指数分母(分数指数)从何而来?

    In algorithm descirptions I sometimes encounter time complexities that look like O n29 20 m7 3 I see where and numerator