这个算法的时间复杂度是什么?Big-O表示法?

时间:2011-02-21 21:15:59

标签: c algorithm

这是这个问题的算法:旋转i个位置左边的n个元素的数组。例如,当n = 8且i = 3时,数组abcdefg将旋转到defghabc。

/* Alg 1: Rotate by reversal */

void reverse(int i, int j)
{   int t;
    while (i < j) {
        t = x[i]; x[i] = x[j]; x[j] = t;
        i++;
        j--;
    }
}

void revrot(int rotdist, int n)
{   reverse(0, rotdist-1);
    reverse(rotdist, n-1);
    reverse(0, n-1);
}

这种方法的时间复杂度是多少?有没有更好的解决方案来解决这个问题? 非常感谢。

4 个答案:

答案 0 :(得分:0)

应大致为线性O(n)

答案 1 :(得分:0)

循环必须不超过(i + j)/ 2次。丢弃常数O(i + j)。

答案 2 :(得分:0)

Big-O表示法:

n总是O(n)。 (循环,因为它们必须经历几次迭代)

1所以O(1)。 (如果声明,指定数量)

答案 3 :(得分:0)

同意,它是O(n),因为我们只是转移。

作为思考的食物,另一种可能的算法是制作一个新的数组,其原件附加到自身(即abcd - &gt; abcdabcd)。然后将指针右移n次!当然,你需要两个指针,一个用于结束,一个用于开头。记得用'\ 0'

切断结尾

相同的运行时间顺便说一句。