算法复杂度 - O(log n)的解释?

时间:2016-10-16 18:31:32

标签: c++ algorithm loops big-o complexity-theory

我对复杂性措施比较陌生,请耐心等待。

我理解以下复杂性示例:

O(n) - 线性时间

示例:

None

O(1) - 恒定时间

示例:

std::vector<int> MyV={1,4,6,2,9};
std::for_each(MyV.begin(), MyV.end(), [](int e1, int e1){return e1<e2;});
//I.e. n of operations based on the number of elements

O(n2) - 二次时间

示例:

for(int i=5; i--;)
{
  //Do Stuff
}
//i.e. n of operations will be 5

以上示例是否正确?

如果没有,你能提供一些关于如何纠正这些例子的指示吗?

我也不确定对数时间O(log n),一个例子真的很有用吗?

1 个答案:

答案 0 :(得分:0)

你说你的最后一个例子是O(n 2 ),但是什么是$form->handleRequest ???这就是你应该问自己的问题。它通常是循环运行的矢量大小。

简单的案例就是:

n

现在自信地说,这个例子的复杂性是:O(n 2 ),其中std::vector<int> MyVec_A = {1, 2, 3, 4, 5}; std::vector<int> MyVec_B = {1, 2, 3, 4, 5}; for(int i = MyVec_A; i--;) { for(int x = MyVec_B; x--;) { // Do Stuff that are of negligible complexity } } n(或MyVec_A的大小等效地)。

现在,在您的具体示例中,矢量的长度不同,因此您需要更改所拥有的内容。假设MyVec_B具有大小MyVec_A和“MyVec_B n m`,那么这个双循环将具有时间复杂度:

  

O(n * m个)

我希望很清楚,当矢量大小相同时,如我的例子中那样has size,复杂度变为O(n * m)= O(n * n)= O(n < SUP> 2 )。

对数复杂度的hello世界是二元搜索方法。

给定一个整数数组,您需要找到一个来自用户输入的数字。您可以线性搜索整个数组(O(n)复杂度,其中n = m是数组的大小),或者,如果数组是排序,您可以在O(logn),使用Binary search algorithm。我甚至有一个例子Binary Search (C++)

顺便说一下,学会问一个问题(或者问题的关联程度非常紧密)。