Eine kleine Hashtabelle (jetzt ohne Speicherlecks!)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@NTQ
das ist doch aber nur dann sinnvoll, wenn die haupttabelle nicht alphabetisch sortiert sein kann, oder?
weil, bei alphabetischer sortierung der grunddatensätze brauche ich
mit index-binärer suchmethode längst nicht so lange.
da kann ich mit 256 zugriffen einen von max. 2^256 datensätzen finden...
das ist doch aber nur dann sinnvoll, wenn die haupttabelle nicht alphabetisch sortiert sein kann, oder?
weil, bei alphabetischer sortierung der grunddatensätze brauche ich
mit index-binärer suchmethode längst nicht so lange.
da kann ich mit 256 zugriffen einen von max. 2^256 datensätzen finden...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ja, bei alphabetisch sortierten Datensätzen hast du quasi auch eine Art
Hashtabelle, nur ohne Hash.
Problematisch kann es dann allerdings werden, wenn alle oder viele der
Strings gleich anfangen, z.B. "Bild_Inhalt_#Text#.jpg", wobei #Text# sich
ändert.
Fügst du die Einträge durch einen Quicksort-Alogorhythmus in deine Liste ein,
dann geht es auch sehr schnell. Nachteil sind dabei die langsamen
LinkedLists, die sich nicht direkt per Index anspringen lassen, oder im Falle
von Arrays das Verschieben aller nachfolgenden Daten um eins nach hinten.
Es gibt viele Möglichkeiten, solche Aufgaben schnell zu erfüllen. Hashtabellen
sind die gebräuchlisten. Sie werden unter anderem auch bei SQL-Anfragen
verwendet, weil man nicht alle Spalten gleichzeitig sortieren kann. Und genau
das Problem hab ich auch in meiner Datenbank. Und da pflege ich die
Hashtabelle gerade ein.
///Edit:
Und wegen deinen 256 Zugriffen bei 2^256 Datensätzen. Dann erstell mal
eine Zugriffstabelle mit 2^256 Einträgen. Das möcht' ich seh'n.
Hashtabelle, nur ohne Hash.

Problematisch kann es dann allerdings werden, wenn alle oder viele der
Strings gleich anfangen, z.B. "Bild_Inhalt_#Text#.jpg", wobei #Text# sich
ändert.
Fügst du die Einträge durch einen Quicksort-Alogorhythmus in deine Liste ein,
dann geht es auch sehr schnell. Nachteil sind dabei die langsamen
LinkedLists, die sich nicht direkt per Index anspringen lassen, oder im Falle
von Arrays das Verschieben aller nachfolgenden Daten um eins nach hinten.
Es gibt viele Möglichkeiten, solche Aufgaben schnell zu erfüllen. Hashtabellen
sind die gebräuchlisten. Sie werden unter anderem auch bei SQL-Anfragen
verwendet, weil man nicht alle Spalten gleichzeitig sortieren kann. Und genau
das Problem hab ich auch in meiner Datenbank. Und da pflege ich die
Hashtabelle gerade ein.

///Edit:
Und wegen deinen 256 Zugriffen bei 2^256 Datensätzen. Dann erstell mal
eine Zugriffstabelle mit 2^256 Einträgen. Das möcht' ich seh'n.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
NicTheQuick hat geschrieben:///Edit:
Und wegen deinen 256 Zugriffen bei 2^256 Datensätzen. Dann erstell mal
eine Zugriffstabelle mit 2^256 Einträgen. Das möcht' ich seh'n.

