我正在尝试解决2D阵列上的问题并且几乎不需要帮助。问题是这样的:
假设我们有一个大小为nxn的2D数组A,它包含独特的元素。需要重新排列A的元素如下。令A11,A12,A21,A22为A的四个相互不相交的子阵列,每个子阵列的大小为n / 2×n / 2。然后A11< A12< A21< A22。如果将这些子数组中的每一个递归地拆分为四个大小相等的子数组,那么该属性也会成立。
用户输入:n,N(≥n2)。 n是2的幂
我尝试过很多东西,但似乎没什么用。
答案 0 :(得分:1)
您需要创建一个函数,该函数将根据相关顺序将0到n * n-1之间的索引转换为数组中的坐标。然后你就可以在一个大小为n * n的数组上运行一些常用的1D排序算法,j
使用该函数替换 0 1 4 5
2 3 6 7
8 9 12 13
10 11 14 15
元素。它解决了这个问题。
更新:映射函数将此矩阵中的数字映射到它们的坐标:
{{1}}
答案 1 :(得分:1)
对于unkulunkulu的回答有点捎带我认为你可以按照以下方式进行处理:
获取矩阵中的所有值(2D)并将它们放在一个简单的数组(1D)中。然后取这个数组并将值从最低到最高排序。
现在您需要做的是再次填充矩阵,但这样做符合您指定的规则。如果您查看Z-order space filling curve in 2D,您会发现如果按此顺序填充矩阵(使用已排序的元素),则生成的矩阵具有所需的属性。
现在实际编码将取决于你。
答案 2 :(得分:1)
书籍数字配方第21.8章http://www.nrbook.com/nr3/给出了一个解析表达式,用于计算给定四叉树坐标的二维数组的索引。
这是我尝试的另一种直接的方法,但我不喜欢它:
(defun quad-pos (pos)
"POS is a list of letters that indicate the position in a 2x2 matrix [a,b; c,d]."
(let ((x 0)
(y 0)
(s 1))
(dolist (e pos)
(setf s (/ s 2))
(ecase e
('a )
('b (incf x s))
('c (incf y s))
('d (incf x s) (incf y s))))
(values x y)))
#+nil
(quad-pos '(a)) ;=> 0, 0
#+nil
(quad-pos '(a b c)) ;=> 1/4, 1/8
#+nil
(quad-pos '(d d d d)) ;=> 15/16, 15/16