Find()函数的复杂性是什么?

时间:2017-06-09 05:01:49

标签: c++ algorithm search time-complexity asymptotic-complexity

我有两个版本的find函数,它们都搜索数组中的整数值并返回其位置(如果存在)。在最坏的情况下,函数find1()将搜索最多 N 元素另一方面find2()函数将在最坏的情况下搜索 N / 2 元素。这是否意味着find2()函数复杂度降低为 O(N / 2)

我假设数组arr包含非重复值。

功能:find1()

int find1(int value){
    for (int i = 0; i < N; i++){
        if (arr[i] == value){
            return i;
        }
    }
    return -1;
}

功能:find2()

int find2(int value){
    for (int i = 0, j = N - 1; i <= j; i++, j--){
        if (arr[i] == value){
            return i;
        }
        if (arr[j] == value){
            return j;
        }
    }
    return -1;
}

1 个答案:

答案 0 :(得分:3)

首先,第一个版本在最坏的情况下执行 n 迭代,并且在每次迭代中执行恒定数量的操作。第二个版本在最坏的情况下执行 n / 2 迭代,并且在每次迭代中,也执行恒定数量的操作,但是更大的常量。因此,没有理由认为第一个是 O(n),第二个是 O(n / 2)

在任何情况下, O(n)= O(n / 2)。通过definition of O O(n)意味着有一个常量 c 1 ,这样每个 n&gt; ; n 1

f(n)&lt; c 1 n

类似地, O(n / 2)表示存在常量 c 2 ,因此对于每个 n&gt; n 2

f(n)&lt; c 2 n / 2 =(c 2 / 2)n

因为任何 n&gt; max(n 1 ,n 2 不等式适用于 c 1 = c 2 / 2 ,这两者中的每一个都暗示另一个。