反转向量的时间复杂度(大 O 表示法)

4
template <typename T>
void reverseVector(vector<T> &vec, int start, int end) {
   if(start < end) {
       char temp = vec[start];
       vec[start] = vec[end];
       vec[end] = temp; 
       reverseVector(vec, start + 1, end1); }
   }
}

假设 N = vec.size(),这个方法的时间复杂度是什么?
假设我是正确的,获取和设置向量的时间复杂度为 O(1)。因此,if 语句中的前三行都是每个 O(1)。然后,该方法递归调用自身,每次函数变得更小,迭代 n(n-1)(n-2)... 次。因此,我认为这个方法的时间复杂度为 O(n!)。我正确吗?
编辑:类似的语法,但使用链表。
template <typename T>
void reverseLinkedList(list<T> &lst, int start, int end) {
  if(start < end) {
    char temp = lst[start];
    lst[start] = lst[end];
    lst[end] = temp;
    reverseLinkedList(lst, start + 1, end – 1);
  }
}
1个回答

2

这是O(n)

你需要交换元素n/2次:(0和n-1),(1和n-2),...(n/2-1和n/2+1)


那么在这种情况下,递归调用不会影响时间复杂度吗? - user3521441
1
完全不是。你的函数等价于“while(start < end) {... start + 1; end - 1;}”。 - Jean Logeart
1
好的,我对大O符号的理解并不是很强,但我有一些了解。如果这个方法改为反转链表的类似语法,时间复杂度会如何改变? - user3521441
1
如果访问索引“i”的元素需要“O(n)”时间,则您仍将交换“O(n)”次,但每次交换都需要“O(n)”时间。因此,使用相同的算法,总时间复杂度将为“O(n^2)”。 - Jean Logeart
我添加了反转链表的代码。因为访问链表与向量具有不同的时间复杂度,所以它变成了O(n^2)? - user3521441
如果您按照这种方式操作,是的。否则,您可以使用迭代器,一个从开头开始,另一个从结尾开始。后一种解决方案将是“O(n)”。 - Jean Logeart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接