任何人都可以找出一个能够从有限的N个数组X = {x0,x1,x2,...,xN}执行映射的函数,其中每个x可以被赋值0到999999999并且N <1。 999999999,设定为Y = {0,1,2,3,...,N}。
在我的情况下,我在第一组中有大约24000000个元素,其值可以是X.这个元素有连续块(例如53000到1234500,然后是8000000到9000000等等),我必须重新映射这个元素从0到2400000.我不需要维持秩序。
我需要一个(可能是简单快速的)数学函数,或者一个按位变换,而不是把它排序到一个数组然后二进制搜索它们的位置。
真的感谢谁能找到解决这个问题的方法! 卢卡
答案 0 :(得分:1)
如果你不想保留几千兆字节的直图,那么增强的分段树是合理的方法。树应包含每个间隔的间隔和移位(左间隔的总和)。当然,在这种方法中找到合适的间隔(和移位)接近二进制搜索。
例如,您获得X=80000015
。查找此值的间隔 - 它是8000000 to 9000000
。此间隔的等级为175501
(1234500-53000 + 1
)。所以X映射到
X => 175501 + 80000015 - 80000000 = 175516
对于稀疏元素进行计数阶段 - 找到每个数字M的等级R,并将(key=M, value=R)
对放在哈希表中。
X = (3, 19, 20, 101)
table: [(3:0), (19:1), (20:2), (101:3)]
请注意,应该在速度和空间之间保持平衡 - 对于长填充间隔,最好只存储间隔结束。