【问题标题】:Examples of Algorithms which has O(1), O(n log n) and O(log n) complexities具有 O(1)、O(n log n) 和 O(log n) 复杂度的算法示例
【发布时间】:2009-10-20 05:33:17
【问题描述】:

我们日常使用的算法有哪些复杂度为 O(1)、O(n log n) 和 O(log n)?

【问题讨论】:

  • 为什么是维基?这既不是民意调查,也不是主观的。她想要大 O 属性的具体示例。
  • Wiki 因为它没有一个正确答案,它有多个答案。
  • 维基百科也有一个很好的列表。 en.wikipedia.org/wiki/Time_complexity

标签: algorithm time-complexity


【解决方案1】:

如果您想要问题中给出的具有时间复杂度的算法/语句组示例,这里有一个小列表 -

O(1)时间

  • 访问数组索引 (int a = ARR[5];)
  • 在链表中插入节点
  • 在堆栈上推送和弹出
  • 从队列中插入和删除
  • 找出存储在数组中的树中节点的父节点或左/右子节点
  • 跳转到双向链表中的下一个/上一个元素

O(n)时间

简而言之,所有需要线性的蛮力算法或 Noob 算法都基于 O(n) 时间复杂度

  • 遍历数组
  • 遍历链表
  • 线性搜索
  • 删除链接列表中的特定元素(未排序)
  • 比较两个字符串
  • 检查回文
  • 计数/桶排序 在这里你也可以找到一百万个这样的例子......

O(log n)时间

  • 二分查找
  • 在二叉搜索树中查找最大/最小数
  • 基于线性函数的某些分而治之算法
  • 计算斐波那契数 - 最佳方法 这里的基本前提是不使用完整的数据,并在每次迭代中减少问题规模

O(n log n)时间

考虑到分而治之,引入'log n'因子。其中一些算法是最佳优化算法,并且经常使用。

  • 合并排序
  • 堆排序
  • 快速排序
  • 基于优化 O(n^2) 算法的某些分而治之算法

O(n^2)时间

如果存在 O(nlogn) 对应的算法,这些算法应该是效率较低的算法。这里的一般应用可能是蛮力。

  • 冒泡排序
  • 插入排序
  • 选择排序
  • 遍历一个简单的二维数组

O(n!)时间

  • 通过蛮力搜索解决旅行商问题
  • 生成部分有序集合的所有无限制排列;
  • 用拉普拉斯展开式求行列式
  • 枚举集合的所有分区

【讨论】:

  • n! 呢?我一直想知道什么常见的算法使用n!?
  • 访问 HashMap 值以及更复杂的算法,例如使用 HashMap 和双向链表实现 O(1) 的 LRU 实现或使用 PUSH/POP/MIN 功能实现堆栈。斐波那契的递归实现也属于 N!。
  • 我的强迫症希望您将O(log n) 列表切换到O(n) 列表之前,以便列表按从好到坏的顺序排列。哈哈:)
  • 遍历一个二维数组实际上是 O(n x m),除非它是一个方阵。
  • “旅行推销员”问题就是 n! (n阶乘)以及
【解决方案2】:

O(1) - 大多数烹饪程序都是 O(1),也就是说,即使有更多的人要为更多的人做饭,它也需要固定的时间(在一定程度上,因为你可能会用完你的锅/锅,需要分开做饭)

O(logn) - 在你的电话簿中找到一些东西。想想二分查找。

O(n) - 阅读一本书,其中 n 是页数。这是阅读一本书所需的最短时间。

O(nlogn) - 无法立即想到一个人每天可能会做的事情是 nlogn...除非您通过合并或快速排序来对卡片进行排序!

【讨论】:

  • 烤肉比迷你烤肉要花更长的时间 :-)
  • 但通常烹制两份迷你烤肉和一份迷你烤肉需要相同的时间,前提是你的烤箱足够大,可以放进去!
  • 非常有见地!我想从姓名/号码列表中编译电话或地址簿的任务可能是 O(n log n)
【解决方案3】:

O(1) 的一个简单示例可能是return 23;——无论输入什么,它都会在固定的有限时间内返回。

