HTML.it è il sito italiano del web publishing

[ALGORITMO] Uso di file "index" per ricerca in un vettore



scegli un altro forum
  Pagine (2): [ 1   2   > ]  Indietro   Ricarica   Avanti Invia una risposta

Autore
Discussione     
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ:

MSN:

Skype:


Index file
Salve a tutti, vorrei cortesemente porvi questa mia domanda riguardo un metodo di ricerca in un vettore di n elementi: in cosa consiste l'utilizzo del file index?

A quanto ho capito leggendo dal mio libro di programmazione (un po' datato a dir la verità) il file index è un vettore di indici (puntatori) che contengono l'indirizzo del record aggiunto al vettore in cui bisogna effettuare la ricerca e permette di superare l'inconveniente dell'algoritmo di ricerca binario che presuppone l'ordinamento del vettore prima della ricerca vera e propria. Qualcuno di voi potrebbe gentilmente spiegarmi, anche in breve, qual è il funzionamento di questo file index?

Vi ringrazio

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 18-04-2012 22:51
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


Esempio in brevissimo:

Ho questo file (facciamo finta che invece che 4 siano 4 milioni di records).

file:
1 pippo
5 topolino
2 pluto
0 minnie

Ho questo indice .

indice:
0 3
1 0
2 2
5 1

Problema: Devo caricare il record con chiave 5 ([5, topolino]) dal file ma il file non è ordinato:

Apro l'indice ( in questo esempio l'indice deve essere ordinato, in realtà si usano strutture come BTREE perchè mantenere in ordine un indice costa troppo a meno che le modifiche al file siano molto rare).

Faccio una ricerca binaria sull'indice per trovare la posizione numero 5 con complessita o(log n)

Apro il file e leggo il record numero 1 in tempo costante.

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 19-04-2012 10:01
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


Esempio in brevissimo:

Ho questo file (facciamo finta che invece che 4 siano 4 milioni di records).

file:
1 pippo
5 topolino
2 pluto
0 minnie

Ho questo indice .

indice:
0 3
1 0
2 2
5 1

Problema: Devo caricare il record con chiave 5 ([5, topolino]) dal file ma il file non è ordinato:

Apro l'indice ( in questo esempio l'indice deve essere ordinato, in realtà si usano strutture come BTREE perchè mantenere in ordine un indice costa troppo a meno che le modifiche al file siano molto rare).

Faccio una ricerca binaria sull'indice per trovare la posizione numero 5 con complessita o(log n)

Apro il file e leggo il record numero 1 in tempo costante.

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 19-04-2012 10:09
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ :

MSN :

Skype :


come si ordina il file index? si ordina a seconda degli indici oppure a seconda di quello che puntano?

e cosa cambia dall'ordinamento diretto sul vettore con conseguente ricerca binaria? Conviene l'uso del file index o no?


__________________
http://premiatinavigando.weebly.com/

Ultima modifica ad opera dell'utente robe92 il 22-04-2012 alle 01:15

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 22-04-2012 01:01
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


conviene l'uso del file index: lo devi decidere tu sulla base della comprensione di cosa fa un indice, se hai un vettore di int non ha senso, di solito, creare un indice di accesso, tanto vale ordinare il vettore, ma se hai un file dati con milioni di records ha senso avere un indice.

Solo per semplicità inizialmente si studiano indici su vettori di interi, dove non ha senso avere indici.

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 23-04-2012 10:16
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da robe92
come si ordina il file index? si ordina a seconda degli indici oppure a seconda di quello che puntano?


Non hai risposto a questa domanda, grazie comunque


__________________
http://premiatinavigando.weebly.com/

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 24-04-2012 16:01
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


Non c'entra nulla l'ordinamento con gli indici, l'ordinamento è solo una delle possibilità.

Se usi l'ordinamento devi ordinare l'indice in base ai valori contenuti nel vettore.

Serve esempio?

Ciao

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 24-04-2012 16:05
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Who am I
Utente bannato



Registrato il: Apr 2012

Provenienza:

Messaggi: 518


ICQ :

MSN :

Skype :


Nell' esempio che ha fatto sono ordinati secondo l' indice, infatti la sequenza {0,1,2,5} è crescente.

Segnala ad un moderatore | IP: Collegato | Permalink

Who am I è offline Old Post 24-04-2012 16:19
Clicca qui per vedere il profilo dell'utente Who am I Clicca qui per inviare all'utente Who am I un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Who am I Aggiungi l'utente Who am I alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ :

