我被告知以分而治之的方式反转整数位(即首先交换每两个连续位,然后交换2位对,依此类推,直到我得到结果)是O(logN),但我没看到它是如何O(logN)..
考虑交换字节(8位)时的情况:我们首先将每两位交换并执行4次交换,然后我们交换2位对,这样我们就有2次交换,然后我们在最后一次交换中将所有内容连接在一起。总计:7次掉期,log(N)为3次。
我是对的还是我错过了什么?
答案 0 :(得分:6)
关键的观察是一些交换可以并行完成。引用你的帖子:
总计:7次掉期,log(N)为3次。
是的,它是7次掉期,但是按照上面列出的3个步骤进行。
例如,交换4对就像x = ((x & 01010101b) << 1) | ((x >> 1) & 01010101b)
。这样,我们取位0,2,4和6并将它们提升到位置1,3,5和7(左半部分),同时取位1,3,5和7并将它们降级到位置0,2分别为4和6(右半)。
答案 1 :(得分:4)
你只是在计算别的东西。如果你将所有&#34;个人互换&#34;加起来,那就是很多互换。但是该技术(以及许多类似技术)的重点在于,对于&#34;阶段&#34;,该阶段中的所有交换都以恒定的步数发生。例如,步骤&#34;交换相邻位&#34;:
x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1);
..或其等效的delta-swap公式,看起来无论它做了多少次交换(当然常数都在变化)。所以,那是一个恒定的步骤。 (提示抱怨N位整数的操作不是单步,这里它们是,它只是一种不同的计数方式)
需要3个delta-swaps(或上面的简单交换)来反转一个字节。