O(N log N) 的典型示例是使用良好算法(例如归并排序)对输入数组进行排序。

一个典型的例子,如果O(log N) 将在一个排序的输入数组中按二等分查找一个值。

【讨论】:

    【解决方案4】:

    我可以为您提供一些通用算法...

    • O(1):访问数组中的元素(即 int i = a[9])
    • O(n log n):快速或归并排序(平均)
    • O(log n):二分查找

    这些都是直觉反应,因为这听起来像是作业/面试之类的问题。如果您正在寻找更具体的东西,那就有点困难了,因为一般公众不知道流行应用程序的底层实现(当然是保留开源),这个概念通常也不适用于“应用程序”

    【讨论】:

      【解决方案5】:

      O(1):在国际象棋(或围棋)中找到最好的下一步。由于游戏状态的数量是有限的,它只有 O(1) :-)

      【讨论】:

      • 是的,您通常可以用时间换取空间。实际上,我已经为井字游戏做到了这一点,因为只有 3^9 个状态(如果您巧妙地处理旋转,则更少)。然而,国际象棋有更多的状态:-)
      • 问题是我只活O(1)纳秒,你肯定知道哪个O(1)会先出现...
      【解决方案6】:

      O(1) - 从双向链表中删除一个元素。例如

      typedef struct _node {
          struct _node *next;
          struct _node *prev;
          int data;
      } node;
      
      
      void delete(node **head, node *to_delete)
      {
          .
          .
          .
      }
      

      【讨论】:

        【解决方案7】:

        软件应用程序的复杂性没有被衡量,也不是用大 O 表示法编写的。它仅用于衡量算法复杂度并比较同一域中的算法。最有可能的是,当我们说 O(n) 时,我们的意思是它是“O(n) comparisons”或“O(n) 算术运算”。这意味着,您无法比较任何一对算法或应用程序。

        【讨论】:

        • 这不是真的。如果一个算法的时间复杂度为 O(N),这意味着它的运行时间以 k * N 步为界,对于某个常数 k。 “步骤”是 CPU 周期、汇编指令还是(简单)C 操作并不重要。这些细节被常数 k 隐藏了。
        • 更不用说在许多实际情况下,O(logN) 算法的“c”比更简单的 O(N) 算法更糟糕。
        • 哈哈,是的,然后我们用 N 表示图灵机磁带上的输入长度——这使得垂直形式的除法需要指数级的时间来实现。 :-) 每个领域都有自己的要求和自己的抽象领域。
        【解决方案8】:

        您可以将以下算法添加到您的列表中:

        O(1) - 判断一个数是偶数还是奇数;使用 HashMap

        O(logN) - 计算 x^N,

        O(N Log N) - 最长递增子序列

        【讨论】:

          【解决方案9】:

          O (n log n) 是众所周知的对任意集合进行排序的速度上限(假设是标准而非高度并行的计算模型)。

          【讨论】:

            【解决方案10】:

            0(logn)-二分查找,数组中的峰元素(可以有多个峰) 0(1)-在 python 中计算列表或字符串的长度。 len() 函数需要 0(1) 时间。访问数组中的元素需要 0(1) 时间。堆栈中的推送操作需要 0(1) 时间。 0(nlogn) - 合并排序。在 python 中排序需要 nlogn 时间。所以当你使用 listname.sort() 时,它需要 nlogn 时间。

            由于冲突,在哈希表中进行笔记搜索有时会花费超过恒定时间。

            【讨论】:

              【解决方案11】:

              O(2N)

              O(2N) 表示一种算法,其增长随着输入数据集的每个添加而翻倍。 O(2N) 函数的增长曲线是指数型的 - 从非常浅的开始,然后迅速上升。 O(2N) 函数的一个例子是递归计算斐波那契数:

              int Fibonacci (int number)
              {
              if (number <= 1) return number;
              return Fibonacci(number - 2) + Fibonacci(number - 1);
              }
              

              【讨论】:

              • Tower of Hanoi 会是一个更好的例子。
              猜你喜欢
              • 1970-01-01
              • 2011-12-12
              • 2015-05-25
              • 1970-01-01
              • 2011-07-09
              • 2015-06-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多