Sto cercando un'idea di algoritmo su come attraversare una matrice usando un indice lineare evitando gli attraversamenti basati su righe / colonne per ottenere una distribuzione dei valori più diversificata.
Per capire meglio, pensa a un'immagine divisa in blocchi, con N
righe & M
colonne. Ho bisogno di elaborare ogni blocco immagine in modo sequenziale (da 1
a NxM
), ma non so in anticipo quale sarà il tempo di elaborazione per ogni blocco (i blocchi ravvicinati tendono ad avere un tempo di elaborazione simile, con piccole variazioni).
Durante l'elaborazione, devo essere in grado di stimare al meglio il tempo di elaborazione rimanente in base al numero di blocchi che sono già stati elaborati e amp; il loro tempo di elaborazione associato. Per questo motivo, attraversare i blocchi per colonne o per righe non darà una stima accurata, quindi ho bisogno di trovare un altro modo di attraversare la matrice che selezionerebbe i valori da diverse zone dell'immagine.
È anche importante poter determinare l'ordine di elaborazione dei blocchi basato su un indice lineare (da 1 a NxM), senza calcolarli in anticipo. L'algoritmo che restituisce row
& column
corrispondente all'indice lineare dovrebbe essere il più veloce possibile.
Versione più breve della domanda
Per un indice di linea chiamato idx
, ho bisogno di ottenere un row
corrispondente e amp; column
coppia da una matrice con N
righe & M
colonne evitando una traversata basata su riga / colonna.
Per ogni idx
tra 1
e NxM
, l'algoritmo restituisce una coppia [row, column]
in modo che tutte le righe e amp; le combinazioni di colonne vengono restituite esattamente una volta.
Esempio
(i valori nella matrice rappresentano il valore dell'indice lineare associato a quella riga e alla posizione della colonna)
1 17 13 9 5 6 2 18 14 10 11 7 3 19 15 16 12 8 4 20
L'esempio sopra è per un attraversamento diagonale che produrrebbe una migliore distribuzione dei valori su una traversata basata su riga / colonna.
Un'altra possibile soluzione sarebbe quella di dividere la matrice in blocchi più piccoli e amp; attraversare quei blocchi in righe / colonne. Ad esempio una matrice 4x5
potrebbe essere virtualmente suddivisa in blocchi 2x2
e quei blocchi più piccoli potrebbero essere attraversati da righe o colonne (ad esempio idx(1) = block1[1, 1]
, idx(2) = block2[1, 1]
, ecc.). L'attraversamento sarebbe simile a questo:
1 13 | 3 15 | 5 7 17 | 9 18 | 11 ------+-------+--- 2 14 | 4 16 | 6 8 19 | 10 20 | 12
Qualsiasi altra idea di attraversamento è benvenuta.
Idealmente, questo algoritmo si tradurrebbe in una formula matematica per calcolare la riga & colonna basata sull'indice lineare, possibilmente con alcune condizioni (dichiarazioni IF
) per compensare i valori mancanti, ecc.