Dato un numero n, e un array con dimensione m dove m < n. A condizione che ogni numero nell'array sia compreso tra 0 e n-1 (inclusi), voglio ottenere il più efficientemente possibile l'elenco di numeri n-m da 0 a n-1 che non sono nell'array.Genera un elenco di numeri rimanenti
Ecco come lo sto facendo (in pseudocodice), ma ci si sente piuttosto inefficiente e mi chiedo se c'è un modo migliore:
int[] remaining (int[] assigned) {
Set<int> s
int[n-m] remaining
add each int in assigned to s
for(i = 0 to n-1)
if(not s.contains(i)) remaining.add(i);
}
Questo non è un qualsiasi linguaggio di programmazione particolare, ma esso dovrebbe essere ilustrativo Assumiamo che l'accesso a un array sia ovviamente O (1) e l'aggiunta/verifica di un set è O (log (n)) come sarebbe un set AVL. Quindi in pratica sto cercando di ottenere questo in tempo lineare, invece di O (n · logn) come ora, ma se l'array iniziale non è ordinato non so come farlo, o se è possibile anche .
Se si può permettere la memoria, un array di bit di dimensione n può essere utilizzato per risolvere il problema in tempo lineare. (L'algoritmo è ovvio). – ooga
Non seguo assolutamente l'algoritmo ovvio. Potresti spiegare per favore? EDIT: Oh, aspetta, per definizione intendevi booleano? – Setzer22
Oh, mi dispiace! Stavo pensando che avresti impostato l'array di bit su tutti gli 0, passando attraverso l'elenco di numeri impostando il bit corrispondente su 1, quindi passando attraverso l'array di bit e stampando le posizioni di tutti i bit che sono ancora zero. – ooga