位操作的时间复杂度

时间:2013-06-04 10:23:13

标签: bit-manipulation big-o time-complexity masking bit-shift

由于一些原创研究和开发工具的需要,我想出了一些新的,我希望更好/更快的方式来执行某些数学运算。 Atm我正在研究psuedocode,将它们发布到网站上以回答已经提出的问题。

然而,在我这样做之前,我希望尽可能地优化它们,因此我需要有人从时间复杂的角度阐明位操作的工作原理。

例如,我想评估两个8位整数中哪一个更大。我使用8位作为示例,但实际上它们可能要大得多。

10000100

10100000

目前,可以通过比较6个MSB来评估关系运算符。 从概念上讲,我可以从两者中减去10000000,而不会影响不平等。

00100000

00000100

  • Q1。如果,这将加速关系运算符的评估 读取从MSB开始,但是执行或执行前导0 必须要进行评估?显而易见的减法不值得做 因为减去10000000本身就是一个8位操作但是说 相反,我可以使用一个或两个来设置MSB或特定位 比特操作然后它是值得的。
  • Q2。我能想到的两种可能符合要求的方法是 向左移位然后向右移动以消灭前导1或使用 面具,但有其他方法吗?我特别感兴趣 那些可能让你设置任何位而不仅仅是前导位。如果 它是特定于某种语言的,请告诉我。
  • Q3。由于掩码是N位,因此使用掩码而不是N位 操作本身?
  • Q4。如何评估特定位,存在哪些方法和 操作的时间复杂程度如何?所有进行的位都必须 首先读取,这是一个N位操作或你可以“跳” 到某一点?
  • Q5两个字符串从时间复杂性中共轭 透视。这是通过关联两个内存地址来实现的 在一起或者一个字符串被读取并复制到另一个字符串中 它是一个String.length操作吗?

感谢。

进一步澄清。 我一直在重读我从几个地方拉出来的笔记,虽然Dukeling证实了我认为应该是这种情况我需要三重检查。以简单的乘法算法为例。我在很多地方看到声称这是一个Log ^ 2(N)操作,并且它是Log ^ 2(N)操作的给定原因是由于它包含Log(N)的Log(N)加法数。我遇到的问题是虽然确实如此,但它忽略了这样一个事实:每个Log(N)数都是位移的结果,到最后我们将至少有Log(N)次位移。当比特移位1是Log(N)操作时,单独考虑的位移提供了Log ^ 2(N)操作。因此,当我看到它进一步声称在实践中乘法实际上不使用Log ^ 2(N)操作时,对我来说没有意义,因为各种方法可以减少所需的添加的数量。由于单独的位移给我们Log ^ 2(N),我对这种说法如何成真感到困惑。

1 个答案:

答案 0 :(得分:0)

  1. 必须评估前导0位,除非您存储MSB的索引并编写自己的例程来进行比较。

  2. 位移是N位操作。

  3. 屏蔽也是一个N位操作。

  4. 取决于你如何在内部表示它,跳转到正确的字节相对容易,但是高级语言(如果你使用的话)通常不允许你要直接访问某个特定的位,你需要一些操作(例如,只移位(仅该字节的))来获得该位。

  5. 连接字符串需要O(m + n),其中m和n是各个字符串的长度。我所知道的所有字符串都按顺序表示在内存中。您也不必在任何一个字符串之后访问内存(除非您通过分配足够的内存来强制执行此操作),因此必须将两者都复制到新位置。虽然没有什么能阻止你创建自己的数据结构。

  6. 所以...只是直接逐位或逐字节比较(可能与1中提到的起始位置优化)可能是你将获得的最佳效果。

    PS - 任何已发布的研究都应该显示出足够的证据(以某种形式或另一种形式)作为为什么它比其他东西更好的动机。