【发布时间】:2019-12-12 19:19:31
【问题描述】:
请注意,如果 x 是任何正整数,以下可能具有完全相同的解决方案,但对于手头的确切问题:
选择一个整数 0 http://oeis.org/A308496 )。令 y 是通过将 x 的每个 3 位子串向左旋转 1 形成的整数。例如。如果 (x)_2 = 001_010_111_100 然后 (y)_2 = 010_100_111_001
问题:让 x_1, x_2, ... x_m 是给定 n 的此类 x 的序列,找到对应的 y_1, y_2, ... y_m。
如果 m 小于几千,那么速度就不是问题了。一个可以例如将“001_010_111_100”分解为数组 [001, 010, 111, 100] 并对数组的每个元素执行位轮换。
然而,一旦 m 变得相当大(例如 > 10^6),这个任务就需要尽可能的优化。有什么建议(给 C++ 初学者)?
【问题讨论】:
-
这是家庭作业还是其他学校作业?
-
您对如何解决这个问题有什么想法?
-
没有作业,我正在处理图像 - 因此有数百万个条目。我会为大家省去细节。
-
构建一个长度为 256 的转换数组,将一个字节转换为另一个字节。也许一个长度为 16 的数组来转换半字节,由于各种缓存的工作方式,效率更高。可能是。做一个测试。
-
为了获得最佳性能,解决方案可能在于一些汇编程序魔法(MMX、SSE、FMA;我只是在没有任何技术知识的情况下在这里抛出首字母缩略词)。
标签: c++ algorithm performance bit-manipulation