如何计算算法的时间复杂度O(n)?

时间:2019-03-10 12:38:54

标签: time-complexity

我做了什么: 我测量了处理100、1000、10000、100000、1000000个项目所花费的时间。  此处的尺寸:https://github.com/DimaBond174/cache_single_thread

然后我假设O(n)与n成正比,并针对O(n)计算其余算法。

具有处理100、1000、10000、100000、1000000项的时间度量,现在如何将算法归因于O(1),O(log n),O(n),O(n log n)或O(n ^ 2)吗?

1 个答案:

答案 0 :(得分:3)

让我们将N定义为可能的数据输入之一。根据要引用的输入,一种算法可以具有不同的Big O值,但通常只关心一个大输入。没有相关算法,您只能猜测。但是,有一些准则可以帮助您确定它是什么。

一般规则:

O(1)-程序的速度几乎不变,而与数据大小无关。为了做到这一点,程序根本不能对所讨论的数据进行循环操作。

O(log N)-当N急剧增加时,程序会以对数曲线的速度缓慢降低。为此,循环必须仅遍历一部分数据。 (例如,二进制搜索)。

O(N)-程序的速度与数据输入的大小成正比。如果对数据的每个单位执行操作,则会得到此结果。您不得具有任何嵌套循环(作用于数据)。

O(N log N)-较大的输入会大大降低程序的速度。当您在一个循环中进行了O(logN)操作嵌套(否则为O(N))时,就会发生这种情况。因此,例如,您有一个循环,对每个数据单元进行二进制搜索。

O(N ^ 2)-该程序将变慢为具有较大输入的爬网,并最终因具有足够大的数据而停滞。当您有NESTED循环时,会发生这种情况。与上面相同,但是这次的嵌套循环是O(N)而不是O(log N)

因此,尝试将循环操作视为O(N)或O(log N)。然后,每当您有嵌套时,请将它们相乘。如果循环不是嵌套的,则它们不会像这样相乘。因此,彼此分开的两个循环就是O(2N)而不是O(N ^ 2)。

还请记住,您可能在后台有循环,因此您也应该考虑一下。例如,如果您在Java中执行了类似Arrays.sort(X)的操作,那将是O(N logN)操作。因此,如果出于某种原因将其放入循环中,您的程序将比您想象的要慢得多。

希望能回答您的问题。