Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Ottimizzare gli accessi ad una tabella di dominio
Forum - Algoritmi - Ottimizzare gli accessi ad una tabella di dominio

Avatar
Moroboshi_84 (Normal User)
Newbie


Messaggi: 2
Iscritto: 08/07/2011

Segnala al moderatore
Postato alle 17:49
Venerdì, 08/07/2011
Salve a tutti,
immaginate di avere dei dati da validare che appartengono ad un dominio predefinito in una tabella e di voler anche raggruppare i dati cercando di scoprire a quel determinato valore quante occorrenze esistono (quindi se ci sono dati non presenti nella tabella comunque per quel valore bisogna indicare quante volte è presente nell'input da validare).

Attualmente ho implementato una soluzione che non mi convince molto sull'effettivo risparmio di tempi macchina (ci sono troppi confronti e letture).

In una struttura di swich mi chiedo (sarebbe gradito anche un aiuto sulla strategia da seguire nelle condizioni da porsi per prima):

1)Il codice da validare è valorizzato(non ha senso cercarlo in tabella)?
2)La chiave da ricercare è uguale all'ultima elaborata(la chiave è già presente in memoria)?
3)E' la prima chiave da ricercare(cioè la tabella di supporto è ancora vuota)?
4)La chiave da ricercare è uguale all'ultima memorizzata nella tabella di supporto?
5)La chiave da ricercare è uguale alla prima memorizzata nella tabella di supporto?
6)La chiave da ricercare è maggiore dell'ultimo elemento nella tabella di supporto(quindi bisogna inserire all'ultima posizione)?
7)La chiave da ricercare è minore del primo elemento della tabella di supporto(quindi bisogna inserire alla prima posizione e slittare i restanti)?
8)se nessuna delle precedenti faccio partire la funzione Ricerca binaria per trovare la posizione dell'elemento e se non trovato dove va inserito (naturalmente la ricerca binaria parte da 2 come limite basso e max -1 come limite massimo).

Fatto ciò mi chiedo se ho trovato l'elemento (setto un flag nelle domande precedenti) altimenti eseguo la query e l'inserimento dalla posizione da inserire fino a fine.

La ricerca binaria ovviamente è leggermente modificato in modo tale da derminare anche la posizione per l'eventuale inserimento in questa maniera:

Finchè vale non-trovato cicla (il flag può valere non trovato, trovato e da inserire).
Nel ciclo
se inizio è minore di 1 o fine è maggiore della massima posizione c'è un errore nel codice
determina la posizione mediana  = inizio + fine / 2
indice corrente a posizione mediana
indice precedente a posizione mediana - 1
indice successore a posizione mediana +1
Switc dove mi chiedo:
1)il valore puntato da corrente è uguale a ricercato (esci per trovato)?
2)il valore puntato da precedente è uguale a ricercato (esci per trovato)?
3)il valore puntato da successivo è uguale a ricercato(esci per trovato)?
4)il valore puntato da corrente è maggiore di quello ricercato e minore da quello puntato da precedente (aggiungi un posto in tavola e setta da inserire)?
5)il valore puntato da corrente è minore di quello ricercato e maggiore da quello puntato da successivo (aggiungi un posto in tavola e setta da inserire)?
6)vale non trovato allora reimposta i nuovi limiti (cioè se il valore puntato da corrente è maggiore del ricercato allora la fine vale il valore mediano - 1, altrimenti l'inizio vale il valore mediano + 1)
7) se nessuna delle precedenti errore nel codice

Grazie per ogni eventuale risposta.
Ps: naturalmente se volete il codice per una lettura più veloce lo posterò.
ControPS: un alternativa all'ambaradan è definire un cursore ordinato ed usare una multifech e fare quindi un unica chiamata al DB e poi su questa struttura precaricata fare lo stesso giro descritto su.

PM