Sì, è possibile, con O (n^2) algoritmo di tempo: elemento
asporto all'indice 0, quindi scrivere 0 alla cella indicizzato da quell'elemento . Quindi usa l'elemento appena sovrascritto per ottenere l'indice successivo e scrivere l'indice precedente lì. Continua fino a tornare all'indice 0. Questo è l'algoritmo del ciclo leader.
Quindi fare lo stesso a partire dall'indice 1, 2, ... Ma prima di eseguire qualsiasi modifica, eseguire l'algoritmo del ciclo leader senza alcuna modifica a partire da questo indice. Se questo ciclo contiene un indice al di sotto dell'indice iniziale, basta saltarlo.
O questo O (n^3) algoritmo di tempo: elemento
Prendere in corrispondenza dell'indice 0, quindi scrivere 0 alla cella indicizzato da quell'elemento. Quindi usa l'elemento appena sovrascritto per ottenere l'indice successivo e scrivere l'indice precedente lì. Continuare fino a tornare all'indice 0.
Quindi fare lo stesso a partire dall'indice 1, 2, ... Ma prima di eseguire qualsiasi modifica, eseguire l'algoritmo del ciclo leader senza alcuna modifica a partire da tutti gli indici precedenti. Se l'indice corrente è presente in un ciclo precedente, basta saltarlo.
ho scritto (leggermente ottimizzata) implementation di O algoritmo (n^2) in C++ 11 per determinare quanti accessi supplementari sono necessari per ogni elemento in media se permutazione casuale è invertita. Ecco i risultati:
size accesses
2^10 2.76172
2^12 4.77271
2^14 6.36212
2^16 7.10641
2^18 9.05811
2^20 10.3053
2^22 11.6851
2^24 12.6975
2^26 14.6125
2^28 16.0617
Anche se la dimensione cresce in modo esponenziale, il numero di accessi elemento cresce quasi linearmente, così la complessità orario previsto per permutazioni casuali è qualcosa di simile O (n log n).
fonte
2015-08-02 15:39:40
È possibile utilizzare il bit di segno delle voci dell'array per codificare le informazioni o sarebbe contrario all'idea di non utilizzare uno spazio aggiuntivo? –
@NiklasB. Quello sarebbe 1 bit per voce - O (n) spazio. Non autorizzato. – orlp
Beh, questo dipende molto dal modello. Nel classico modello di RAM, ad esempio, abbiamo log n