反转位的空间复杂性

时间:2018-04-15 16:55:44

标签: c++ bit-manipulation space-complexity

此解决方案的空间复杂性是多少?此代码反转32位无符号整数的位。我不确定空格是否为O(N),因为在返回答案之前复制了所有位,或者如果这被认为是O(1),因为答案的大小不依赖于输入A的大小

unsigned int Solution::reverse(unsigned int A) {
  unsigned int ans = 0;
  for (unsigned int i = 0; i < 32 ; ++i) {
      if (A & (1 << i)) {
          ans += (1 << (31-i));
      }
  }
  return ans;
}

2 个答案:

答案 0 :(得分:1)

你的函数只接受unsigned int,所以算法受sizeof(unsigned int)限制,所以它总是相同的,所以O(1)。

答案 1 :(得分:1)

如果我们尝试分析您的代码的逐行:

unsigned int Solution::reverse(unsigned int A) {
    unsigned int ans = 0;                        // O(1)
    for (unsigned int i = 0; i < 32 ; ++i) {     // O(1)
        if (A & (1 << i)) {                      // O(1)
            ans += (1 << (31-i));                // O(1)
        }
    }
    return ans;
}

您所做的每项操作都是线性的。它不依赖于您给出的任何参数,因为unsigned int具有固定大小。据我说,你的方法在O(1)。

如果我建议:您应该避免在代码中使用32来代码并将其替换为sizeof(A)*8,这应该更具可移植性。 sizeof()返回对象的字节大小。更多信息here