[Matematica pura, fisica, chimica, ecc.: problemi di allenamento del cervello non legati in alcun modo al commercio - pagina 584

 
alsu:

In un solo passaggio:

Creare una copia vuota di una matrice della stessa dimensione, inizializzarla con due.

Partire dall'inizio della matrice. Incontro 1 - scrivere alla copia dall'inizio, incontro 3 - scrivere alla copia dalla fine.


E l'inizializzazione a due (66% inutile in media) non è un passaggio?
In più devi monitorare i tre puntatori allo stesso tempo!
 
GaryKa:

Ti darò un piccolo compito.

Certo, è un hack, ma ai colloqui di lavoro funziona come un'apoteosi della conoscenza dell'ordinamento degli array ))


Quindi, il compito di ordinare

C'è una matrice di N celle, in cui gli uno, i due e i tre sono messi in ordine casuale.

Costruire il miglior algoritmo di ordinamento.


Contare in un passaggio, riempire l'array nel secondo passaggio.
 
alsu:

In un solo passaggio:

Creare una copia vuota di una matrice della stessa dimensione, inizializzarla con due.

Partire dall'inizio della matrice. Se si incontra 1, si scrive sulla copia dall'inizio; se si incontra 3, si scrive sulla copia dalla fine.

Senza copia (o direte che riempire la copia è un passaggio separato).

n=0, m=0

Inizia all'inizio dell'array. Se incontriamo 1 - lo cambiamo con n-esimo elemento dall'inizio, non uguale a 1 (per costruzione sarà sempre 2), n++; se incontriamo 3 - lo cambiamo con m-esimo elemento dalla fine, non uguale a 3, m++, e se incontriamo 1, seguiamo i passi della prima parte.

 
alsu:

Senza copia (o direte che riempire la copia è un passaggio separato)

n=0, m=0

Partiamo dall'inizio della matrice. Se incontriamo 1, lo cambiamo con n-esimo elemento dall'inizio non uguale a 1 (per costruzione sarà sempre 2), n++; se incontriamo 3, lo cambiamo con m-esimo elemento dalla fine non uguale a 3, m++, e se incontriamo 1, procediamo come descritto nella prima parte.


una media di mezzo passaggio, più la stessa quantità di tempo per gli scambi
 
alsu:

Senza copia (o direte che riempire la copia è un passaggio separato)

n=0, m=0

Partiamo dall'inizio della matrice. Se incontriamo 1, lo cambiamo con n-esimo elemento dall'inizio non uguale a 1 (per costruzione sarà sempre 2), n++; se incontriamo 3, lo cambiamo con m-esimo elemento dalla fine non uguale a 3, m++, e se incontriamo 1, procediamo come descritto nella prima parte.



Questo è un ottimo modo di andare.
 
alsu:
La riduzione del numero di passaggi non dà sempre un aumento della velocità.
 
Scambiare due elementi di una matrice sono 3 operazioni. È improbabile che sia più veloce.
 
TheXpert:
La riduzione del numero di passaggi non dà sempre un aumento della velocità.
Bene, il criterio di ottimalità non è fissato...
 
Permettetemi di sollevare una questione:
A+B=...
 
alsu:

Senza copia (o direte che riempire la copia è un passaggio separato)

n=0, m=0

Partiamo dall'inizio della matrice. Se incontriamo 1, lo cambiamo con n-esimo elemento dall'inizio non uguale a 1 (per costruzione sarà sempre 2), n++; se incontriamo 3, lo cambiamo con m-esimo elemento dalla fine non uguale a 3, m++, e se incontriamo 1, procediamo come descritto nella prima parte.



Buona idea.