如何确定以下算法的时间复杂度(big-Oh表示法)?

时间:2013-12-22 13:01:02

标签: java

我在这里是全新的,我正在与之抗争的是理解Big-oh符号概念。最近我在我的学校开始了“数据结构和算法”课程,而Big-oh这个词对我来说非常不合情理。我在网上搜索了很多关于这个主题的内容,但没有一个解释让我满意。 然而,我认为用一个例子理解符号可能比用简单的英语解释它好得多。

以下两个for循环我作为练习目的。 你能解释那些时间的复杂性(用大符号表示)并解释它是如何形成的吗?

(a)中

for (int i = 1; i <= n; i+=2) {
    for (int j = 1; j <= n; j++)
        int temp = i * j;
}

(b)中

for(int i = 1; i <= n; i*=2){
    for (int j = 1; j <= n; j++){
        int temp = i * j;
}

2 个答案:

答案 0 :(得分:6)

查找行int temp = i*j执行的总次数,作为输入参数n的函数。从该函数中丢弃除了最快上升项之外的所有内容,并从中删除任何线性系数。您只对该术语的感兴趣(常数,对数,线性,二次, n - 幂,指数等)

在(a)中,这将是n 2 。在(b)中它将是n * log(n)。这是你的大O复杂性。


作为技术旁注,在即时编译之后,HotSpot JVM上执行的代码的实际时间复杂度将,因为编译器可以毫不费力地实现代码没有效果。它将完全删除它。

答案 1 :(得分:0)

循环体不是很有意义,但让我们忽略......

A)

你做(n / 2)* n次操作。如果你知道哦符号是什么,很明显。为O(n ^ 2)。

b)中

您执行大约log2(n)* n次操作(您必须将n加倍才能增加i处理的数量)。 O(nlogn)。

你知道吗,怎么得到这个&lt;