Sto costruendo una semplice app che rappresenta una matrice, in cui i nodi vengono aggiunti abbastanza spesso. Attualmente ho il seguente codice per aggiungere un nuovo nodo:
let mut new_edges = Array2::default((position + 1, position + 1));
for i in 0..position {
for j in 0..position {
new_edges[[i, j]] = self.edges[[i, j]]
}
}
self.edges = new_edges;
Quindi in pratica copia solo tutto su ciascun nodo inserito.
Un modo molto più efficiente è stato aggiungere nuovi elementi alla fine del vettore a dimensione singola e trattarlo come matrice 2D. Ad esempio, potrebbe essere vettore di lunghezza 9
che rappresenta la seguente matrice:
0|1|8|
_| | |
3 2|7|
___ |
4 5 6|
_____
Quindi vedi. Teniamo gli indici del vettore sottostante in ordine di serpente. Quando vogliamo ridimensionarlo, non spostiamo nulla ma aggiungiamo semplicemente nuovi 2n-1
nodi alla fine. L'aggiunta di 4 colonne e righe comporterebbe l'aggiunta di 7 nodi nel modo seguente:
0 |1 |8 |9 |
__| | | |
3 2 |7 |10|
_____| | |
4 5 6 |11|
________| |
15 14 13 12|
___________|
Il problema con questo approccio che non posso esprimerlo matematicamente, cioè in questo caso matrix[[2,2]]
è memorizzato in vec sull'indice 6
, matrix[[2,0]]
è memorizzato sull'indice 8
e matrix[[0,1]]
è memorizzati nell'indice 3
.
Sto facendo la cosa giusta e se la risposta è sì, come si può eseguire la traduzione da 1 a 2?