通过简单的示例了解时间复杂性(通俗理解)

2021年4月13日10:06:39 发表评论 734 次浏览

很多学生在理解时间复杂度的概念时会感到困惑, 但是在本文中, 我们将用一个非常简单的示例来解释它:

想象一下一个有100个学生的教室, 你在其中将笔交给一个人。现在, 你想要那支笔。以下是一些查找笔的方法以及O阶数是什么。

O(n^2):你去问问班上的第一人, 如果他有钢笔。另外, 你问这个人关于教室中其他99个人是否有笔等,

这就是我们所说的O(n^2)。

O(n):去问每个学生分别是O(N)。

O(log n):现在, 我将课堂分为两组, 然后问:"是在教室的左侧还是右侧?"然后, 我将那个小组分成两部分, 然后再次询问, 依此类推。重复此过程, 直到剩下一名拥有笔的学生。这就是O(log n)的意思。

我可能需要做O(n2)搜索是否只有一位学生知道笔藏在哪位学生身上。如果一个学生拿着笔, 只有他们知道, 我会使用O(n)。如果所有学生都知道, 我会使用O(log n)搜索, 但是只会告诉我是否猜对了。

注意 :

我们对程序执行过程中输入的时间的增长率感兴趣。

另一个例子

算法/代码的时间复杂度为不等于执行特定代码所需的实际时间, 但等于语句执行的次数。我们可以通过使用time命令来证明这一点。例如, 用C++/ C++或任何其他语言编写代码以查找N个数字之间的最大值, 其中N的范围为10、100、1000、10000。然后使用以下命令在基于Linux的操作系统(Fedora或Ubuntu)上编译该代码:

gcc program.c – o program
run it with time ./program

你会得到令人惊讶的结果, 即对于N = 10你可能会获得0.5毫秒的时间, 对于N = 10, 000你可能会获得0.2毫秒的时间。另外, 你将在不同的计算机上获得不同的时间。因此, 可以说执行代码所需的实际时间取决于计算机(无论你使用的是pentium1还是pentiun5), 并且如果你的计算机位于LAN/WAN中, 它还会考虑网络负载。即使你在同一台机器上使用相同的代码也不会获得相同的时间, 这是当前网络负载的原因。

现在, 如果时间复杂度不是实际时间要求执行代码, 那么就会出现问题, 那是什么?

答案是 :

我们不考虑执行代码中每个语句所需的实际时间, 而是考虑每个语句执行多少次。

例如:

#include <stdio.h>
int main()
{
     printf ( "Hello World" );
}

输出如下:

Hello World

在上面的代码" Hello World !!!"中在屏幕上仅打印一次。因此, 时间复杂度是恒定的:O(1), 即每次使用恒定时间执行代码, 无论你使用的是哪种操作系统或机器配置。

现在考虑另一个代码:

#include <stdio.h>
void main()
{
     int i, n = 8;
     for (i = 1; i <= n; i++) {
         printf ( "Hello Word !!!" );
     }
}

输出如下:

Hello Word !!!Hello Word !!!Hello Word !!!Hello Word !!!
Hello Word !!!Hello Word !!!Hello Word !!!Hello Word !!!

在上面的代码" Hello World !!!"中将打印N次。因此, 以上代码的时间复杂度为O(N)。

资源 :Reddit

附加信息 :

例如:

让我们考虑具有以下规格的模型机:

–单处理器

–32位

–顺序执行

–1单位时间的算术和逻辑运算

–1单位时间用于赋值和返回语句

1. 2个数字之和:

Pseudocode:
Sum(a, b){
return a+b  //Takes 2 unit of time(constant) one for arithmetic operation and one for return.(as per above conventions)   cost=2 no of times=1
}

Tsum = 2 = C++= O(1)

2.列表中所有元素的总和:

Pseudocode:
list_Sum(A, n){ //A->array and n->number of elements in the array
total =0           //cost=1  no of times=1
for i=0 to n-1     //cost=2  no of times=n+1 (+1 for the end false condition)
sum = sum + A[i]   //cost=2  no of times=n 
return sum         //cost=1  no of times=1
}

Tsum = 1 + 2 *(n + 1)+ 2 * n + 1 = 4n +1 = C1 * n + C2 = O(n)

3.矩阵所有元素的总和:

对于这一点, 复杂度是一个多项式方程(方矩阵的二次方程)

矩阵nxn => Tsum = an^2+ bn + c

对于这个Tsum, 如果为 n^2 = O(n^2)

上面的代码不是伪代码, 并且不类似于任何编程语言, 因此无法在IDE中运行。

因此, 从以上我们可以得出结论, 执行时间随着使用输入进行的操作类型的增加而增加。

上面的O->被称为Big –哦, 这是一个渐近符号。还有其他渐近符号, 例如theta和Ohm。

你可以参考:了解渐近符号

本文作者提供的其他信息是Pathange Balaji Rao。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: