对x以下整数的双射

时间:2011-09-22 09:53:12

标签: algorithm parallel-processing

我正在进行图像处理,我正在编写一个迭代算法来迭代图像中的所有像素,并根据它的值改变周围的像素。在这个算法中,次要的非确定性是可以接受的,但我宁愿通过仅同时查询远处像素来最小化它。有人可以给我一个算法,以快速简单的方式将n下面的整数双射映射到n以下的整数,这样在映射之前彼此接近的两个整数在应用之后可能相距很远。

3 个答案:

答案 0 :(得分:1)

为简单起见,我们说n是2的幂。你能简单地颠倒数字中最不重要的log2(n)位的顺序吗?

答案 1 :(得分:0)

考虑到像素是一维数组,你可以使用散列函数j = i * p%n其中n是最后一个像素的基于零的索引,p是选择用于将像素放置得足够远的素数在每一步。 %是C中的余数运算符,在数学上我写j(i)= i p(mod n)。

因此,如果您想在每次迭代时至少跳过10行,请选择p> 10 * w其中w是屏幕宽度。你当然希望p的查找表是n和w的函数。

请注意,当j从0变为n时,j会命中每个像素。

更正:使用(mod(n + 1)),而不是(mod n)。最后一个索引是n,使用mod n无法达到,因为n(mod n)== 0。

答案 2 :(得分:0)

除了还原位顺序外,您还可以使用 modulo 。假设N是素数(如521),因此对于所有x = 0..520,您定义了一个函数:

f(x)= x * fac mod N

这是0..520的双射。 fac是与0和1不同的任意数字。例如,对于N = 521和fac = 122,您将获得以下映射:

enter image description here

你可以看到它是非常均匀的并且在对角线附近没有多少数字 - 有一些,但它只是一小部分。