当我计算它并给我 O(n^3) 时,这个迭代函数是如何是 O(n/2) 的
How this iterative function is O(n/2) when I calculate it and gives me O(n^3)
我有这个函数
void A()
{
for(int i=n/2;i<=n;i++)
printf("XXX");
}
我尝试使用以下逻辑计算它的复杂性(但我知道这是错误的,根据教程 24:30,正确的值是 O(n/2):
i 值最初以 i= n/2 开头;然后 i=(n/2)+1;然后 i=(n/2)+2;>>>> i=(n/2)+n。
这将导致执行总数 n/2*(1 +2 +3 +4 + ....+ n) 这将是 n^2 定义,因此它的值为 O(n^3)。
i 值最初以 i= n/2 开头; 然后 i=(n/2)+
1; 然后 i=(n/2)+2; i=(n/2)+n。
最终值是i=(n/2)+n/2 = n
,而不是你假设的(n/2)+n
;所以很容易推导出运算的总数:end - start + 1
,这是n - n/2 + 1 = n/2 + 1
,这是O(n)
。
这实际上是一个简单的例子,因为我们确切地知道 for 循环将根据n
计算多少次迭代:i
将依次取值n/2
、n/2+1
......n
.
循环将精确地迭代n-n/2+1
=n/2+1 (+parity)
,因此算法复杂度为 O(n/2) = O(n)。
相关文章:
- 实现一个在集合上迭代的模板函数
- 如何在C++中将迭代器作为函数参数传递
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 如何创建迭代器函数
- 此递归函数的每次迭代的值存储在哪里?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 使用迭代器的模板类的构造函数
- C++:复制迭代器的构造函数
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数中的迭代器出现问题
- 使用迭代器的自定义比较器函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- GetDIBits 在屏幕捕获函数中多次迭代后返回零
- C++,删除函数/迭代进程中定义的动态数组
- 使用SIN和COS函数迭代时,NAN会导致
- C++ 解释重载成员函数迭代器(int i = 0) 的构造"one liner":i(i) { };