|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Oct 2005
Città: Roma
Messaggi: 17
|
Minimo in sequenza ciclicamente ordinata
Intanto per chi non lo sapesse una sequenza ordinata di n elementi distiniti a1,a2,...,an si dice ciclicamente ordinata quando il piu' piccolo elemento e' ai , per un qualche indice i non noto, e la sequenza ai,ai+1,...,an,a1,...,ai-1 e' ordinata in modo crescente.
Praticamente il problema e' di fare l'algoritmo che calcola il minimo di una sequenza ciclicamente ordinata di n elementi in tempo O(logn). Pensavo di basarmi sull'algoritmo della ricerca binaria, visto che effettuando una ricerca sequenziale sicuramente il tempo e' maggiore di O(logn), pero' ci deve essere qualcosa che mi sfugge qualcuno sa darmi qualche indicazione? Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fammi capire...tu hai giò una sequenza ordinata ciclicamente e devi trovare il minimo ai ?
Se è così puoi proprio fare con una ricerca binaria: int ricercabinaria(int *v, int i, int inizio, int fine) inizio e fine sono i limiti di ricerca e ti serviranno per calcolarti gli spostamenti (si inizializzano a 0 e N-1 nella prima chiamata)... La condizione di arresto è questa (attento agli estremi): if(a[i+1] >= a[i] && a[i-1] > a[i]) attento che non funziona nel caso particolare in cui tutti i numeri siano uguali Altrimenti vai a valutare due indici per spostarti nella direzione giusta di ricerca: if(a[inizio + (i - inizio) / 2] >= a[i]) Chiami ricorsivamente la ricerca sull'elemento inizio + (i - inizio) / 2 (attento ai parametri da passare) ifif(a[i + (fine - i) / 2] >= a[i]) Chiami ricorsivamente la ricerca sull'elemento i + (fine - i) / 2 (attento anche qui ai parametri da passare) |
|
|
|
|
|
#3 | |||
|
Junior Member
Iscritto dal: Oct 2005
Città: Roma
Messaggi: 17
|
Quote:
Quote:
Quote:
Grazie intanto dell'aiuto. |
|||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La seconda condizione l'ho sbagliata
if(a[i + (fine - i) / 2] > a[i]) return ricercabinaria(a, i + (fine - i) / 2, i, fine); Per l'altro if la chiamata diventa: ricercabinaria(a, inizio + (i - inizio) / 2, inizio, i); |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:51.



















