我试图将二进制(仅元素是0
和1
)动态分配的3D数组拆分为单独的较小的3D数组。下面的图让我们更容易理解:
这是一个10000个元素的稀疏3D数组。对于数组中的每个1
元素,我想创建一个唯一的比特流。获得的子域返回相应块中的若干1。然后将该数字转换为二进制并添加到位流中。
由于每次拆分操作都是相同的,首先在i
方向拆分,然后在j
方向拆分,然后在k
方向(3个级别)拆分,我想递归地执行此操作。此外,由于我在ANSI C中工作,非递归工作将导致大量重复代码。
分割应该在空的子域终止,因此只包含0 (number_x =0)或当大小为[0..]1 . x [0..]1] x[0]。这些子域由霍夫曼代码处理。
更具体地说,它是一个3D数组,起始维度为:
I = [0 .. 511] x [0 .. 511] x [0 .. 31]
我目前的前三个级别的代码可以在http://codepad.org/zGbAhKrC
找到。分裂关卡#1产生两个三维数组:
I_w = [0 .. 255] x [0 .. 511] x [0 .. 31]
I_e = [256 .. 511] x [0 .. 511] x [0 .. 31]
number_w = 6505和number_e = 3495表示两个部分中1的个数。
分裂关卡#2产生四个三维数组:
I_sw = [0 .. 255] x [0 .. 255] x [0 .. 31]
I_nw = [0 .. 255] x [256 .. 511] x [0 .. 31]
I_se = [256 .. 511] x [0 .. 255] x [0 .. 31]
I_ne = [256 .. 511] x [256 .. 511] x [0 .. 31]
number_sw = 2141
和number_nw = 4364
表示对应块中1的个数。number_se = 1745
和number_ne = 1750
表示对应块中1的个数。
分裂关卡#3产生八个三维数组:
I_swm = [0 .. 255] x [0 .. 255] x [0 .. 15]
I_nwm = [0 .. 255] x [256 .. 511] x [0 .. 15]
I_swp = [0 .. 255] x [0 .. 255] x [16 .. 31]
I_nwp = [0 .. 255] x [256 .. 511] x [16 .. 31]
I_sem = [256 .. 511] x [0 .. 255] x [0 .. 15]
I_nem = [256 .. 511] x [256 .. 511] x [0 .. 15]
I_sep = [256 .. 511] x [0 .. 255] x [16 .. 31]
I_nep = [256 .. 511] x [256 .. 511] x [16 .. 31]
number_swm = 2141
和number_swp = 0
表示1
在相应块中的个数。number_nwm = 4364
和number_nwp = 0
表示对应块中1
的个数。number_sem = 1745
和number_sep = 0
表示对应块中1
的个数。number_nem = 1750
和number_nep = 0
表示1
在对应块中的个数。
谁可以帮助我与一些伪代码基于我目前的代码?
提前感谢!
查看wikipedia中的kd-tree
示例