Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 14.02.13 18:06 
Oha. Ich und BigO :lol:
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
binäre Suche auf sortierter Liste
Das fasziniert mich. Kannst du mal kurz skizzieren, wie das geht? Typischerweise kann man bei Listen nicht in O(1) auf ein bestimmtes (das mittlere) Objekt zugreifen.
Nicht in verketteten Liste, klar. Da ists O(n/2), klar (falls man die Anzahl separat mitzählt). Aber wer will auch verketten, wenn man nicht muss ;) Auf Arrays ist jeder Zugriff O(1)...
Damit wird die gesamte Suche:
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Komplexität O(logn)

Aber wenn man unbedingt was verkettetes braucht, gibt's immer noch SkipListen. Wenn man die passend verdrahtet, könnte das auch gehen. Da würde man dann die Skips als so eine Art BTree setzen. Glaube ich :gruebel:


user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
also deutlich schlechter als O(1) für die Hashtable.
Da hast du aber nur 1/3 berechnet:
Hash berechnen: O(stringlänge)
Bucket finden: O(1) falls das ein Array ist, bei größerem Keyspace wirds wohl eine Sparselist, die ist langsamer
Eintrag in Bucket suchen: O(m) oder O(logm), je nachdem was da drunter hängt...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 14.02.13 19:47 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Aber wenn man unbedingt was verkettetes braucht, gibt's immer noch SkipListen. Wenn man die passend verdrahtet, könnte das auch gehen. Da würde man dann die Skips als so eine Art BTree setzen. Glaube ich :gruebel:

Du hattest was von InsertionSort und binärer Suche erzählt. Für InsertionSort in O(1) ("sofort") braucht man ja verkettete Listen. Und das dann mit binärer Suche... :)
Ok, SkipListen kannte ich noch nicht, aber das Vorgehen ist logisch. Vielleicht würde das tatsächlich gehen, aber man müsste diese "Skips" immer wieder reparieren...weil wenn man einen Eintrag löscht oder einfügt, dann ist die Mitte ja nicht mehr die Mitte ;) Einfügen wäre wohl dann O(logn)

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Da hast du aber nur 1/3 berechnet:
Hash berechnen: O(stringlänge)

Das stimmt.
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Eintrag in Bucket suchen: O(m) oder O(logm), je nachdem was da drunter hängt...

Eigentlich sollte die Hashtable so groß sein, dass es keine Kollisionen gibt. Bei Mathematiker waren es ja nur 5 Elemente, bei denen eine Kollision vorkam. Das m wäre also etwa 5/16000 ;) (im Durchschnitt)

Also wenn man grob genug ist, kommt für die Hashtable schon O(1) hin ;) Wir haben aber auch Algorithmen gehabt, bei denen man sagt, der braucht O(2^100+logn) = O(logn) :mrgreen: Die Notation ist nicht immer ganz praxisnah :P

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 14.02.13 20:19 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Du hattest was von InsertionSort und binärer Suche erzählt.
Da hatte ich mich wohl irgendwo selbst überholt :roll:

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Eintrag in Bucket suchen: O(m) oder O(logm), je nachdem was da drunter hängt...

Eigentlich sollte die Hashtable so groß sein, dass es keine Kollisionen gibt. Bei Mathematiker waren es ja nur 5 Elemente, bei denen eine Kollision vorkam. Das m wäre also etwa 5/16000 ;) (im Durchschnitt)
Um den Preis von hohem Speicherverbrauch. 16bit Keyspace mit je 4byte Daten sind 256kByte, das geht ja noch. Bei 32bit sind das dann schon 16GByte...

Wobei das dann auch wieder ein anderes Verfahren ist. WP sagt, das was du meinst heißt dann "dynamic perfect hashing". Ich kenn keinen, der das freiwillig für General-Purpose Klassen nimmt ;) Das was ich meine ist eine "array hash table". Kann man natürlich auch gern mit einer TList bauen, ist meistens einfacher.

Ging es in diesem Thread eigentlich um die effizienteste Speziallösung für das konkrete Problem oder was Allgemeines? Kann nämlich durchaus sein, dass ich hier Zeug meine, was gar keinen interessiert :D

OT: MurmurHash wär auch noch was, falls die KeyStrings viel länger werden (und so viele, dass man nicht einfach auf 1-2 Bytes runter-XORen kann, sondern die perfekte Verteilung im Keyspace braucht). Implementation in Delphi existiert, aber ohne Testvector etwas schwierig. Muss bei Gelegenheit mal die Testsuite portieren.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 14.02.13 20:31 
[quote="user profile iconMartok"(673345)]
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Wobei das dann auch wieder ein anderes Verfahren ist. WP sagt, das was du meinst heißt dann "dynamic perfect hashing". Ich kenn keinen, der das freiwillig für General-Purpose Klassen nimmt ;) Das was ich meine ist eine "array hash table". Kann man natürlich auch gern mit einer TList bauen, ist meistens einfacher.

Ich meine das dort erwähnte Open addressing. Statt Buckets mit Listen suche ich mir einfach deterministisch ein neues freies Slot. Das ist auch nicht schneller als mit Buckets, aber wie auch dort erwähnt, sollten pro Bucket sowieso nur max. 3 Elemente drin sein. Fällt also aus der O-Notation raus ;)

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ging es in diesem Thread eigentlich um die effizienteste Speziallösung für das konkrete Problem oder was Allgemeines?

Ich denke es ging um eine Speziallösung. Das Thema ist aber eigentlich schon gelöst, und ich werde mich jetzt auch zurückhalten. Versprochen :zwinker:

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 14.02.13 20:42 
Hallo,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ging es in diesem Thread eigentlich um die effizienteste Speziallösung für das konkrete Problem oder was Allgemeines? Kann nämlich durchaus sein, dass ich hier Zeug meine, was gar keinen interessiert :D

Auch wenn ich nichts alles verstehe, ist es meiner Meinung nach hochinteressant. Und Lernen kann man bei Euren Beiträgen eine Menge.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Ich denke es ging um eine Speziallösung. Das Thema ist aber eigentlich schon gelöst, und ich werde mich jetzt auch zurückhalten. Versprochen :zwinker:

Warum? Wie gesagt, mich interessiert dies sehr und ich denke auch andere.
Allein schon die Vielzahl der Möglichkeiten, so ein Suchproblem effektiv umzusetzen, ist faszinierend.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein