如何计算更复杂算法的阶数(大O)(例如快速排序)

2023-12-26

我知道有很多关于大O表示法的问题,我已经检查过了:

  • 大O的简单英语解释 https://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o
  • 大O,你是如何计算/近似的? https://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it
  • 大O记法作业——代码片段算法分析? https://stackoverflow.com/questions/216796/big-o-notation-homework-code-fragment-algorithm-analysis

仅举几例。

我凭“直觉”知道如何计算n, n^2, n!所以,但是我完全不知道如何计算它的算法log n , n log n, n log log n and so.

我的意思是,我知道快速排序是n log n(平均)..但是,why?合并/梳理等也是如此。

有人能用不太数学的方式向我解释一下你是如何计算这个的吗?

主要原因是我即将接受一次大型采访,我很确定他们会要求这类东西。我已经研究了几天了,每个人似乎都对为什么冒泡排序是 n^2 有解释,或者对我来说不可读的解释维基百科 http://en.wikipedia.org/wiki/Big_O_notation


对数是指数的逆运算。取幂的一个例子是在每一步将项目数加倍。因此,对数算法通常将每一步的项目数量减半。例如,二分查找就属于这一类。

许多算法需要对数个大步骤,但每个大步骤都需要 O(n) 个工作单元。归并排序就属于这一类。

通常,您可以通过将此类问题可视化为平衡二叉树来识别它们。例如,这里是合并排序:

 6   2    0   4    1   3     7   5
  2 6      0 4      1 3       5 7
    0 2 4 6            1 3 5 7
         0 1 2 3 4 5 6 7

顶部是输入,作为树的叶子。该算法通过对上面的两个节点进行排序来创建一个新节点。我们知道平衡二叉树的高度是 O(log n),因此有 O(log n) 个大步长。然而,创建每个新行需要 O(n) 的工作。 O(n) 工作的 O(log n) 个大步骤意味着归并排序总体上是 O(n log n) 。

一般来说,O(log n) 算法如下所示。他们在每一步都会丢弃一半的数据。

def function(data, n):
    if n <= constant:
       return do_simple_case(data, n)
    if some_condition():
       function(data[:n/2], n / 2) # Recurse on first half of data
    else:
       function(data[n/2:], n - n / 2) # Recurse on second half of data

虽然 O(n log n) 算法看起来像下面的函数。他们还将数据分成两半,但他们需要考虑两半。

def function(data, n):
    if n <= constant:
       return do_simple_case(data, n)
    part1 = function(data[n/2:], n / 2)      # Recurse on first half of data
    part2 = function(data[:n/2], n - n / 2)  # Recurse on second half of data
    return combine(part1, part2)

其中 do_simple_case() 花费 O(1) 时间,而 merge() 花费不超过 O(n) 时间。

该算法不需要将数据精确地分成两半。可以分成三分之一和三分之二,那就可以了。对于平均情况的性能,将其平均分成两半就足够了(如快速排序)。只要递归是在 (n/something) 和 (n - n/something) 的片段上完成的,就可以了。如果将其分解为 (k) 和 (n-k),那么树的高度将是 O(n) 而不是 O(log n)。

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

如何计算更复杂算法的阶数(大O)(例如快速排序) 的相关文章

  • Dijkstra 算法不生成最短路径?

    我正在使用 Dijkstra 算法解决最短路径问题 我遇到了麻烦 因为该算法应该提供最短路径 但运行该算法后 我手动得到了一条短路路径 这只是该算法的副产品吗 我尝试生成的路径是从 a gt z 这是我通过应用该算法得到的路径 在我访问的每
  • Numpy:具有特定条件的线性系统。无负解

    我正在使用 numpy 编写 Python 代码 在我的代码中 我使用 linalg solve 来求解 n 个变量中的 n 个方程的线性系统 当然 解决方案可以是积极的 也可以是消极的 我需要做的是始终有正解或至少等于 0 为此 我首先希
  • 用于基本要素匹配的最坏情况 NlogN 算法

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

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

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 神经网络的层和神经元

    我想更多地了解神经网络 我正在开发一个 C 程序来制作神经网络 但我坚持使用反向传播算法 很抱歉没有提供一些工作代码 我知道有很多库可以用多种语言创建神经网络 但我更喜欢自己制作一个 关键是我不知道要实现特定目标 例如模式识别或函数近似或其
  • 素数生成器算法

    我一直在尝试解决素数生成算法的SPOJ问题 这是问题 彼得想为他的密码系统生成一些素数 帮助 他 你的任务是生成两个给定之间的所有素数 数字 Input 输入以单行中测试用例的数量 t 开始 t Output 对于每个测试用例 打印所有素数
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 解释 Vinay Deolalikar 的证明 P != NP [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近有一个paper https www win tue nl gwoegi P versus NP Deolalikar pdf惠普实验
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait

随机推荐