2011-12-15 2 views
5

Sto provando a dividere un binario (solo gli elementi sono 0 e 1) array 3D allocati dinamicamente in array 3D separati e più piccoli. La figura seguente rende un po 'più chiaro comprendere:Divisione ricorsiva di array binario 3D per creare bitstream per ogni voce uguale a 1

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

È una matrice 3D sparso di 10.000 elementi. Per ogni 1 che è un elemento del mio array, voglio creare un flusso di bit unico. I sottodomini ottenuti mi restituiscono un numero di 1s nel blocco corrispondente. Questo numero viene quindi convertito in binario e aggiunto al flusso di bit.

Dal momento che questa operazione scissione è lo stesso ogni volta, prima divisione nella direzione i, poi in direzione j e poi nelle k di direzione (3 livelli) Voglio fare questo in modo ricorsivo. Inoltre, dal momento che sto lavorando in ANSI C, il funzionamento non ricorsivo comporterebbe un'enorme quantità di codice duplicato.

La divisione deve terminare nei sottodomini che sono vuoti, quindi contenere solo 0 (numero_x = 0) o quando la dimensione è [0..1] x [0..1] x [0]. Questi sottodomini sono gestiti da un codice Huffman.

Più precisamente, si tratta di un allineamento 3D con la dimensione a partire:

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

mio codice corrente per i primi tre livelli sono disponibili all'indirizzo http://codepad.org/zGbAhKrC

Split livello # 1 risultati in due array 3D di dimensioni :

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

numero_w = 6505 e numero_e = 3495 rappresentano il numero di 1 in entrambe le parti.

Livelli # 2 risultati in quattro matrici 3D di dimensioni:

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 e number_nw = 4364 rappresentano il numero di 1 del nel blocco corrispondente. number_se = 1745 e number_ne = 1750 rappresentano il numero di 1 nel blocco corrispondente.

livello Split # 3 risultati in otto matrici 3D di dimensioni:

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 e number_swp = 0 rappresentano il numero di 1 s nel blocco corrispondente. number_nwm = 4364 e number_nwp = 0 rappresentano il numero di 1 s nel blocco corrispondente. number_sem = 1745 e number_sep = 0 rappresentano il numero di 1 s nel blocco corrispondente. number_nem = 1750 e number_nep = 0 rappresentano il numero di 1 s nel blocco corrispondente.

Chiunque può aiutarmi con qualche pseudo codice basato sul mio codice corrente?

Grazie in anticipo!

+0

+1 solo per l'immenso sforzo nel presentare questo proprio (compresa la grafica), e le linee di codice 950+ prima anche girando a SO. Mi è venuto in mente quando ho provato per un po ', quindi sfortunatamente lo desidero. – gnometorule

risposta

1

Date un'occhiata al kd-tree examples in wikipedia.

+0

Zhenya, l'ho controllato e potrebbe essere una soluzione per il mio problema, ma attualmente sto cercando di implementare un metodo che è stato ampiamente utilizzato e si è dimostrato performante in diversi articoli scientifici. Voglio implementare quel metodo prima, prima di guardare ad altre soluzioni. Da qui la mia domanda dettagliate circa l'approccio ricorsivo del mio codice ... Handling mio problema come un kd-albero sarebbe una possibile estensione per l'algoritmo di corrente quando ho intenzione di lavorare sulla parte di ottimizzazione, quindi grazie per la risposta ! – user1098973