我怎样才能计算这样一个程序的复杂性
How can I calculate the complexity of a program like this
所以我一直在研究算法的复杂性,但是这个我看不懂。
如果我使用一个全局变量来检查函数被调用了多少次,它将计算数字 11 然后说复杂度是 O(2*N),但是在看问题时我认为复杂度是 O(N) .
#include <cstdlib>
#include <iostream>
using namespace std;
class node {
public:
int data;
node* left;
node* right;
node(int data){
this->data = data;
this->left = NULL;
this->right = NULL;
}
};
int funcUtil(node* node, int min, int max) {
cout << "a";
if (node==NULL)
return 1;
if (node->data < min || node->data > max)
return 0;
return funcUtil(node->left, min, node->data-1) && funcUtil(node->right, node->data+1, max);
}
int func(node* node) {
return(funcUtil(node, INT_MIN, INT_MAX));
}
int main() {
node *root = new node(4);
root->left = new node(2);
root->right = new node(5);
root->left->left = new node(1);
root->left->right = new node(3);
if(func(root))
cout<<"YES";
else
cout<<"NO";
return 0;
}
复杂度为O(2*N),与O(N)相同,常量省略
大 O 表示法是这样工作的:
O(c * f(x)) = O(f(x)), c!=0
换句话说,您始终可以将括号内的函数乘以任意非零实常数。
所以 O(2N) = O(N)
大 O 表示法的另一个 属性 是您可以省略低阶项:
O(x^2 + x) = O(x^2)
O(a^x + p(x)) = O(a^x) where a>1 and p(x) is a polynomial of x
从根本上说,如果你看一下 big-O 的含义,它意味着函数 f 的增长率比函数 g(n) 慢,所以我们写成 f(n) = O(g(n)) .
现在将其视为 n 和 2n 将始终具有相同的增长率,因为它们随着 n 的变化而变化,因此我们得出 O(n) 与 O(2n) 相同的结论,并且现在我们将使用 O(n),因为它是描述线性增长率的标准形式。
所以我一直在研究算法的复杂性,但是这个我看不懂。 如果我使用一个全局变量来检查函数被调用了多少次,它将计算数字 11 然后说复杂度是 O(2*N),但是在看问题时我认为复杂度是 O(N) .
#include <cstdlib>
#include <iostream>
using namespace std;
class node {
public:
int data;
node* left;
node* right;
node(int data){
this->data = data;
this->left = NULL;
this->right = NULL;
}
};
int funcUtil(node* node, int min, int max) {
cout << "a";
if (node==NULL)
return 1;
if (node->data < min || node->data > max)
return 0;
return funcUtil(node->left, min, node->data-1) && funcUtil(node->right, node->data+1, max);
}
int func(node* node) {
return(funcUtil(node, INT_MIN, INT_MAX));
}
int main() {
node *root = new node(4);
root->left = new node(2);
root->right = new node(5);
root->left->left = new node(1);
root->left->right = new node(3);
if(func(root))
cout<<"YES";
else
cout<<"NO";
return 0;
}
复杂度为O(2*N),与O(N)相同,常量省略
大 O 表示法是这样工作的:
O(c * f(x)) = O(f(x)), c!=0
换句话说,您始终可以将括号内的函数乘以任意非零实常数。
所以 O(2N) = O(N)
大 O 表示法的另一个 属性 是您可以省略低阶项:
O(x^2 + x) = O(x^2)
O(a^x + p(x)) = O(a^x) where a>1 and p(x) is a polynomial of x
从根本上说,如果你看一下 big-O 的含义,它意味着函数 f 的增长率比函数 g(n) 慢,所以我们写成 f(n) = O(g(n)) .
现在将其视为 n 和 2n 将始终具有相同的增长率,因为它们随着 n 的变化而变化,因此我们得出 O(n) 与 O(2n) 相同的结论,并且现在我们将使用 O(n),因为它是描述线性增长率的标准形式。