【发布时间】:2013-06-04 10:23:13
【问题描述】:
由于一些原始研究和开发工具的需要,我想出了一些新的,我希望更好/更快的方法来执行某些数学运算。 Atm 我正在处理伪代码以将它们发布在网站上,以回答已经提出的问题。
但是在我这样做之前,我想尽可能地优化它们,所以我需要有人从时间复杂度的角度来阐明位操作的工作原理。
例如,假设我想评估两个 8 位整数中哪个更大。我以 8 位为例,但实际上它们可能要大得多。
10000100
10100000
就目前而言,可以通过比较 6 个 MSB 来评估关系运算符。 理论上我可以从两者中减去 10000000 而不会影响不等式。
00100000
00000100
- 第一季度。这将加快关系运算符的评估,如果 读数从 MSB 开始,但会执行或执行前导 0 无论如何都必须评估?明显的减法不值得做 因为减去 10000000 本身就是一个 8 位运算,但是说 相反,我可以使用一个或两个设置 MSB 或特定位 位操作,那么它可能是值得的。
- 第二季度。我能想到的两种可能符合要求的方法是 向左移动然后向右移动以破坏前导 1 或使用 一个面具,但还有其他方法吗?我特别感兴趣 那些可能让你设置任何位的,而不仅仅是前导位。如果 它特定于某种语言,请告诉我。
- 第三季度。由于掩码是 N 位,因此使用掩码而不是 N 位 操作本身?
- 第四季度。如何评估特定位,存在哪些方法以及 操作的时间复杂度如何?是否所有进行的位都必须 先读入,这样它是一个 N 位操作,或者你可以“跳转” 到一定程度?
- Q5 两个字符串从时间复杂度共轭 看法。通过关联两个内存地址是否会发生这种情况 在一起还是一个字符串被读取并复制到另一个字符串中 这是一个 String.length 操作?
谢谢。
进一步澄清。 我一直在重读我从几个地方提取的笔记,尽管杜克林证实了我认为应该是这样的情况,但我需要三重检查。以简单的乘法算法为例。我在许多地方看到声称这是一个 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) 我对这种说法是如何正确的感到困惑。
【问题讨论】:
-
恭喜你提出了几十年来数百万人错过的东西......有一个问题:ACM(或类似的)通讯不是更合适的论坛吗?
-
@Mitch Wheat。我已经仔细检查并正确阅读了常见问题解答,这似乎是正确的论坛。根据它,这是“一个特定的编程问题,一种软件算法软件工具,程序员常用的实用、可回答的问题,是编程行业独有的”的地方。我认为我的问题在某些方面与此相符,所以我不理解降级。
-
@RhuaidhriTynan Communications of the ACM 与Stack Exchange 无关,我认为是where you were looking。我认为米奇说/暗示没有Stack Exchange 网站(或者更具体地说不是Stack Overflow(?))是合适的。我不太确定,我看到的唯一可能的问题是你不应该在一篇文章/问题中问 6 个问题。
-
减法只需要 O(log n) 门延迟,所以看起来这比它的成本更有用。
标签: bit-manipulation big-o time-complexity masking bit-shift