for-parameter && hash-dateien



  • Ich habe 2 Fragen, die mir in einem c++ Lehrbuch aufgefallen sind.

    1. In diesem und einem anderen Buch steht, dass man eine Zähler-Zahl bei FOR (z.B. int i=0) nach einer For-Schleife nicht mehr verwenden kann, wenn sie innerhalb des For-Kopfes deklariert wurde. Wenn man Sie davor deklariert, ist es möglich sie in mehreren For-Schleifen zu benutzen. Aber meine eigenen Versuche haben das Gegenteil gezeigt.

    Zwei Bücher behaupten das geht nicht, aber es geht (bei mir):

    for( int i=0; i<100; ++i)
    {}
    
    // Mit i arbeiten. (i=100).
    
    for( i=0; i<50; ++i)
    {}
    
    // I ist auch hier verfügbar.
    

    Kann mir jemand definitiv sagen, wann und wie i verfügbar ist?

    2. Frage (etwas ganz anderes):
    Das Buch erläutert u.a. die Anwendungen von Hash-Funktionen, mit denen man also z.B. aus Kundennummern eine Speicheradresse in einer Datei ermitteln kann. Also so: speicherposition = kundennr % max_speicheradresse. Das dabei Kollisionen beachtet werden müssen ist jetzt nicht wichtig. Das Buch schreibtt nun, dass eine gleichmäßige speicherverteilung der Kundendaten vorliegt, wenn max_speicheradresse eine "genügend große Primzahl ist". Ich habe lange überlegt, aber komme nicht dahinter warum nicht auch normale Zahlen funktionieren, z.B. gerade Zahlen wie 100. Ein Test hat ebenfalls gezeigt, dass es geht.



  • zu 1

    Kann mir jemand definitiv sagen, wann und wie i verfügbar ist?

    Nein ist es nicht -- mein compiler sacht auch geht nicht 😃
    kann es sein dass du im prob weiter oben schon mal i deklariert hast???

    edit :
    sagst doch damit eine gleichmässige verteilung vorliegt ;
    anderer seit es geht doch .. klar gehts auch mit norm zahlen.
    aber ich denke die verteilung ist am besten wenn die anzahl die form 4*y+3 hat
    ..
    hoffe ist jetzt nicht vällig falsch 😞 ..naja ist ebend die "anzahl bei der alle slots belegt werden "
    leider sind meine mathematischen kenntnisse zubeschrenkt um dir den grund zu erläutern
    hoffe nicht schon wieder am thema vorbei 🤡



  • Das ist beim VC++ moegich.
    gcc gibt eine Feheler-Meldung aus:
    test.c:40: name lookup of `i' changed for new ANSI `for' scoping
    test.c:38: using obsolete binding at `

    Sir Gossi schrieb:

    Ich habe 2 Fragen, die mir in einem c++ Lehrbuch aufgefallen sind.

    1. In diesem und einem anderen Buch steht, dass man eine Zähler-Zahl bei FOR (z.B. int i=0) nach einer For-Schleife nicht mehr verwenden kann, wenn sie innerhalb des For-Kopfes deklariert wurde. Wenn man Sie davor deklariert, ist es möglich sie in mehreren For-Schleifen zu benutzen. Aber meine eigenen Versuche haben das Gegenteil gezeigt.

    Zwei Bücher behaupten das geht nicht, aber es geht (bei mir):

    for( int i=0; i<100; ++i)
    {}
    
    // Mit i arbeiten. (i=100).
    
    for( i=0; i<50; ++i)
    {}
    
    // I ist auch hier verfügbar.
    

    Kann mir jemand definitiv sagen, wann und wie i verfügbar ist?



  • Danke, ich habe tatsächlich VC++. Kann mir auch jemand das zweite beantworten, mit der Hash-Primzahl?



  • oh man joa bei ms vc++ gehts naja borland sacht ->

    [C++ Fehler] Unit1.cpp(11): E2451 Undefiniertes Symbol 'i'



  • // viel schlimmer ist,d as das beim vc++ nicht geht:

    for( int i=0; i<100; ++i) 
    {} 
    
    for(int i=0; i<50; ++i) 
    {}
    

    Ciao ...



  • Ja das ist schlimm. Aber weiß niemand eine Antwort auf meine zweite Frage?



  • Sir Gossi schrieb:

    Danke, ich habe tatsächlich VC++. Kann mir auch jemand das zweite beantworten, mit der Hash-Primzahl?

    Es geht mit den normalen Zahlen often ziemlich gut aber nicht immer. Sieh, bitte, nach dem Buch von Knut fuer die Einzelheiten. Im kurzem, wenn dein Zahl X nicht Primzahl ist und hat z.B. den Teiler 5, dann mit allen Hash-Funktionen die Tendenz haben die Zahlen die mit 5 teilbar sind zu generieren sind Addressen mehr als X/5 sehr selten benutzt.



  • Danke für den Hinweis. Da werd ich gleich mal nach googlen.

    Andererseits:
    Es wurden keine mit Ihrer Suchanfrage - "Buck von Knut" - übereinstimmenden Dokumente gefunden.

    Edit: Ist das ein Name (wie ich dachte= oder ist das Knut's Buck (ein ALgorythmus) ????



  • Sir Gossi schrieb:

    Danke für den Hinweis. Da werd ich gleich mal nach googlen.

    Andererseits:
    Es wurden keine mit Ihrer Suchanfrage - "Buck von Knut" - übereinstimmenden Dokumente gefunden.

    Edit: Ist das ein Name (wie ich dachte= oder ist das Knut's Buck (ein ALgorythmus) ????

    Entschuldigen: das Buch Von Knuth
    http://www-cs-faculty.stanford.edu/~knuth/taocp.html



  • Im kurzem, wenn dein Zahl X nicht Primzahl ist und hat z.B. den Teiler 5, dann mit allen Hash-Funktionen die Tendenz haben die Zahlen die mit 5 teilbar sind zu generieren sind Addressen mehr als X/5 sehr selten benutzt.



  • Ich bin ja bereit mich für mein Wissen zu bemühen, aber DAS (und dann auf Englisch) lese ich mir jetzt nicht durch!

    Deine Gleichung verstehe ich nicht:
    ist X die max_speiceradressenzahl oder eine kundennummer?

    wenn X die kundennummer ist: "wenn dein Zahl X nicht Primzahl ist..." -> bei der kundennummer ist es ja egal, ob primzahl oder nicht.

    wenn X die max_speicheradressen ist: "sind Addressen mehr als X/5 sehr selten benutzt" Aber ich teile doch an keiner Stelle die max_adressen durch die Kundennummer (falls 5 die Kundennummer ist) bzw. ich teile die max_adressen nicht durch die aktuelle speicherposition( falls 5 die aktuelle speicherposition ist).

    Also da seh ich nicht durch?!



  • Nun gut!
    X ist max_speiceradressenzahl und gar kein Kundenummer.
    in der letzten Meldung sage ich Quatch, die richtige Erklaerung:
    Lass X = 5 * A = max_speicheraddressenzahl sein, lass Y = 5 * B = kundenzahl sein.
    Dann X % Y = 5 * A - int (A/B) * 5 * B = 5 * (A % B).
    Das bedeuted dass alle deine addressen sind mit 5 teilbar wenn Kundenzahlen mit 5 teilbar sind. Das ist gar nicht zufaelig!



  • Die Kollisionen sind genau das Wichtige am Ganzen. Es geht darum die Anzahl der Kollisionen zu minimieren. Nur dann kommt die Leistungsfähigkeit des Hashing zum tragen.
    In kurzen Worten heisst dies, deine Hash-Funktion muss gewährleisten das deine Daten unabhängig von besonderen Werten gleichmässig im dem zur Verfügung stehenden Speicher verteilt werden. Nur so ist es möglich über die Hashfunktion, die gleichzeitig möglichst einfach, d.h. schnell berechenbar sein soll, direkt bei deinen Daten zu landen. Wenn du Kollisionen hast geht dieser Vorteil verloren.
    Wie du bei Knuth Band III Kapitel 6.4 nachlesen kannst, haben (grosse) Primzahlen diesbezüglich Vorteile in mathematischer Hinsicht. Als Gegenbeispiel führt er halt ne gerade Zahl M am, dabei tendiert h(k) ebenfalls zu einer geraden Zahl. Das heisst, die ungeraden "Plätze" in deinem Speicher bleiben leer und bei den geraden kommt es zu vermehrt Kollisionen. Das bedeutet, um diese Verhalten wiederum auszugleichen benötigst doppelt soviel Speicher. Für genauere Infos kann ich leider auch nur an Knuth weiterverweisen.

    Ist das einzige (Informatik-)Grundlagen Buch von dem ich mich nach meinen Studium nicht trennen konnte (kein Wunder bei dem Preis) 😃

    mfg JJ


Anmelden zum Antworten