具有O(1),O(n log n)和O(log n)复杂度的算法示例


Answers:


234

如果您要使用问题中给出的具有时间复杂度的算法/语句组示例,请查看以下清单-

O(1) 时间

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

O(n) 时间

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

  • 遍历数组
  • 遍历链接列表
  • 线性搜寻
  • 删除链接列表中的特定元素(未排序)
  • 比较两个字符串
  • 检查回文
  • 计数/桶排序,在这里您还可以找到更多这样的示例...。

O(log n) 时间

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

O(n log n) 时间

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

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

O(n^2) 时间

如果存在它们的O(nlogn)对应物,则这些算法应该是效率较低的算法。此处的通用应用程序可能是蛮力。

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

5
那n!呢?我一直在想什么常用的算法使用n !?
Y_Y 2014年

访问HashMap值以及更复杂的算法,例如LRU实现,该算法使用HashMap和双链表实现O(1)或使用PUSH / POP / MIN功能实现堆栈。Fibonacci的递归实现也属于N!。
Ruralcoder 2014年

11
我的OCD希望您将O(log n)列表切换为列表之前的O(n)列表,以使列表按从好到坏的顺序排列。哈哈:)
萨姆·伊顿

4
除非是方矩阵,否则遍历2D数组实际上是O(nxm)。
西蒙·派克

1
“旅行推销员”问题就是n的一个例子!(n阶乘)
Ju66ernaut

28

一个简单的示例O(1)可能是return 23;-无论输入如何,都将在固定的有限时间内返回。

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

一个典型的示例O(log N)是按二等分查找排序后的输入数组中的值。


28

O(1)-大多数烹饪程序都是O(1),也就是说,即使有更多的人要烹饪,也要花一定的时间(一定程度上,因为锅/锅可能空间不足并需要分开做饭)

O(登录)-在电话簿中查找某些内容。考虑二进制搜索。

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

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


2
煮烤要比迷你烤花费更多的时间:-)
paxdiablo

4
但是通常只要您的烤箱足够大,就可以同时煮两个迷你烤和一个迷你烤。
CHII

1
非常有见地!我想从名称/号码列表中编译电话或地址簿的任务可能是O(n log n)
squashed.bugaboo 2014年

10

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

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

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


4

O(1):在国际象棋中找到最佳下一个动作(或就此而言,前进)。由于游戏状态的数量是有限的,所以只有O(1):-)


5
是的,您通常可以在时间上换取空间。实际上,我是在井字游戏中这样做的,因为只有3 ^ 9个状态(如果您智能地处理旋转,则状态会更少)。但是,国际象棋的州数量却更多:-)
paxdiablo,2009年

1
问题是我将只活O(1)O(1)

3

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


1
这不是真的。如果算法的时间复杂度为O(N),则意味着对于某些常数k,其运行时间受k * N个步长的限制。“步骤”是CPU周期,汇编指令还是(简单的)C操作并不重要。常数k隐藏了这些细节。
伊戈尔·奥斯特罗夫斯基

更不用说在很多实际情况下,O(logN)算法的“ c”使其比简单的O(N)算法更糟糕。
Zed

哈哈,是的,然后用N表示图灵机磁带上的输入长度,这使得垂直分割形式的实现花费了指数时间。:-)每个领域都有自己的要求和抽象的领域。
P

3

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

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


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

2

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

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

O(logN) -计算x ^ N,

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


1

O(n log n)是您可以对任意集合进行排序的速度的上限(假设是标准的且不是高度并行的计算模型)。


0

0(logn)-二进制搜索,数组中的峰元素(可以有多个峰)0(1)-用python计算列表或字符串的长度。len()函数需要0(1)时间。访问数组中的元素需要0(1)时间。堆栈中的推入操作需要0(1)时间。0(nlogn)-合并排序。在python中排序需要花费nlogn的时间。因此,当您使用listname.sort()时,它花费了nlogn的时间。

由于冲突,在哈希表中进行笔记搜索有时会花费比固定时间更多的时间。


0

O(2 N

O(2 N)表示一种算法,每增加一个输入数据集,其增长量就会增加一倍。O(2 N)函数的增长曲线是指数的-从非常浅的位置开始,然后在气象上上升。O(2 N)函数的一个示例是斐波那契数的递归计算:

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

Tower of Hanoi会是一个更好的例子。
Ashish Duklan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.