大O符号入门指南

因此,对于那些在大学,新兵训练营或只是自学学习计算机科学的人来说,有一个主题始终是绊脚石,那就是Big O Notations。

简而言之,Big O表示法用于描述算法的性能。 Big O专门用于描述最坏情况,还有其他表示法,例如Big Theta(θ)和Big Omega(Ω)用于描述算法的平均情况和最佳情况。

但是,我们作为程序员最关心的是最坏的情况,因此我们将专注于Big O符号。 我希望本文能帮助您了解疯狂的基本知识,即BigO。

为什么是大O?

在开始理解Big O之前,我们需要知道为什么我们实际上需要BigO。

这对于面试非常重要,您需要它才能获得这份工作! 除此之外,它还提供了词汇表来讨论我们的代码如何执行以及决定采用哪种方法来解决问题。

想象我们有多个人在解决问题,每个人都有自己解决问题的方式,而且令人惊奇的是他们都可以工作,但编程不仅是解决问题,还在于有效解决问题,那么我们如何确定解决问题的方法是“ 最好 ”吗?

在这里Big O可以帮助您确定运行时间的增长速度,我们通过使用输入的大小(按标准称为“ n”)并将其与增加的操作数进行比较来做到这一点。

“最佳”甚至意味着什么? 有一个标尺或图表来描述什么是好是坏的不好吗? 我只为你买东西。

图片来源: https //i0.wp.com/www.jessicayung.com/wp-content/uploads/2016/08/screenshot-5.png?fit = 846%2C591

如果这是您第一次看到O(n ^ 2)或O(N log N)的这种疯狂语法,并且您不知道发生了什么,请不用担心,我会去做的,您一切都会好起来,现在,红色的部分不好,绿色的部分很棒!

PS:整篇文章中我都会使用JavaScript,但是您可以使用任何选择的语言。

O(1)

我们拥有的第一个大O表示法是O(1),它只是意味着无论输入大小有多大,该操作将始终在恒定的时间内执行。

在上面的示例中,该函数只是在控制台中记录给定数组的元素。 如果数组的大小增加到1000,或者说是100,000,该函数需要执行多少次操作?

由于我们只是在数组中获取单个元素,所以无论数组大小变大,花费的时间始终保持不变或O(1)。

上)

让我向您介绍最常见的Big O表示法,即O(n)表示法,让我们在一个示例的帮助下进行了解。

我们想在这里发现的是函数sumOfArray以及它的运行时间如何随着输入大小的增加而增长。 数组可能有1个项目,数组中可能有100个,1000个甚至一百万个项目。 此功能的效率如何提高?

在上面的代码中,假设数组中有10个元素,然后对于10个元素的数组,我们循环10次以获得所需的解决方案。 如果数组包含100个项目,我们将在数组中循环100次。

随着输入数量的增加,操作数量线性增加。 我们说上述代码的时间复杂度为O(n)或需要线性时间来解决此问题。 在这里, n仅表示Big O取决于输入的数量。

O(N ^ 2)

记为O(n),它执行在正比于输入鳞操作的次数。

在O(n ^ 2)的情况下,它执行的操作数与输入的平方成比例。 这在涉及嵌套循环或迭代的算法中很常见。

假设我们要查找给定数组的每对总和

在上面的示例中,对于“ i ”(外循环)的每次迭代,我们对内循环执行n次操作,对外循环进行n次操作

或简单地说,我们总共执行i * j次运算,或者,因为我们使用相同的输入,所以n * n或n ^ 2

O(2 ^ n)

我们在这里进入危险的水域,在访谈和实施中我们要避免这种情况,因为我们的算法的时间复杂度达到O(2 ^ n),因为它表示一种算法,每增加一次输入数据集,其增长速度就会加倍

该算法的增长是指数级的,假设我们有n = 2个输入,那么它将执行4次,其中n = 3,它将执行8次,依此类推。

在上面的示例中,如果输入参数n的值为10,则它将执行2 ^ 10次操作,即1024次。

O(log n)

现在我们还没有触及对数,这是因为它们很难理解。 在搜索数据集时,通常会遇到日志。

证明O(log n)的最常见示例是经典的Binary Search。

现在,二进制搜索可对一组排序的数据进行处理,并且通过在每次迭代中将输入一分为二,可用于查找元素在数据中的位置。

让我们直接看一个简单的例子来理解这个概念,而不是去编写代码。 假设我们有一本电话簿(是的,我知道它们已经过时了,但让我们考虑一下我们去过博物馆的例子)。

假设我们有一个电话簿,我们需要找到Agent Smith的联系方式

图片来源: https : //3.bp.blogspot.com/_h-QV7eIsayI/TUjTyGeMN9I/AAAAAAAABiY/bmTXD97rFQY/s1600/lunapic_129514895144669_4.jpg

除了矩阵参考,Smith以S开头,所以在电话簿的后半部分,为什么不说我们的电话簿是1000页呢?

因此,我们打开电话簿的中间,看到Smith在中间的右侧某处,而我们撕掉了左侧。

我们只是减少了一半的投入! 从1000到500个元素。

我们再次从中间打开这本书,找出史密斯在中间左侧的某个位置,然后撕掉右侧,将输入的内容从500个元素减半至250个。

在仅2次迭代中,我们删除了四分之三的输入,并保留了n / 4个输入元素;在3个迭代中,我们仅保留了n / 8个元素。

我们一直以这种方式进行操作,直到找到我们的元素为止,因此在大约10-11次迭代中,我们遍历了1000个元素的数据集并找到了我们的元素,这就是我们所说的对数时间复杂度

假设我们有一个更新的电话簿,现在电话簿中有2000页,操作总数仅增加1,因此Binary Search的时间复杂度为O(log n)

哇,好辛苦!

好吧,这当然是一件很艰辛的事情,花点时间消化所有东西,并为自己准备一些来之不易的美食,因为您应得的!

现在,本文仅涉及Big O Notation的基础知识,当然还有很多要理解的地方,但这是一个好的开始,现在您知道这些基础知识就足以深入了解😄

(最初在此处发布)

From: https://hackernoon.com/a-beginners-guide-to-the-big-o-notation-yb7332wf

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值