Angella Andrea - Italian Blog

Infinita passione per lo sviluppo software !
posts - 129, comments - 318, trackbacks - 7

My Links

News

MIT OpenCourseWare: I'm invested Wikipedia Affiliate Button


Sto leggendo:

Archives

Post Categories

Siti web realizzati

Siti web tecnici

Algoritmi – Calcolare il minimo di un array ordinato ruotato


Problema:

Dato un array di interi ordinato in modo crescente ma ruotato, calcolare il valore minimo.

Input:

Un vettore di interi.

Output:

Un intero che rappresenta il minimo elemento del vettore.

Esempio:

Dato l’array ordinato ruotato:

20, 30, 50, 108, 6, 8, 9, 19

il valore minimo e’ 6

Il mio ragionamento:

Fare una scansione totale dell’array avrebbe complessita’ O(n) e non sfrutterebbe l’informazione aggiuntiva che l’array e’ ordinato e ruotato.

Si puo’ allora pensare di fare una specie di ricerca binaria con complessita’ O(log(n)) guidata dal valore dell’elemento centrale dell’array e dell’elemento finale.

Se l’elemento finale e’ maggiore o uguale all’elemento centrale allora il minimo si trova nella prima meta’ dell’array altrimenti nell’altra. Nota che l’elemento centrale potrebbe essere il minimo solamente nel primo caso (questo motiva l’utilizzo di m invece che m-1 nel codice seguente).

La mia soluzione:

private static int InternalMin(int[] v, int a, int b)
{
    if (a == b) return v[a];

    int m = (a + b) / 2;

    return (v[b] >= v[m]) ? InternalMin(v, a, m) : InternalMin(v, m + 1, b);
}

public static int Min(int[] v)
{
    if (v == null) throw new ArgumentNullException("v");
    if (v.Length == 0) throw new ArgumentException("v must contain at least one element");

    return InternalMin(v, 0, v.Length - 1);
}

Print | posted on mercoledì 1 settembre 2010 22.34 |

Feedback

Gravatar

# re: Algoritmi – Calcolare il minimo di un array ordinato ruotato

Detto che non so cosa sia esattamente un array ordinato ruotato... dalla definizione del problema sembra che sia 2 array ordinati. A questo punto basterebbe guardare il primo elemento e gli elementi centrali e prendere il minimo no? Senza pensarci prendo il centrale e i due intorno e il primo e faccio il minimo. E farei sempre il minimo di 4 elementi. Quindi avrei un costo costante O(1). Però credo di non aver capito cosa sia un array ordinato ruotato.
01/09/2010 22.58 | sierrodc
Gravatar

# re: Algoritmi – Calcolare il minimo di un array ordinato ruotato

Ciao,

Sostanzialmente partendo da un array ordinato in modo crescente tipo:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Un passo di rotazione consiste nel prendere il primo elemento e farlo diventare l'ultimo o viceversa:

2, 3, 4, 5, 6, 7, 8, 9, 10, 1

o

10, 1, 2, 3, 4, 5, 6, 7, 8, 9

Con un numero arbitrario di passi puoi costruire un qualsiasi vettore ordinato ruotato.

La tua soluzione non funziona su entrambi gli esempi che ti ho mostrato adesso. Il migliore algoritmo che ho trovato e' logaritmico, come la ricerca binaria. Forse tu stavi assumendo che i due vettori ordinati avessero la stessa dimensione.

01/09/2010 23.34 | Andrea Angella
Gravatar

# re: Algoritmi – Calcolare il minimo di un array ordinato ruotato

ok. non sapevo cosa fosse un array ordinato ruotato. Ora è più chiaro.
02/09/2010 9.31 | sierrodc
Gravatar

# re: Algoritmi – Calcolare il minimo di un array ordinato ruotato

Chiedo scusa per il fatto che i miei requisiti non erano chiari. Fino ad ora neanch'io sapevo che cosa era :)
02/09/2010 12.35 | Andrea Angella
Comments have been closed on this topic.

Powered by: