Algorithm 确定比较两个数组的算法的运行时间

Algorithm 确定比较两个数组的算法的运行时间,algorithm,runtime,Algorithm,Runtime,我想知道如何确定用伪代码编写的算法的运行时,以便熟悉运行时。例如,您如何知道一个算法的运行时间是多少,该算法将比较两个数组以确定它们是否不同 数组1=[1,5,3,2,10,12]数组2=[3,2,1,5,10,12] 所以这两个数组不一样,因为它们的顺序不同 我的伪代码是: 1) 将当前指针设置为第一个数组中的第一个数字 2) 将第二个指针设置为第二个数组中的第一个数字 3) 而(当前指针!=“”)与其他数组中的相同位置元素进行比较 4) 如果(当前指针==第二个指针) 将当前指针移动到下一个

我想知道如何确定用伪代码编写的算法的运行时,以便熟悉运行时。例如,您如何知道一个算法的运行时间是多少,该算法将比较两个数组以确定它们是否不同

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

我的伪代码是:

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

5) else(数组不相同的输出) 端环

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

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

现在我迷路了。循环是否运行n次(n是数组中的数字数?),因为最坏的情况可能是每个数字都匹配?我是否以正确的方式考虑运行时

如果有人能帮上忙,我会很感激的


谢谢

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

您所问的问题称为算法的时间复杂性。我们讨论使用所谓的Big-O符号的算法的时间复杂度

Big-O表示法是一种用于讨论我们的算法相对于算法输入大小所采取的步骤的近似数量的方法,对于该大小的输入,在最坏的情况下

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

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

所以让我们考虑第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,10英寸
f=5*n+10
变得越来越不重要,5英寸也变得越来越不重要。出于这个原因,我们简单地将函数简化为
f在n的常数因子内,对于大的n
,我们说
f在O(n)


通过这种方式,很容易描述这样一种想法,即当n足够大时,像
f1=n^2+2
这样的二次函数总是比像
f2=10000*n+50000
这样的线性函数大,只需简单地将f1写成
O(n)
而将f2写成
O(n^2)
,我编辑了这个问题——你有两个步骤2,但是我太累了/改变了,弄不清其他的东西——确保这个描述仍然正确+1。我想补充一下你的答案@埃里克。您在那里的“3”通常被忽略。在Big Oh中,我们只对重要的数量感兴趣。“3”在这个无关紧要的数字中。@Shiv Kumar,对不起,你指的是哪一个“3”?我的评论(对于更多的Eric来说)现在无关紧要了,因为你已经添加了关于无关紧要的数字的全部解释。在Eric的问题中,他说:“到目前为止,我知道运行时间是3+?(?是循环本身的运行时间)”。这就是我指的“3”。@希夫·库马尔,啊,现在说得通了。