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?