哪种控制结构所需的时间复杂度更低?
Which of the control structure take less time complexity?
在编程中,我们使用许多控制结构进行迭代。那么,哪一个是迭代时间复杂度的最佳方式呢?
int a[500],n=10;
for(int i=0;i<=n;i++)
{
cin>>a[i]
}
如何更改此迭代以降低复杂性?
哪一个是用于迭代的最佳方式:
- 为
- 而
- 做而
for
,while
和do while
(也是goto
)实际上是一回事。无论您使用这些循环之一创建哪个循环,您始终可以创建一个与所有其他循环具有相同时间复杂度的等效循环。(几乎是真的。唯一的例外是 do-while 循环必须至少运行一次。
例如,您的循环
for(int i=0;i<=n;i++) {
...
}
对应于
int i=0;
while(i<=n) {
...
i++;
}
和
int i=0;
START:
...
i++;
if(i<=n)
goto START;
你也可以做一个等效的做,但这并没有真正的意义。
您应该选择哪一个更多的是设计问题而不是性能问题。通常:
for
- 当您知道循环开始前的迭代次数时while
- 当你不知道时do-while
- 当你不知道,但至少一次goto
- 从不(存在一些例外)
for 循环的一个好处是,您可以声明仅存在于循环范围内的变量,也可以用于循环条件。
这将从i=0
迭代到i=10
,因此总共11次迭代。任何基本循环的时间复杂度为 O(N)。
上述所有选项(for-loop,while-loop,do-while-loop)都具有相同的时间复杂度。
与往常一样,您应该使用缓存技术来实现此类目的。因为如果你有兴趣,for
,while
关键字实际上在几乎相同的指令中做同样的事情(两者都在jmp指令中表示)。同样,银弹不存在。根据程序的性质,优化循环的唯一方法是使用缓存或并行化(如果它可以满足 yoyr 目标)。也许有常量值只创建一次并使用多次?如果可能,则缓存结果。这可以将时间减少到"恒定"。或者以并行方式进行。但我认为这不是正确的方法,编译器会为你做很多事情。更好地专注于程序的体系结构
使用for
、while
、do-while
、for-each
等可以被认为是句法糖的一个经典例子。它们只是做同样事情的方法,但在某些情况下,某些控制结构可能比其他结构"更甜蜜"。例如,如果你想继续迭代 iff(如果和只是如果)布尔值保持true
(例如使用迭代器),while
看起来比for
好得多(嗯,这是一个主观评论),但复杂性是相同的。
while (iter.next()) {
// Do something
}
for (;iter.next();) {
// Do something
}
就时间复杂度而言,它们正在迭代相同数量的元素,在您的示例中 N=10 因此是 O(N)。你怎样才能让它变得更好?这取决于,如果你必须遍历整个数组,大O的最佳情况将始终是O(N)。现在就~N而言,该语句并不总是true
。例如,如果你只迭代有 2 个起点的数组的一半,一个在i=0
点,另一个在i=n-1
点,你可以实现时间复杂度 ~N/2
for(int i=0;i<n/2;i++)
{
int x = a[i];
int y = a[n-i-1];
// Do something with those values
}
对于大 O 是相同的复杂性,给定 ~N/2 -> O(N),但如果你有一组 10k 记录,只需读取 5k 就是一种成就!在最后一种情况下,我想说的是,如果你想提高代码的复杂性,你需要开始检查更好的数据结构和算法(这只是一个简单的愚蠢的例子,在多种情况下都有漂亮的算法和数据结构)。只要记住:for
或while
都不是大公关!
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 哪种控制结构所需的时间复杂度更低?
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 具有恒定时间复杂度的无向图边的数据结构
- 结构的时间复杂度
- 给定数据结构的时间复杂度