MSN :

Skype :


Non capisco come si possa ordinare mediante l'indice, non lo capisco proprio
Sì, mi servirebbe un altro esempio se non ti dispiace


__________________
http://premiatinavigando.weebly.com/

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 24-04-2012 18:09
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ :

MSN :

Skype :


up


__________________
http://premiatinavigando.weebly.com/

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 25-04-2012 22:45
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


Esempio banale:

codice:
#include <stdio.h>
#include <stdlib.h>
int compare_int(const void * a, const void * b){   
   return (*(int*)a) - (*(int*)b);
}

int main (int argc, char **argv)
{   /*Dichiarazioni*/   
   struct _record
   {
      int id;
      char nome[30];
   } record [] =
   {
       {1, "pippo"}
      ,{5, "topolino"}
      ,{2, "pluto"}
      ,{0, "minnie"}      
   };                                              /*array di record di esempio da trovare*/
   
   size_t elem_size = sizeof(struct _record);      /* dimensione di un record */   
   size_t elem_count = sizeof(record) / elem_size; /* quanti record nell'array */   
   int * indice;                                   /* indice */   
   int i;                                          /* contatore */   
   int find;                                       /* elemento da trovare */
   int *trovato;                                   /* elemento trovato */

   /* Implementazione */      
   
   indice = (int*)malloc(sizeof(int)*elem_count);  /*1) Allocazione memoria */   
   if(indice==NULL) return 1;

   for(i=0;i<elem_count;++i)                       /*2) riempimento indice */
      indice[i] = record[i].id;   
   
   qsort(indice, elem_count, sizeof(int), compare_int); /*3) Ordinamento indice*/   
   
   find = 2;                                       /*4) cerco il record con id = 2 */    
   trovato = (int*)bsearch(&find, indice, elem_count, sizeof(int), compare_int);
      
   if(trovato != NULL)                             /*5) stampa risultato */
      printf("Record trovato:nID: %d nNome: %sn", record[*trovato].id, record[*trovato].nome);
   else
      printf("Non trovaton");
   
   free(indice);                                   /*6) liberazione memoria allocata */
}

Ultima modifica ad opera dell'utente Andrea Simonassi il 26-04-2012 alle 10:02

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 26-04-2012 09:37
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
robe92
Utente di HTML.it



Registrato il: Feb 2012

Provenienza: Bari

Messaggi: 51


ICQ :

MSN :

Skype :


Ti ringrazio per questo esempio che, ahimè, è ancora fuori dalla portata della mia comprensione. Ad ogni modo sarebbe bastato anche un altro esempio come quello precedente che mi illustri il funzionamento di questo benedetto index file. Fin ora ho capito che è un vettore di puntatori (indici) ai record di un vettore detto "file storico" e permette l'ordinamento virtuale di questo. Ciò che non mi è chiaro ancora è come fa ad ordinare il vettore puntato


__________________
http://premiatinavigando.weebly.com/

Segnala ad un moderatore | IP: Collegato | Permalink

robe92 è offline Old Post 26-04-2012 12:37
Clicca qui per vedere il profilo dell'utente robe92 Clicca qui per inviare all'utente robe92 un messaggio privato Visita l'homepage dell'utente robe92 Visualizza ulteriori messaggi scritti dall'utente robe92 Aggiungi l'utente robe92 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


il vettore puntato non è ordinato, è ordinato l'indice.

Peraltro il mio esempio è pure sbagliato...

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 26-04-2012 13:12
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Who am I
Utente bannato



Registrato il: Apr 2012

Provenienza:

Messaggi: 518


ICQ :

MSN :

Skype :


Serve una coppia (indice, chiave), così se si cerca una chiave si fa una ricerca binaria su tutte le coppie, quando si trova la coppia giusta si guarda nel file (simbolicamente rappresentato dall' array record) l' indice che corrisponde alla chiave cercata.
Il problema era che prima di ordinare l' array dovevi tenere traccia di quelli che erano gli indici originali delle chiavi.
Ho rivisionato il tuo codice e la struttura l' ho chiamata index (mi accorgo ora che il nome non è molto significativo perché in realtà è una coppia), facendo la bsearch su tutte le coppie e andando a guardare il risultato nell' array record avente come indice il campo "indice" della coppia trovata.

codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int valore_chiave;
    int indice;
}index;


int compare_index (const void* a, const void* b)
{
    return ((index*)a)->valore_chiave - ((index*)b)->valore_chiave;
}


int main (int argc, char **argv)
{   /*Dichiarazioni*/   
    struct _record
    {
        int id;
        char nome[30];
    } record [] =
    {
        {1, "pippo"}
        ,{5, "topolino"}
        ,{2, "pluto"}
        ,{0, "minnie"}      
    };                                              /*array di record di esempio da trovare*/
    
    size_t elem_size = sizeof(struct _record);      /* dimensione di un record */   
    size_t elem_count = sizeof(record) / elem_size; /* quanti record nell'array */ 
    index* indice;
    int i;                                          /* contatore */   
    index find;                                       /* elemento da trovare */
    index *trovato;                                   /* elemento trovato */
    
    /* Implementazione */      
    
    indice = (index*)malloc(sizeof(index)*elem_count);  /*1) Allocazione memoria */  
    if(indice==NULL) return 1;
    
    for(i=0;i<elem_count;++i)                       /*2) riempimento indice */
    {
        indice[i].valore_chiave = record[i].id;  
        indice[i].indice=i;
    }
    
    qsort(indice, elem_count, sizeof(index), compare_index); /*3) Ordinamento indice*/   
    
    find.valore_chiave=5;                                          
    trovato = bsearch(&find, indice, elem_count, sizeof(index), compare_index);
    
    if(trovato != NULL)                             /*5) stampa risultato */
        printf("Record trovato:nID: %d nNome: %s", record[trovato->indice].id,record[trovato->indice].nome);
    else
        printf("Non trovato");
    
    free(indice);                                   /*6) liberazione memoria allocata */
}

Segnala ad un moderatore | IP: Collegato | Permalink

Who am I è offline Old Post 26-04-2012 14:36
Clicca qui per vedere il profilo dell'utente Who am I Clicca qui per inviare all'utente Who am I un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Who am I Aggiungi l'utente Who am I alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Andrea Simonassi
Utente di HTML.it



Registrato il: Jun 2001

Provenienza: Genova

Messaggi: 672


ICQ :

MSN :

Skype :


Grazie , sapevo che l'errore era li e sapevo come correggere, il fatto è che ho copiato del mio vecchio codice e l'ho adattato alla bellemmeglio per semplificarlo al massimo, il mio indice era una coppia di puntatori void, uno che puntava alla chiave e l'altro al record e utilizzava un puntatore a funzione per selezionare l'elemento chiave dato un puntatore ad un record, ma metterlo giu cosi mi pareva complesso da spiegare.

codice:
#include <stdlib.h>
#include "indice.h"
/* IMPLEMENTAZIONE INDICE */

struct _indice
{
   void* chiave;
   void* puntatore;
};


struct _indice * creaindice(void * v, size_t element_size, size_t l, void*(*key_selector)(void*), int(*comparer)(const void*, const void*))
{
   size_t i;
   struct _indice * pindex = (struct _indice *)malloc(sizeof(struct _indice)*l);

   if(pindex==NULL)return NULL;

   for(i = 0; i<l;++i)
   {
      pindex[i].chiave = (void*)key_selector(v);
      pindex[i].puntatore = v;
      v = (void*)((char*)v + element_size);
   }
   qsort (pindex, l, sizeof(struct _indice), comparer);

   return pindex;
}

void * sfogliaindice(struct _indice * indice, size_t len, void * key, int(*comparer)(const void*, const void*))
{
   struct _indice elem;   /*elemento da cercare nell'indice*/
   struct _indice * pItem;

   elem.chiave = key;
   elem.puntatore = NULL;
   
   pItem = (struct _indice *) bsearch (&elem, indice, len, sizeof (struct _indice), comparer);

   if(pItem == NULL) return NULL;
   return pItem->puntatore;
}

Ultima modifica ad opera dell'utente Andrea Simonassi il 26-04-2012 alle 15:19

Segnala ad un moderatore | IP: Collegato | Permalink

Andrea Simonassi è offline Old Post 26-04-2012 15:14
Clicca qui per vedere il profilo dell'utente Andrea Simonassi Clicca qui per inviare all'utente Andrea Simonassi un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Andrea Simonassi Aggiungi l'utente Andrea Simonassi alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Tutte le ore sono con fuso orario CET. Ora sono le 01:19.     

  Pagine (2): [ 1   2   > ]  Ultima discussione   Prossima discussione Invia una risposta
Versione per la stampa | Invia il thread via email | Ricevi aggiornamenti sul thread | Scarica il thread
 

Cerchi un argomento specifico e hai fretta? Usa il motore di ricerca