【发布时间】:2013-10-18 06:32:30
【问题描述】:
我正在寻找一个可逆函数unsigned f(unsigned),它在f(i) 中设置的位数随着i 而增加,或者至少不会减少。显然,f(0) 必须为 0,并且 f(~0) 必须排在最后。两者之间有更大的灵活性。在 f(0) 之后,接下来的 32* 值必须是 1U<<0 到 1U<<31,但我不太关心顺序(它们都设置了 1 位)。
我想要一个不需要计算f(0)...f(i-1)就可以计算f(i)的算法,完整的表格也不行。
这类似于格雷码,但我看不到重用该算法的方法。我试图用它来标记一个大型数据集,并优先考虑我搜索它们的顺序。我的想法是我有一个密钥C,我会检查标签C ^ f(i)。 i 的低值应该给我类似于C 的标签,即只有几位不同。
[*] 不假设 unsigned 有 32 位的奖励积分。
[示例] 一个有效的初始序列:
0, 1, 2, 4, 16, 8 ... // 16 and 8 both have one bit set, so they compare equal
一个无效的初始序列:
0, 1, 2, 3, 4 ... // 3 has two bits set, so it cannot precede 4 or 2147483648.
【问题讨论】:
-
我认为这些问题旨在找到二进制数的总顺序,以便每个数字将更少的位设置在一个具有更多位设置的数字之前。具有相同位数集的数字可以具有任意但确定的顺序。
-
真正的目标是不同的东西
in only a few bits?例如比如汉明距离? -
@hasan:“在中设置的位数。在英语中,你经常可以省略这样一对词:“the people who are walk there ...” -> “the people walk there ...”
-
您确定不能增量生成序列吗?这将相当容易。