4

由于一些原始研究和开发工具的需要,我想出了一些新的,我希望更好/更快的方法来执行某些数学运算。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) 我对这种说法如何正确感到困惑。

4

1 回答 1

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

  2. 位移是一个 N 位操作。

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

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

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

所以......只是一个直接的逐位或逐字节比较(可能与 1 中提到的起始位置优化)可能是您将得到的最好的。

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

于 2013-06-04T13:24:46.037 回答