我们每天使用的具有 O (1) ,O (n log n)和 O (log n)复杂性的算法是什么?
软件应用程序的复杂性没有被度量,也没有用大 O 记号写。它只有在测量算法复杂度和比较同一领域的算法时才有用。最有可能的是,当我们说 O (n)时,我们的意思是“ O (n) 比较”或“ O (n)算术运算”。这意味着,你不能比较任何一对算法或应用程序。
我可以给你提供一些通用算法。
这些都是本能反应,因为这听起来像是家庭作业/面试之类的问题。如果您正在寻找更具体的东西,那就有点困难了,因为公众通常不知道流行应用程序的底层实现(当然是保留开放源码) ,也不知道这个概念通常适用于“应用程序”
O(1)的一个简单例子可能是 return 23;——无论输入是什么,它都会在一个固定的、有限的时间内返回。
O(1)
return 23;
O(N log N)的一个典型例子是使用好的算法(例如合并排序)对输入数组进行排序。
O(N log N)
一个典型的例子,如果 O(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(n)
简而言之,所有的蛮力算法,或者需要线性度的 Noob 算法,都是基于 O (n)时间复杂度的
O(log n)
O(n log n)
通过考虑“分而治之”,引入了“ log n”因子。其中一些算法是最优化的,使用频繁。
O(n^2)
如果它们的 O (nlogn)对应物存在,那么这些算法应该是效率较低的算法。这里的一般应用可能是蛮力。
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); }