由于一些原创研究和开发工具的需要,我想出了一些新的,我希望更好/更快的方式来执行某些数学运算。 Atm我正在研究psuedocode,将它们发布到网站上以回答已经提出的问题。
然而,在我这样做之前,我希望尽可能地优化它们,因此我需要有人从时间复杂的角度阐明位操作的工作原理。
例如,我想评估两个8位整数中哪一个更大。我使用8位作为示例,但实际上它们可能要大得多。
目前,可以通过比较6个MSB来评估关系运算符。 从概念上讲,我可以从两者中减去10000000,而不会影响不平等。
感谢。
进一步澄清。 我一直在重读我从几个地方拉出来的笔记,虽然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),我对这种说法如何成真感到困惑。
答案 0 :(得分:0)
必须评估前导0位,除非您存储MSB的索引并编写自己的例程来进行比较。
位移是N位操作。
屏蔽也是一个N位操作。
取决于你如何在内部表示它,跳转到正确的字节相对容易,但是高级语言(如果你使用的话)通常不允许你要直接访问某个特定的位,你需要一些操作(例如,只移位(仅该字节的))来获得该位。
连接字符串需要O(m + n),其中m和n是各个字符串的长度。我所知道的所有字符串都按顺序表示在内存中。您也不必在任何一个字符串之后访问内存(除非您通过分配足够的内存来强制执行此操作),因此必须将两者都复制到新位置。虽然没有什么能阻止你创建自己的数据结构。
所以...只是直接逐位或逐字节比较(可能与1中提到的起始位置优化)可能是你将获得的最佳效果。
PS - 任何已发布的研究都应该显示出足够的证据(以某种形式或另一种形式)作为为什么它比其他东西更好的动机。