由于一些原始研究和开发工具的需要,我想出了一些新的,我希望更好/更快的方法来执行某些数学运算。Atm 我正在处理伪代码以将它们发布在网站上,以回答已经提出的问题。
但是在我这样做之前,我想尽可能地优化它们,所以我需要有人从时间复杂度的角度来阐明位操作是如何工作的。
例如,假设我想评估两个 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 操作?
谢谢。
进一步澄清。我一直在重读我从几个地方提取的笔记,尽管杜克林证实了我认为应该是这样的情况,但我需要三重检查。以简单的乘法算法为例。我在许多地方看到声称这是一个 Log^2(N) 操作,并且它是一个 Log^2(N) 操作的给定原因是由于它由 Log(N) 添加一个 Log(N)数字。我遇到的问题是,虽然这是真的,但它忽略了这样一个事实,即每个 Log(N) 数字都是位移的结果,到最后我们将至少位移 Log(N) 次。由于位移 1 是一个 Log(N) 操作,因此单独考虑的位移会给我们 Log^2(N) 操作。因此,当我看到它进一步声称在实践中乘法并没有时,这对我来说毫无意义 t 实际上使用 Log^2(N) 操作,因为各种方法可以减少所需加法的数量。由于仅移位就给了我们 Log^2(N) 我对这种说法如何正确感到困惑。