我对解决时间复杂性感到困惑。我了解如何确定算法是O(1)
还是O(n)
等。但是,您是否总是手动求解运行时间,还是该算法输出运行时间?我不确定O(1)
的算法会做什么?
在练习中,我需要测量不同大小的数组上的时间复杂度。绘制运行时间与输入大小的关系图。
答案 0 :(得分:1)
让我们考虑最坏情况下的复杂度(符号“ O”),并且由于时间复杂度,我们实际上并没有计算时间,因为它可能因问题而异,那么如何确定哪种算法更好呢? 思考过程是,运行时间根据不同的样本量“ n”而变化。现在问题来了,它在多大程度上取决于n。在最坏/最好/平均的情况下,根据我们给出的
值,它需要执行多少扫描n , log(n) , nlog(n)....
对于任何问题,让我们说说它是图形问题,并在最坏的情况下询问您的代码将对每个节点进行多少次迭代,然后就可以达到复杂性。
2n , 3n are regarded as n complexity why? , because our initial assumption is n>>
学习的唯一方法是问自己这个问题,并在纸上推论出来,然后尝试匹配,慢慢地,您将能够看到算法中的模式,从而弄清楚它。
答案 1 :(得分:1)
O()
表示法是在最坏的情况下将执行多少条指令。假设您有一个程序,其中有以下循环-
for(int i = 0; i < n; i++)
{
//some operation
}
因此,此循环将运行n
次。因此,时间复杂度将为O(n)
。
现在假设您的程序有两个for循环-
for(int i = 0; i < n; i++)
{
//some operation
}
for(int i = 0; i < n; i++)
{
//some operation
}
因此,时间复杂度将为O(n+n)
或O(2n)
。但是在渐近符号或O()
符号中,我们通常会忽略任何常量部分。因此,我们将简单地说时间复杂度为O(n)
。
现在,进一步下潜。假设您有以下程序-
for(int i = 0; i < n; i++)
{
for(int i = 0; i < n; i++)
{
//some operation
}
}
因此,让我们计算最终将运行多少条指令。是n*n
或n^2
。因此,时间复杂度将为O(n^2)
。同样,如果存在三个或更多的嵌套循环,我们将简单地计算最终将运行多少条指令。
现在O(1)
是什么? -您现在应该了解-如果指令总数为1或任何其他常数,则为O(1)
。
O(logn)
怎么样-以二进制搜索为例。在二进制搜索中,我们将数组切成两半。因此,在数学上,二进制搜索可以在长度数组上运行的最长时间为logn
。因此我们的时间复杂度为O(logn)
这些是一些基本技术。显然有很多变化。但是要点是-在最坏的情况下会运行多少条操作/指令。
答案 2 :(得分:0)
时间复杂度计算实际上是手动的。您正在研究一种算法,并弄清了您编写的该算法的运行时复杂性。该算法不输出时间复杂度。
正如您已经提到的,您了解如何确定算法的复杂性,我认为在练习中需要绘制一个类似于以下内容的图形。
本练习可能希望您绘制一个图形,该图形根据输入大小,算法的执行方式(即,需要花费多少时间)显示。
运行时间复杂度不过是根据给定输入大小对算法的性能进行度量或预测。对于O(1)
,您的算法将始终在固定时间内提供所需的结果,而与输入大小无关。
了解O(1)的运行时间:
例如,我编写了一个O(1)
算法,该算法需要5秒钟才能为单个输入提供结果。现在,如果为该算法提供了100个数据点作为输入(即输入大小为100),则该算法将花费5秒钟。然后,如果输入大小为99999,则仍需要5秒钟才能提供预期的结果。
了解O(n)运行时间:
现在让我们举一个O(n)
算法的例子-单个输入的预期输出为2秒。现在,输入大小的增加将增加此算法的运行时间。例如,如果此处输入大小为10,则运行时间将为20秒,对于500输入大小,运行时间将为1000秒。
希望您能明白。您只需要绘制一个图形即可显示根据输入大小运行算法所需的时间。
希望有帮助!