用于求最小数的递归算法的大O()

时间:2018-04-26 16:15:37

标签: c++ algorithm

我有以下代码我被告知findmin是O(n ^ 2),但我看不到它。

#include <iostream>
#include <cstdlib>
#include <ctime>

int findmin(const int a[], int n);
int cnt = 0;

int main (void)
{
    int num = 100;
    std::srand(std::time(nullptr));

    int arr[num];
    for (int i = 0; i < num; ++i)
        arr[i] = std::rand() % num;

    findmin(arr, num);
    std::cout << cnt;
    return 0;
}

int findmin(const int a[], int n)
{
    cnt++;
    if(n == 0)
        return a[0];

    int min;
    return a[n] < (min = findmin(a, n - 1)) ? a[n] : min;
}

在我看来,这个算法向下移动最后一个元素,抓住它并从递归返回,将它与一个元素进行比较并继续,因此在我看来这是O(2 * n)。

另一方面,如果我们有数组3,5,7,1,2,6,递归地我们下去和grub 6.在我们的路上我们发现2小于6所以我们grub 2.比我们去将它与1 grub 1进行比较并上升,将其与7,5,3进行比较。这就是O(n)。我们要经历数组n次。如果有人能向我解释,我真的很感激。

这是我的来源https://stackoverflow.com/a/50034011/5550963

2 个答案:

答案 0 :(得分:3)

O(n) ⊂ O(n^2) ∧ t(n) ∈ O(n) => t(n) ∈ O(n^2)

是的,findmin是O(n),但它也是O(n ^ 2)。

答案 1 :(得分:2)

O(n)。无论谁告诉你,都是错的。