大数据初学者论文
大O表示法使我们能够测量代码的时间和空间复杂度。
考虑一下for循环的示例。 您可以在5个项目的数组上运行它,它将很快运行,但是如果在10,000个项目的数组上运行它,则执行时间会慢得多。 看一个例子:
大O表示法使我们能够计算出算法要运行多长时间。 这使我们了解了一段代码将如何扩展。 它测量算法效率。
O(1)
这称为恒定时间。 每个执行的时间是一致的。 想象一下,如果您是加油站服务员。 加满汽车只需要25秒,然后该特定任务就被认为已经完成。 当天填满一辆汽车或一百辆汽车都没关系,您已经在一致的时间内填满了汽车。
因此,按照上面的示例,我们不在乎O(1),O(2)等。我们将其四舍五入为O(1),这就是说我们的操作在可伸缩性方面是一条平线。 这将花费相同的时间。 这是可预见的并且非常可扩展。 看一个例子:
上)
我们的循环示例为O(n),因为它针对输入中的每个值运行。 根据输入,运算以线性方式增加。 (n)表示输入数量。 该算法以线性时间运行。
O(n²)
假设我们要记录一组项目中的一系列对。 我们可以这样做:
一个好的经验法则是,如果看到嵌套循环,则可以使用乘法来计算符号。 因此,在上面的示例中,我们正在做O(n * n),它变为O(n²)(n为平方的O)。 这称为二次时间,这意味着每当元素数量增加时,我们就二次增加操作。
实际上,您希望避免在O(n²)中运行的代码,因为当您引入更多元素时,操作数量会大大增加。
计算大O
要计算Big O,您可以遍历每一行代码,确定它是否为O(1),O(n)等,然后最后返回您的计算。 例如,它可能是O(4 + 5n),其中4代表O(1)的四个实例,而5n代表O(n)的五个实例。
但是,有一种更简单的方法来计算此值,并且可以通过以下四个规则来完成:
- 假设最坏的情况
- 删除常数
- 使用不同的术语进行输入
- 放弃任何非优势
依次进行以下每个操作:
- 假设最坏的情况
在计算Big O时,您总是会想到最坏的情况。 例如,如果您要遍历数组并查找某个项目,则该项目可能是第一个项目,也可能是最后一个项目。 由于不确定,因此我们必须在这种情况下假设O(n)。
2. 删除常量
这有点棘手,但请耐心等待。 考虑以下代码:
我们有一个功能可以执行几项操作。 有些是O(1),例如第3行,而另一些是O(n),例如第9行。
我们可以将Big O表示为O(1 + n / 2 +100),但它确实太具体了。 我们可以删除O(1)运算,因为根据经验,与O(n)运算相比,它们可能无关紧要。 如果我们要在输入数组中提供一百万个项目,那么我们主要关心的不是O(1)的另外100个操作。
因此,我们得到O(n / 2)-随着n越来越大,将其除以2的效果会减小。 因此,最终我们对该函数的Big O表示法变为O(n)。
3. 输入的不同术语
如果我们要在同一数组中循环两次,那么我们的Big O从技术上讲就是O(2n),但是让我们删除常量,让我们剩下O(n)。 但是现在我们需要考虑输入的不同术语。 那是什么意思?
如果看上面的代码,我们可以看到现在有两个输入。 一个可能是一个项目长,另一个可能包含一百万个项目。 因此我们的函数不再是O(n),而是O(a + b)。 我们在符号中使用的n是任意的,因此我们需要在符号中反映两个输入。
在这种情况下,我们的循环不会嵌套。 如果是,那么我们的代码将是O(n²),这将是重构的潜在目标。 通常,如果存在嵌套循环,则您是在进行乘法运算而不是相加变量。
4. 删除非主要术语
看一下这段代码:
因此,我们在顶部有一个单循环,它是O(n),然后是一个嵌套循环,它是O(n²)。 因此,我们的总数为O(n +n²)。 但是,正如我们在规则2中看到的那样,我们想删除常量。 那么,这两个术语中的哪一个对我们来说更重要?
在这种情况下,我们丢弃O(n)并保留O(n²),因为这更为重要。 它是主要术语,因为它会对性能产生更大的影响。
结论
那有什么意义呢?
如果我们知道只处理少量输入,那么Big O并没有太大关系。 但是在编写代码时,应考虑其可伸缩性。
通过关注Big O,您可以展望未来,并且更有可能编写可以有效扩展的代码。 您可以开始查看代码成本,并在编写代码时做出明智的选择。
资源资源
大数据初学者论文