使用渐近分析导出恒定时间复杂度 O(1)

使用渐近分析导出恒定时间复杂度 O(1)

JavaScript 算法基础——第 3 部分

在上一篇文章中,我们了解了如何 推导出算法的时间复杂度 / 大 O 使用 渐近分析 .而且,这种技术似乎是最可靠和最 标准方式推导时间复杂度 任何算法。如果您还没有阅读上一篇文章,这里是它的链接。

推导算法的时间复杂度/大 O

现在,既然我们知道如何推导出 大O 算法使用 渐近分析 ,让我们利用这些知识 计算常数时间复杂度 看看如何 O(1) 是派生的。让我们首先定义我们需要找到的示例问题 最佳算法 并推导出 大O 其中。

示例问题

编写一个函数,将一个数字作为输入,然后构建导致该数字的所有数字的总和。例如,

如果输入是 3,那么我们应该得到结果为 6(即 3+2+1)。同样,如果我们提供输入为 5,那么我们应该得到结果为 15(即 5 + 4 + 3 + 2 + 1)。

请注意 , 下面的函数不是常数时间算法,如果你想跳过这部分,你可以去“ 导出恒定时间复杂度” 本文的进一步部分

功能

好吧,下面是上述问题的最明显和最简单的解决方案。

**函数总和(n){  
 让总计 = 0;  
 for(让索引= 1;索引<= n;索引++){  
 总计 = 总计 + 指数;  
 }  
 返回总计;  
 }**

上面的函数很好的解决了我们定义的问题,也很容易理解。所以,如果我们通过 n 作为 35 ,它产生的结果为 615 分别是预期的输出。现在,让我们找出它的时间复杂度。

为了求时间复杂度, 第一步 是定义函数。所以我们将使用以下值测试函数 n = 1、n = 3 和 n = 5 .根据 渐近分析 , 我们将 遍历我们代码中的每个表达式找出它将执行多少次 .

 n=1 n=3 n=5 n=n  
 让总计 = 0; 1 1 1 1  
 for(让索引 = 1;索引 <= n;索引++)1 1 1 1  
 **总计 = 总计 + 指数;**                     **1 3 5 n**  
 返回总计; 1 1 1 1

正如我们在上面的输出中看到的,for 循环中的表达式执行 n 给定的次数 n 价值。

所以,我们得到了上述函数的模式。让我们推导出数学方程。

将时间视为 .找到方程 n 输入,

**T = 第一个表达式 + 第二个表达式 + 第三个表达式 + 第四个表达式 // 每个表达式执行的次数** **对于 n = 1,**  
 T = 1 + 1 + **1** + 1 **对于 n = 3,**  
 T = 1 + 1 + **3** + 1 **对于 n = 5,**  
 T = 1 + 1 + **5** + 1 **因此,对于 n = n,**  
 T = 1 + 1 + **n** + 1

总结所有常数,我们得到

**T = n + 3**

所以,我们得到了我们的方程,即 T = n + 3 .而且,我们知道我们不必考虑方程中的具体值,所以我们可以忽略方程中的常数值。而且,我们得到,

 T = **n**   
 = **上)**

这是一个线性方程。但是等等,我们一直在寻找常数 O(1) 时间复杂度在上述解决方案中似乎并非如此。好吧,如果我们看到增长最快的术语是 n 在这种情况下,上述等式似乎是正确的。

但是,作为程序员,我们知道问题可能存在 多种解决方案 .并且,上述案例是上述问题的解决方案之一。这意味着我们可以找到更多的解决方案,它可以有一个 恒定时间复杂度 或者也许再次 线性复杂度 甚至更糟的是,一种不同的复杂性 既不是线性的也不是恒定的 .所以,让我们找到另一个解决方案。

导出恒定时间复杂度

对于恒定的时间复杂度, ** 输入的数量不影响算法花费的时间** .所以在我们的情况下,无论我们有什么价值 1、3、5 .函数中的表达式将始终执行相同的次数。

功能

似乎我们确实有一个不同的解决方案来解决上述不使用循环的问题。有一个 数学公式 我们可以申请以获得所需的结果。数学公式是什么?

 对于给定的 **n** , **F = (n / 2) * (1 + n)**

让我们用 n = 3 来测试一下。

 F = (3/2) * (1 + 3)  
 = (1.5) * (4)  
 = **6**

所以,是的,我们可以看到上述公式适用于我们的问题。如果我们将其转换为 JavaScript 代码。它看起来像这样。

 函数总和(n){  
  **返回 (n/2) * (n+1);**  
 }

现在,让我们找出表达式执行的次数,以了解该代码运行的频率。

 n=1 n=3 n=5 n=n  
 **返回 (n/2) * (n+1);**           **1 1 1 1**

无论我们作为输入传递什么值,它都会运行一次,因为这里不涉及循环。因此,我们可以将函数方程写为,

**T = 1  
 = O(1)**

没有表达式可以运行 (n) 我们函数中的时间,因此我们没有任何增长最快的术语。因此,我们得到了我们的 大O 功能为 O(1) .那就是 恒定时间复杂度 .这就是我们如何推导出一个常数时间的方法。同样,使用相同的方法 渐近分析 我们可以得出 任何算法的时间复杂度 .

感谢您的阅读。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/30388/39251209

posted @ 2022-09-12 09:41  哈哈哈来了啊啊啊  阅读(20)  评论(0编辑  收藏  举报