Problema tabelle hash

di mario_243 il
20 risposte

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

  • 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 ?!

  • 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é?

  • 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 

  • 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

    1. Si contiene questi valori
    2. Si e vanno eliminate, è lo scopo della funzione 
  • 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.

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

  •  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  ?!

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

  • 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

  • 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 

  • 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.

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

  • 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