查找数字是不是为 2 的幂的时间复杂度

Posted

技术标签:

【中文标题】查找数字是不是为 2 的幂的时间复杂度【英文标题】:Time complexity for finding if number is power of two查找数字是否为 2 的幂的时间复杂度 【发布时间】:2020-06-10 04:44:30 【问题描述】:

此代码查找数字是否为 2 的幂的时间复杂度是多少。

O(1)吗?

bool isPowerOfTwo(int x) 
    // x will check if x == 0 and !(x & (x - 1)) will check if x is a power of 2 or not
    return (x && !(x & (x - 1)));

LeetCode 231

【问题讨论】:

是的,没错。 是的,它是 O(1),因为所花费的时间不取决于输入的大小(我猜这将是数字 x 的大小)。 【参考方案1】:

非正式地它是 O(1),因为代码需要有限的时间来运行。它不是恒定时间,因为运行时确实取决于输入(例如,如果 x 为 0,则函数快速返回),但它是有界的。

更正式地说,它是模棱两可的,因为 O(n) 是为由任意大的 n 参数化的函数定义的,而这里 int 被限制为 2^31 或 2^63。通常在实际程序的复杂度计算中可以忽略这一点(因为大小为 2^31 的数组非常大),但在这里很容易想出超出函数接受范围的数字。

在实践中,复杂性理论家通常以两种方式概括您的问题

要么假设 int 包含 Theta(log n) 位,并且算术运算在 O(1) 时间内工作 Theta(log n) 位(即,存储单元和寄存器的大小随着输入大小而变大增加)。这有时被称为“词模型”。 或者假设算术运算是 O(1) 仅用于位运算。这有时被称为“位模型”。

在词模型中,函数是O(1)。在位模型中,函数是O(log n)。

注意,如果你把int换成big-int类型,那么你的函数肯定是O(log n)。

【讨论】:

【参考方案2】:

是的,它是 O(1),但是 bitwiseAnd(10^9,1) bitwiseAnd(10,1) 的时间复杂度并不相同,即使它们都是 O(1)。实际上,方程本身涉及 4 个基本运算,就其计算能力而言,我们将其视为基本运算和单位运算。但实际上,这些基本操作也有 32 或 64 次操作的成本,因为在大多数情况下使用 32 或 64 位来表示一个数字。所以这个 O(1) 时间复杂度意味着在计算方面最差的时间复杂度是 32 或 64 次操作,并且由于 32 和 64 都是非常低的值,并且这些操作是在机器级别执行的,所以这就是为什么我们不怎么想这些单元步骤执行其功能所需的时间。

【讨论】:

【参考方案3】:

是的,代码的时间复杂度为 O(1),因为运行时间是恒定的,并且不依赖于输入的大小。

【讨论】:

以上是关于查找数字是不是为 2 的幂的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

数字与数学7:幂的问题

如何使用递归计算幂的幂? [关闭]

LeetCode 1780. 判断一个数字是否可以表示成三的幂的和

LeetCode 1780. 判断一个数字是否可以表示成三的幂的和

计算11的1位数到N的幂

快速幂算法