es ging nur um das prinzip des index-binären suchens und wieviel zugriffe es benötigt,
und du hattest was von 256 zugriffen gesagt, deshalb.
bei den von dir angemerkten 1.000.000 datensätzen bräuchte ich mit IndBin max 20 zugriffe.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
pseudocode, ok
is jetzt ohne netz (keine prüfung auf Sprung < 1)
und mit nem Jump statt ner schleife...
aber prinzip sollte verstehbar sein...
..hoffe, ich hab mich nich vertan irgendwo, is halt mal runtergehackt...
PS:
http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche
Code: Alles auswählen
Anzahl = 100000
LoadArray( Wort$, Anzahl ) ; 100.000 sortierte strings ins Array Wort$()
Input Such$
Sprung = Anzahl / 2
Satz = Sprung
:LABEL:
Sprung / 2
If Wort$( Satz ) > Such$
Satz - Sprung
Jump LABEL
EndIf
If Wort$( Satz ) < Such$
Satz + Sprung
Jump LABEL
EndIf
If Wort$( Satz ) = Such$
Print "Gefunden in Satz";Str(Satz)
Else
Print "Nicht gefunden"
EndIf
und mit nem Jump statt ner schleife...
aber prinzip sollte verstehbar sein...
..hoffe, ich hab mich nich vertan irgendwo, is halt mal runtergehackt...
PS:
http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ah, klar, okay, dacht' ich's mir doch. Ein abgewandelter QuickSort-Algo zum
Finden von Strings. Wenn das Array einmal steht, ist das kein Problem.
Möchte man jetzt aber das Array on-the-fly füllen, dauert es wieder sein Zeit.
Natürlich könnte man es füllen und erst danach zum Suchen sortieren. Aber
was ist, wenn man es füllt, sucht, füllt, sucht, füllt, sucht, ... Vor jedem
Suchen muss es neu sortiert werden.
Jetzt kann man sich darüber streiten oder einfach sagen:
"Ich optimiere meinen Suchalgo auf mein Problem."
Und ich brauche eben eine Hashtabelle.
Finden von Strings. Wenn das Array einmal steht, ist das kein Problem.
Möchte man jetzt aber das Array on-the-fly füllen, dauert es wieder sein Zeit.
Natürlich könnte man es füllen und erst danach zum Suchen sortieren. Aber
was ist, wenn man es füllt, sucht, füllt, sucht, füllt, sucht, ... Vor jedem
Suchen muss es neu sortiert werden.
Jetzt kann man sich darüber streiten oder einfach sagen:
"Ich optimiere meinen Suchalgo auf mein Problem."
Und ich brauche eben eine Hashtabelle.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
ja is klar. für dynamische datenmengen ist eine hashtabelle bestimmt eine gute lösung.
z.b. bei nem textparser, fürn adventure oder nen Eliza-Clone, ist IndBin einfach unschlagbar,
weil man bei nem Realese eine komplette, vorsortierte Wortschatz-tabelle mitliefern kann.
z.b. bei nem textparser, fürn adventure oder nen Eliza-Clone, ist IndBin einfach unschlagbar,
weil man bei nem Realese eine komplette, vorsortierte Wortschatz-tabelle mitliefern kann.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Dann versuch mal mit Heapsort, meiner Erinnerung nach geht das dynamischeNicTheQuick hat geschrieben:Aber was ist, wenn man es füllt, sucht, füllt, sucht, füllt, sucht, ...
Vor jedem Suchen muss es neu sortiert werden.
Einfügen in einen Sortierten Heap dort sehr schnell. Wenn ich mal zu viel
Zeit hab, werd ich mich daran ev. mal versuchen.
Aber Hash-Table wird wohl trotzdem im allgemeinen Fall am schnellsten
sein, nicht umsonst wird es wohl so oft angewandt.
Ich kann leider Nichts zu der Diskussion beitragen, aber zumindest mit dem gewünschten Feedback dienen :
Es gehört zu den Dingen die noch auf meiner Liste stehen. Ich habe eine grobe Vorstellung davon WAS mein Programm tun soll. Für das WIE habe ich diese Liste die ich nun Schritt für Schritt abarbeite. Es wird also für mich interessant.
Unabhängig davon :
Es wäre schade wenn Du (oder jemand anderes) irgendetwas nicht realisieren würde weil er den Eindruck hat es würde niemanden interessieren. Wir Deutschen sind da wohl stark durch die Schwaben geprägt ("Nicht gemotzt ist genug gelobt."). Ich denke die Gemeinde ist so groß und vielfältig, daß es außer Frage steht ob irgendjemand etwas brauchen kann. Brauchen und gebrauchen ist allerdings zweierlei. Manche Perlen gehen wohl deshalb unter weil man um sie gebrauchen zu können schon fit sein muß.
Also hiermit an ALLE die dazu beitragen, daß das Forum eine riesige Schatzkiste ist : VIELEN DANK !
Damit meine ich nicht nur die Rubrik "Code, Tipps und Tricks".
@NicTheQuick : Ein Extra-Danke für die Erklärungen und Beispiele die Du i.d.R. mitlieferst.
Es gehört zu den Dingen die noch auf meiner Liste stehen. Ich habe eine grobe Vorstellung davon WAS mein Programm tun soll. Für das WIE habe ich diese Liste die ich nun Schritt für Schritt abarbeite. Es wird also für mich interessant.
Unabhängig davon :
Es wäre schade wenn Du (oder jemand anderes) irgendetwas nicht realisieren würde weil er den Eindruck hat es würde niemanden interessieren. Wir Deutschen sind da wohl stark durch die Schwaben geprägt ("Nicht gemotzt ist genug gelobt."). Ich denke die Gemeinde ist so groß und vielfältig, daß es außer Frage steht ob irgendjemand etwas brauchen kann. Brauchen und gebrauchen ist allerdings zweierlei. Manche Perlen gehen wohl deshalb unter weil man um sie gebrauchen zu können schon fit sein muß.
Also hiermit an ALLE die dazu beitragen, daß das Forum eine riesige Schatzkiste ist : VIELEN DANK !
Damit meine ich nicht nur die Rubrik "Code, Tipps und Tricks".
@NicTheQuick : Ein Extra-Danke für die Erklärungen und Beispiele die Du i.d.R. mitlieferst.