你如何将一组数字,充满“洞”映射成一个没有“洞”的小洞

时间:2017-10-03 16:24:28

标签: math set mapping transformation space

任何人都可以找出一个能够从有限的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.我不需要维持秩序。

我需要一个(可能是简单快速的)数学函数,或者一个按位变换,而不是把它排序到一个数组然后二进制搜索它们的位置。

真的感谢谁能找到解决这个问题的方法! 卢卡

1 个答案:

答案 0 :(得分:1)

如果你不想保留几千兆字节的直图,那么增强的分段树是合理的方法。树应包含每个间隔的间隔和移位(左间隔的总和)。当然,在这种方法中找到合适的间隔(和移位)接近二进制搜索。

例如,您获得X=80000015。查找此值的间隔 - 它是8000000 to 9000000。此间隔的等级为1755011234500-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)]

请注意,应该在速度和空间之间保持平衡 - 对于长填充间隔,最好只存储间隔结束。