我有以下代码我被告知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次。如果有人能向我解释,我真的很感激。
答案 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)
。无论谁告诉你,都是错的。