Recentemente ho appreso come l'algoritmo di giocoleria ruota un array in tempo lineare mentre stavo leggendo la soluzione nel libro Programmazione perle.Rotazione di un array utilizzando l'algoritmo di giocoleria
Il codice per risolverlo è stato il seguente:
/*Function to left rotate arr[] of siz n by d*/
void leftRotate(int arr[], int d, int n)
{
int i, j, k, temp;
for (i = 0; i < gcd(d, n); i++)
{
/* move i-th values of blocks */
temp = arr[i];
j = i;
while(1)
{
k = j + d;
if (k >= n)
k = k - n;
if (k == i)
break;
arr[j] = arr[k];
j = k;
}
arr[j] = temp;
}
}
Ho due domande riguardanti questo algoritmo -
- Come si fa il MCD decidere il numero di cicli necessari per ruotare il array?
- Perché una volta terminato un ciclo, iniziamo il nuovo ciclo dall'elemento successivo, ad es. il prossimo elemento non può essere già una parte di di un ciclo elaborato?
mi sento, mi manca qualcosa di fondamentale per quanto riguarda il funzionamento del GCD, modulo ei cicli.
La seguente domanda aveva una risposta alla mia prima domanda, ma ancora non ero in grado di capirlo.
Juggling algorithm of string rotation
Quindi, sarebbe utile se qualcuno può spiegare in termini profani e il principio alla base il modo in cui tutto il gel insieme per fare questo lavoro algoritmo.
Scrivere tutti i passaggi su carta per un piccolo array potrebbe anche aiutarti a capire l'algoritmo. –
Non è meglio usare k = (j + d)% n invece di controllare se k> = n e sottrarre se lo è? – avmohan
L'uso della sottrazione invece del funzionamento MOD è una ottimizzazione sottile, poiché l'operazione MOD (%) utilizza più cicli della CPU rispetto all'utilizzo della sottrazione e di un controllo if. E dall'algoritmo si può vedere che k non sarà mai maggiore di 2 * n. Quindi, fare una sottrazione è sufficiente. – Balasubramanian