具有 O (1)、 O (n logn)和 O (logn)复杂性的算法实例

我们每天使用的具有 O (1) ,O (n log n)和 O (log n)复杂性的算法是什么?

235303 次浏览

软件应用程序的复杂性没有被度量,也没有用大 O 记号写。它只有在测量算法复杂度和比较同一领域的算法时才有用。最有可能的是,当我们说 O (n)时,我们的意思是“ O (n) 比较”或“ O (n)算术运算”。这意味着,你不能比较任何一对算法或应用程序。

我可以给你提供一些通用算法。

  • O (1) : 访问数组中的元素(即 int i = a [9])
  • O (n log n) : 快速排序或合并排序(平均)
  • O (log n) : 二进制搜索

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

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

O(N log N)的一个典型例子是使用好的算法(例如合并排序)对输入数组进行排序。

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

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

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

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

O (logn)-在你的电话簿中找到一些东西。想想二进制搜索。

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

哦(nlogn)-不能立即想到的东西,一个人可能每天做的是 nlogn... 除非你排序卡进行合并或快速排序!

您可以在列表中添加以下算法:

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

计算 x ^ N,

最长递增子序列

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

typedef struct _node {
struct _node *next;
struct _node *prev;
int data;
} node;




void delete(node **head, node *to_delete)
{
.
.
.
}

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

O(1)时间

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

O(n)时间

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

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

O(log n)时间

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

O(n log n)时间

通过考虑“分而治之”,引入了“ log n”因子。其中一些算法是最优化的,使用频繁。

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

O(n^2)时间

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

  • 泡泡排序
  • 插入排序
  • 选择排序
  • 遍历一个简单的2D 数组

O(n!)时间

  • 用旅行推销员问题暴力搜索法解决问题
  • 产生部分有序集的所有无限制排列;
  • 用拉普拉斯展开求行列式
  • 枚举一个集合的所有分区

0(logn)-二进制搜索,数组中的峰值元素(可以有多个峰值) 0(1)-在 python 中计算列表或字符串的长度。Len ()函数需要0(1)次。访问数组中的元素需要0(1)个时间。堆栈中的推送操作需要0(1)次。 0(nlogn)-将 sort. sort 合并到 python 中需要 nlogn 时间,所以当您使用 listname.sort ()时需要 nlogn 时间。

注意——由于冲突,在哈希表中搜索有时需要的时间超过常量。

O (2N)

O (2N)表示一种算法,其增长随着输入数据集的每次增加而加倍。O (2N)函数的增长曲线是指数型的——从很浅的地方开始,然后急剧上升。O (2N)函数的一个例子是斐波那契数的递归计算:

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