Suche Beispiele für Suchalgorithmen

BlueGene

Lt. Junior Grade
Registriert
Dez. 2006
Beiträge
493
Hallo,

ich bin auf der Suche nach Suchalgorithmen, die die entsprechenden Begriffe aus einer Liste heraussuchen und ausgeben. Der Algorithmus sollte dabei leicht nachvollziehbar sein, sodass man ihn anderen Leuten gut erläutern kann. Bisher habe ich nur mit Haskell in der Schule gearbeitet, wäre also von Vorteil, wenn jmd. einen Suchalgorithmus für Haskell kennt. Ansonsten kann es auch eine andere Programmiersprache sein, solange der Algorithmus nachvollziehbar ist.

Hab zwar schon selbst gesucht, jedoch nichts für Haskell gefunden.
 
Ein paar bekannte Algorithmen:


Du musst nur den Namen des Algorithmus und Haskell in eine bekannte Suchmaschine eingeben und schon findest du den Code für Haskell.
Bei Quicksort steht er sogar auf der dt. Wikipedia-Seite zu Haskell. ;)

*Edit: Mist. Das sind natürlich Sortieralgorithmen.
Lesen müsste man können...

Aber eine Suche ist noch einfacher.

Ein ganz simpler Code:
Code:
suche :: (Eq a) => [a] -> a -> [a]

suche [] y = []
suche (x:xs) y
      | (x == y) = [x]
      | otherwise = suche (xs) y
Das sucht dir ein Element in einer Liste und falls es gefunden wird, wird es auch ausgegeben, ansonsten ist die Liste leer.
 
Zuletzt bearbeitet:
Woraus besteht die Liste, was spricht gegen

Int i;
for i = 1 to (End of liste)
if suchbegriff = "Item(i)" then
Ausgabe oder speichere gefundenen begriff
end if
next i

gespeicherte Begriffe ausgeben, wenn sie vorher gespeichert wurden.
Ergänzung ()

@powerfx
er will eine Suchfunktion keine Sortierung.
 
Ja, hab ich auch schon gemerkt und nachgebessert... :)
 
Es kommt immer darauf an, wie die interne Datenstruktur aussieht.
Es gibt jetzt keinen allgemeingültigen, effizienten Algorithmus aber es gibt mehrere Wege, es effizient zu gestalten. Wenn die Daten unsortiert gespeichert werden, sollte man sich schon überlegen, wie man die Suche so effizient wie möglich gestalten kann.
Eine einfache For-Schleife, die jedes Element sucht, wäre zwar eine Möglichkeit, aber bei sehr großen Listen extremst ineffizient.

Ein effizienter Weg, wäre ein binärer Suchbaum als Datenstruktur. Ein binärer Suchbaum sorgt dafür, dass bei jedem Suchvorgang immer die Hälfte der Elemente wegfallen, bis eins oder gar keins übrig bleibt. Somit haben wir im schlimmsten Fall, bei einer Million Elemente, maximal 20 Suchvorgänge. Man muss dann lediglich den linken oder rechten Pfad folgen.
Zum Vergleich: Bei einer for-Schleife hätten wir eine Million Suchvorgänge!

Allerdings ist diese Datenstruktur ein wenig komplexer als ein Array mit Elementen, da die Datenstruktur hier dynamisch verwaltet wird. Man muss also selber Speicher allozieren und wieder freigeben.
Aber auch hier liegt ein Vorteil: Es steht immer genügend Speicher zur Verfügung und zwar immer soviel, wie auch gebraucht wird. Arrays haben eine feste Größe und was macht man, wenn man weitere Elemente speichern will, obwohl das Array schon voll ist? Hier muss man immer mühselig abfragen, ob noch Platz ist, wenn ja, speichern und wenn nein, muss neuer Speicher reserviert werden. Diese Abfrage fällt bei dynamischen Listen weg. Oder was passiert, wenn wir ein Array deklarieren, mit Platz für 1000 Elementen, wir aber nur 5 speichern? Dann haben wir unnötigen Speicherplatz verbraucht.

Ein Problem bei den binären Suchbäumen gibt es: Es wird davon ausgegangen, dass die Elemente unsortiert gespeichert werden. Aber was passiert, wenn die Elemente sortiert vorliegen?
Dann haben wir tatsächlich eine einfach verkettete Liste. Was den Baum ineffizient macht und wir hätten hier auch wieder unsere eine Million Suchvorgänge bei einer Million Elementen.

Um dies zu verhindern, wurde u.a. 1972 eine Erweiterung der binären Suchbäume entwickelt: Die Schwarz-Rot-Bäume.
Sie sind vom Aufbau nochmal komplexer, da es exakt auf den Aufbau ankommt. Aber hier wird der Baum korrekt ausbalanciert. Egal, wie die Werte gespeichert werden und wir erhalten einen sehr schnellen Suchvorgang.

Der einzige Nachteil bei Bäumen ist, dass wir immer pro Element einen gewissen Overhead haben, da die jeweiligen Zeiger (Ein Wegweiser zu einer Adresszelle im Speicher) mitgespeichert werden muss. Bei Schwarz-Rot-Bäumen muss auch noch zusätzlich die Farbe gespeichert werden.
Aber dieser Overhead lohnt sich, wenn man es sehr schnell haben will.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben