Problema tabelle hash

di il
20 risposte

Problema tabelle hash

Buonasera,sto affrontando l'esame di algortimi in particolare le tabelle hash e mi sono imbatutto in questo esercizio che chiedeva di eliminarer degli elementi dalla tabella hash che stanno in una lista formata da coppie di chiavi valori :queste coppie sono 10:10 16:16 14:14 :11:14 23:25 13:12 il problema è che non mi elimina solo 11:14 e 13:12 dove ho sbaglio.Qua sotto ho allegato il codice,nel caso me lo potete modificare ,mi potet dire dove sbaglio cosi lo modifico?.

Grazie

void HTsplitList(THashTable *ht,TList listkey,TList *listOdd,TList *listEven){
   *listEven=list_create();
   *listOdd=list_create();
   while(listkey!=NULL){
     if(hashtable_search(ht,listkey->info.key)!=NULL){
         if(listkey->info.value %2==0)
         *listEven=list_insert(*listEven,listkey->info);
         else 
         *listOdd=list_insert(*listOdd,listkey->info);
     }    
      hashtable_delete(ht,listkey->info.key);
      listkey=listkey->link;
   }
   return;

20 Risposte

  • Re: Problema tabelle hash

    Non ho capito 

    Tu hai una lista piena THashTable *ht , di cuo ogni elemento ha un valore “hash” e una coppia di chiavi 

    10:10 16:16 … 11:14 23:25 13:12. 

    Lo scopo è eliminare gli elemento della lista, che hanno come coppia di chiavi una chiave pari e una dispari ?!

    Cosa serve TList listkey ?!

    Perchè separi in Pari e Dispari ?!

  • Re: Problema tabelle hash

    No io devo eliminare dalla tabella hash quegli elementi che stanno in una lista formata da questi valori :13:12 ,10:10 11:14 ,23:25 e la funzione mi elimina tutti tranne 13:12 e 11:14 sai perché?

  • Re: Problema tabelle hash

    Il TList Key contiene la lista delle chiavi da eliminare dalla tabella hash e mettere i valori in due liste lista valori pari e lista valori dispari 

  • Re: Problema tabelle hash

    Confermami queste domande 

    1. La lista TList listkey contiene queste chiavi?!  10:10 16:16 14:14  23:25
    2. La lista THashTable *ht contiene queste chiavi?! 10:10 16:16 14:14 11:14 23:25 13:12 

    Scusami ma non credo che stai frequentando l' università, Scrivi come un 12enne. Fai un mischiome nella descrizione del problema non capisco quello che scrivi.

    Cmq credo di aver capito cosa non funziona

  • Re: Problema tabelle hash

    1. Si contiene questi valori
    2. Si e vanno eliminate, è lo scopo della funzione 
  • Re: Problema tabelle hash

    Questa volta è omaggio per le prox volte il Prezzo è di 50 euro in cryptovalute preferibilmente monero.

    while(listkey!=NULL){
        if(hashtable_search(ht,listkey->info.key)!=NULL){    
           if(listkey->info.value %2==0)
                *listEven=list_insert(*listEven,listkey->info);
            else 
                *listOdd=list_insert(*listOdd,listkey->info);    
            
            hashtable_delete(ht,listkey->info.key);
            listkey=listkey->link; 
        }
     }

    Il delete deve essere fatto dentro l' if

    Non serve il return per una funzione ch restituisce void.

    Mi viene un dubbio 

    Se La lista TList listkey contiene le chiavi da eliminare

    10:10 16:16 14:14 23:25

     e la lista THashTable *ht contiene  

    10:10 16:16 14:14 11:14 23:25 13:12 

    È giusto che rimangono solo 11:14 e 13:12

    Hai concellato le chiavi che volevo eliminare e rimangono quelle che non matchano.

  • Re: Problema tabelle hash

    Però stanno nella lista delle chiavi da cancellare qindi non dovrebbero rimanere nella lista 

  • Re: Problema tabelle hash

     La lista TList listkey contiene le chiavi da eliminare

    presenti nella lista THashTable *ht . giusto ?!

    Correggimi se sbaglio

    Nella lista THashTable *ht abbiamo 10:10 16:16 14:14 11:14 23:25 13:12 

    ipotiziamo che  dentro TList listkey c'è una sola coppia ad esempio 10:10

    Il risultato sara che , THashTable *ht conterrà 16:16 14:14 11:14 23:25 13:12 

    ( Gli elementi che aveva all' inizio tranne l' elemento da cancellare la cui coppia è 10:10 )

    Giusto ?! 

    Se la risposta è SI significa che il codice che avevi postato all' inizio funzionava.

    La funzioneh ashtable_delete restituisce qualcosa ?!

    Se Passo Una coppia di chiavi che non esiste ad esempio 124:32 che succede ?! 

    Restituisce un codice  ?!

  • Re: Problema tabelle hash

    Però se passo la coppia 11:14 e 13:12 allora dovrebbe cancellarsi perché è presente nella hashtable 

  • Re: Problema tabelle hash

    29/12/2023 - mario_243 ha scritto:


    Però se passo la coppia 11:14 e 13:12 allora dovrebbe cancellarsi perché è presente nella hashtable 

    E si 

    Se La lista TList listkey contiene le chiavi da eliminare

    10:10 16:16 14:14 23:25

     e la lista THashTable *ht contiene  

    10:10 16:16 14:14 11:14 23:25 13:12 

    E dopo richiamo la funzione passando TList listkey solo 2 chiavi 11:14  13:12 

    La lista THashTable *ht dovrebbe seesere vuota

  • Re: Problema tabelle hash

    Non è una lista ma tabella hash e non sarà vuota perché già contiene alla base altri valori vanno eliminati le chiavi della lista TList list Key e rimangono solo i valori all inizio prima che li avessimo aggiunti nella tabella hash 

  • Re: Problema tabelle hash

    Buongiorno

    scusami se non ti ho risposto ma ieri ero incasinato 

    Riepilogando

    THashTable *ht è una tabella che contiene una serie di valori (tra cui hash) e come indicie ha una coppia di chiavi , ipotiziamo che al suo interno ci sono solo le seguenti coppie di chiavi : 10:10 - 16:16 - 14:14 - 11:14 - 23:25 - 13:12 

    TList listkey è una lista che contiene le chiavi che voglio eliminare dalla tabella THashTable* ht, ipotiziamo che contenga solo le seguenti chiavi : 10:10 - 16:16 - 14:14 - 23:25

    THashTable *ht = 10:10 - 16:16 - 14:14 - 11:14 - 23:25 - 13:12 

    TList listkey        = 10:10 - 16:16 - 14:14              - 23:25

    (quelli in rosso sono quelli eliminati)

    alla fine della funzione avro' la tabella THashTable *ht che conterrà solo le righe rimanenti le cui chiavi sono 11:14 e 13:12 

    Hai provato il codice che ti ho postato ?

    mi scrivi anche il corpo delle funzioni 

    hashtable_search

    hashtable_delete

    (se è possibile posta tutto il codice, facciamo prima)

    29/12/2023 - mario_243 ha scritto:


    Non è una lista ma tabella hash e non sarà vuota perché già contiene alla base altri valori vanno eliminati le chiavi della lista TList list Key e rimangono solo i valori all inizio prima che li avessimo aggiunti nella tabella hash 

    sostituisci il return con un funzione tipo listkey.clear() , “se esiste”  se non esiste implementala dentro l'oggetto TList 

    Attenzione la lista delle chiavi da eliminare TList listkey non è un puntatore come gli altri parametri ma un oggetto.

  • Re: Problema tabelle hash

    Ho provato il codice ma mi elimina sempre tutti tranne 13:12 e 11:14 che sono nella lista 

  • Re: Problema tabelle hash

    TValue *hashtable_search (THashTable* ht, TKey key) {
        unsigned h = keyHash(key) % ht->bucket_number;
            TInfo info = {key};
                TNode* node = list_search(ht->bucket[h], info);
                    if (node != NULL) 
                            return &node->info.value;
                                return NULL;
                                }
                                
Devi accedere o registrarti per scrivere nel forum
20 risposte