Problem beim Hashen



  • Hallo allerseits,

    ich habe versucht, mit einfachsten Mitteln (auch wenn es erfahrene Programmierer wsl zum Weinen bringt) eine Hashtabelle anzulegen und zu füllen. Das Problem ist jetzt, dass der Wert 4 nicht auf seinen Platz gehasht wird und auch die 25 nicht (ich weiß, die Kollisionsbehandlung ist mies, aber ich wollte es nur mal für diese 4 Werte ausprobieren, ob es so mal funktionieren würde).

    Hättet ihr einen Tipp, warum die 4 und die 25 nicht auf "ihre Plätze" kommen? Wahrscheinlich ist der Fehler offensichtlich, aber ich komme einfach nicht darauf 😞

    Wäre also sehr dankbar für einen Tipp, wo der Fehler sein könnte 🙂

    MfG,
    Charlie

    #include <iostream>
    using namespace std;
    
    int main(){
    
    	int keyarray[4]={1,4,17,25};
    	int stelle=0;
    	int hashtable[8]={0};
        	int letztestelle;
    
    	cout<<"Keyarray"<<endl;
    
    	for (int i=0; i<=3; i++) {
    		cout<<keyarray[i]<<" ";
    	}
    
    	cout<<endl;
    
    	cout<<"Unbefuellte Hashtabelle"<<endl;
    
    	for (int i=0; i<7; i++) {
    		cout<<hashtable[i]<<" ";
    	}
    
    	cout<<endl;
    
    	for (int i=0; i<7; i++){
    
    		if ((hashtable[i]==0)){
    
    			stelle=(keyarray[i]) % 7; 
    			hashtable[stelle]=keyarray[i];
    
    		}
    
    		if (i>=10) {
    			letztestelle=keyarray[i] % 10;
    		}
    
    		if (i<10) {
    			letztestelle=keyarray[i] % 1;
    		}
    
    		if (hashtable[i]!=0) {
    			stelle=keyarray[i] % 7+letztestelle*3 % 7;
    		}
    
    	}
    
    	cout<<"Befuellte Hashtabelle"<<endl;
    
    	for (int i=0; i<=7; i++){
    		cout<<i<<"  "<<hashtable[i]<<endl;
    	}
    
    	return 0;
    }
    


  • Ich hab nen Tipp für dich: Benutze einen der std::unordered_ Container.



  • Hallo Charlie.,

    ich nehme mal Bezug auf diesen Teil:

    for (int i=0; i<7; i++){
    
            if ((hashtable[i]==0)){ 
    
                stelle=(keyarray[i]) % 7; 
                hashtable[stelle]=keyarray[i]; 
    
            } 
    
            ...
        }
    

    Ich glaube nicht, dass du von 0 bis 6 iterieren willst, oder?
    Du möchtest doch wahrscheinlich nur von 0 bis 3 iterieren (Anzahl der Elemente, die du einordnen möchtest)

    Nun zu deiner Frage, warum 4 und 25 nicht eingeordnet werden.

    Du fügst als erstes eine 1 ein, die an Position 1 landet. Im zweiten Schleifendurchlauf, überprüfst du , ob Position 1 belegt ist und die Bedingung ist nicht erfüllt.

    Analog dazu landet die 17 auf Position 3 und für 25 ist die Bedingung nicht erfüllt.

    Du möchtest wohl eher etwas wie:

    for (int i=0; i<4; i++){
    
            if ((hashtable[keyarray[i] % 7]==0)){ 
    
                stelle=(keyarray[i]) % 7; 
                hashtable[stelle]=keyarray[i]; 
    
            } 
    
        }
    

    Die 25 wir hier auch nicht eingefügt, da der Platz belegt ist und dann müsste eine Kollisionsbehandlung greifen.

    Gruß,
    XSpille



  • Vielen Dank!

    Ja ich hatte die Schleife ursprünglich von 0 bis 3, habe das dann aber geändert, da ich dachte, das wäre das Problem..

    Und danke, wegen den Plätzen, jetzt, wo du es erklärt hast, ist es logisch 🙂 Aber alleine komme ich auf solche Fehler fast nie drauf 😞
    Also, vielen vielen Dank!! 🙂


Anmelden zum Antworten