5 votes

Division récursive d'un tableau binaire 3D pour créer un flux binaire pour chaque entrée égale à 1.

J'essaie de diviser un binaire (les seuls éléments sont 0 y 1 ) alloué dynamiquement en tableaux 3D distincts et plus petits. La figure suivante rend la compréhension un peu plus claire :

http://img521.imageshack.us/img521/4296/splittingsteps.png

Il s'agit d'un tableau 3D clairsemé de 10 000 éléments. Pour chaque 1 qui est un élément de mon tableau, je veux créer un flux binaire unique. Les sous-domaines obtenus me renvoient un nombre de 1 qui se trouvent dans le bloc correspondant. Ce nombre est ensuite converti en binaire et ajouté au flux binaire.

Étant donné que cette opération de fractionnement est la même à chaque fois, le premier fractionnement dans le cadre du i puis dans la direction j et ensuite dans la direction k direction (3 niveaux) Je veux faire cela de manière récursive. De plus, comme je travaille en ANSI C, travailler de manière non récursive entraînerait une énorme quantité de code dupliqué.

Le fractionnement doit se terminer par des sous-domaines vides, c'est-à-dire ne contenant que 0 (nombre_x =0) ou lorsque la taille est [0..1] x [0..1] x [0]. Ces sous-domaines sont traités par un code de Huffman.

Plus précisément, il s'agit d'un tableau 3D avec des dimensions de départ :

I = [0 .. 511] x [0 .. 511] x [0 .. 31] 

Mon code actuel pour les trois premiers niveaux se trouve à l'adresse suivante http://codepad.org/zGbAhKrC

Le niveau 1 fractionné donne lieu à deux tableaux de dimensions 3D :

I_w = [0 .. 255] x [0 .. 511] x [0 .. 31]
I_e = [256 .. 511] x [0 .. 511] x [0 .. 31]

nombre_w = 6505 et nombre_e = 3495 représentent le nombre de 1 dans les deux parties.

La division du niveau 2 donne lieu à quatre tableaux de dimensions en 3D :

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 y number_nw = 4364 représentent le nombre de 1 dans le bloc correspondant. number_se = 1745 y number_ne = 1750 représentent le nombre de 1 dans le bloc correspondant.

Le niveau 3 fractionné donne lieu à huit tableaux de dimensions en 3D :

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 y number_swp = 0 représentent le nombre de 1 dans le bloc correspondant. number_nwm = 4364 y number_nwp = 0 représentent le nombre de 1 dans le bloc correspondant. number_sem = 1745 y number_sep = 0 représentent le nombre de 1 dans le bloc correspondant. number_nem = 1750 y number_nep = 0 représentent le nombre de 1 dans le bloc correspondant.

Quelqu'un peut-il m'aider avec un pseudo code basé sur mon code actuel ?

Merci d'avance !

1voto

Zhenya Points 5885

Jetez un coup d'œil à la kd-tree exemples dans wikipedia .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X