确定算法的运行时间以比较两个阵列

时间:2011-02-06 05:58:36

标签: algorithm runtime

我想知道如何确定以伪代码编写的算法的运行时间,以便我可以熟悉运行时。例如,您如何知道比较2个数组的算法的运行时间,以确定它们是否不相同?

数组1 = [1,5,3,2,10,12]数组2 = [3,2,1,5,10,12] 所以这两个数组不一样,因为它们的排序方式不同。

我的伪代码是:

1)将当前指针设置为第一个数组中的第一个数字 2)将第二指针设置为第二阵列中的第一个数字
3)while(current pointer!=“”)与其他数组中的相同位置元素进行比较 4)if(当前指针==第二指针)
    将当前指针移动到下一个数字         将第二个指针移动到下一个数字

5)else(输出数组不相同) 结束循环

所以我首先假设我的代码是正确的。我知道第4步只执行一次,因为显示数组只需要1次匹配就不一样了。因此,步骤4仅需要恒定时间(1)。我知道第1步和第2步也只执行一次。

到目前为止,我知道运行时间是3 +? (?是循环本身的运行时间)

现在我迷失在循环部分。循环是否运行n次(n是数组中的数字数?),因为最坏的情况可能是每个数字匹配?我想以正确的方式运行时间吗?

如果有人可以帮忙解决这个问题,我会很感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

您所询问的内容称为算法的时间复杂度。我们使用所谓的 Big-O 表示法来讨论算法的时间复杂度。

Big-O表示法是一种方法,用于讨论我们的算法相对于算法输入的大小所采用的步骤的近似步数,在最大可能的情况下输入该大小。< / p>

您的算法在O(n)时间内运行(发音为“n的大哦”或“n次”或有时我们只说“线性时间”)。

您已经知道步骤1,2和4都以相对于数组大小的固定步数运行。我们说这些步骤在O(1)时间(“常数时间”)运行。

让我们考虑第3步:

如果数组中有n个元素,那么步骤3需要在最坏的情况下进行n次比较 。所以我们说第3步需要O(n)时间。

由于算法在步骤3中花费O(n)时间,而所有其他步骤都更快,我们说算法的总时间复杂度为O(n)

当我们写O(f)时,其中f是某个函数,我们的意思是算法在f的常数因子内运行,以获得较大的值。

以您的算法为例。对于大的n值(比如n = 1000),算法不需要恰好n步。假设比较需要5个指令才能在您选择的计算机上完成算法。 (它可以是任何常数,我只是选择5例如。)并且假设步骤1,2,4各自采用一些常数步骤,总共10条指令用于所有这三个步骤。

然后,对于n = 1000,您的算法将采用:

步骤1 + 2 + 4 = 10条指令。第3步= 5 * 1000 = 5000条指令。

这是总共5010条指令。这是大约5 * n条指令,这是n的常数因子,这就是为什么我们说它是O(n)

对于非常大的n,f = 5*n + 10中的10变得越来越不重要,5也是如此。因此,我们只需将f is within a constant factor of n for large n简化为f is in O(n)

通过简单地将f1写为{{1},通过这种方式可以很容易地描述这样的想法,即当{n}足够大时,像f1 = n^2 + 2这样的二次函数总是大于f2 = 10000*n + 50000之类的线性函数。 }和f2为O(n)

答案 1 :(得分:1)

你是对的。运行时间为O(n),其中n是数组中元素的数量。每次向数组添加1个元素时,在最坏的情况下,您必须再执行1次循环。