排列的数据转换

时间:2016-03-03 09:08:02

标签: algorithm transformation

我有一个方阵MxN,元素x ij 。每个值都用于some_function(i,j)形式的函数。 该功能按列顺序应用。我想要实现的是一个内核函数k(i,j),它将放在some_function中:

def some_function(i, j):
   i', j' = k(i, j)

我将返回另一个集合(i',j'),以便(i'!= i,j'!= j)和(i',j')对应于初始方阵上的实数值。应用于每个值(i,j)的该函数不会产生任何重复的对。核心函数(i',j')产生的数字应该是分布的。

我的第一个想法是预先计算另一个列表中的排列并将该值传递给some_function。我想知道是否有更好的方法来做到这一点。谢谢。

1 个答案:

答案 0 :(得分:1)

将MxN矩阵视为长度为M * N的一维数组。您希望创建一个转换,该转换将范围0..MN-1中的每个数字唯一映射到此范围内的另一个数字(并且在MN步骤返回到初始索引之后)。

实现这一目标的最简单方法是制作大小为P的步骤,该步长与M和N相互作用且大于M 示例:

indx = M * i + j  /start cell
for k = 0.. M*N - 1 do begin
  indx = (indx + P) % (M*N) //integer modulus
  i = indx / M  //integer division
  j = indx % M  //integer modulus
end // indx returns to the start value

for M=2,N=4, P=5
indx  i   j
0     0   0
5     2   1
2     1   0
7     3   1  
4     2   0
1     0   1
6     3   0
3     1   1

请注意,i和j每次都会改变。