Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » _sehr_ langen vektor durchsuchen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]
020
19.01.2009, 17:05 Uhr
kronos
Quotenfisch
(Operator)



Zitat von ~raps:
fuer einen sicheren hash brauchst du n*n als bitbreite, wobei n die bitzahl der moeglichen eintraege ist, also 250 000, ergo 36bit.
ansonsten ist es eine weak-hashtable die entsprechend buckets braucht, laufzeit ist somit O(n*log(n)).

eine bit-table ist hingegen linear O(n). fuer den fall vom threadstarter ist das die schnellste loesung. wie sich das hypotetisch unter anderen bendingungen verhaellt ist fuer diesen thread glaube ich nicht so sehr relevant. ich hab lediglich eine problemorientierte loesung vorgeschlagen.

Warum sollte es nur 250 000 mögliche Einträge geben?
2^32 = 4 294 967 296
2^64 = 2^64 = 1.84467441 × 10^19
Zweiteres ist mittlerweile nicht mehr selten.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
19.01.2009, 18:29 Uhr
0xdeadbeef
Gott
(Operator)


Lies dich bitte noch mal schlau über Hashtables. Was du da schreibst, ist stumpf nicht wahr.

Wenn wir von einer vernünftigen Hashtable ausgehen, d.h., einer ausreichend groß dimensionierten Hashtable (die Auslastung sollte nie über etwa 70-80% steigen) und eine vernünftige Hash-Funktion (z.B. Jenkin's one-at-a-time hash), die eine ausreichend gleichförmige und zufällige Verteilung hat, lässt sich abschätzen, dass ein Element in O(1) auslesbar ist. Die Mathematik dahinter greift auf Stochastik und Kombinatorik zurück und ist nicht ganz trivial; im Endeffekt läuft es darauf hinaus, dass ein Haufen Binomialkoeffizienten < 1 wegfallen.

Siehe auch http://en.wikipedia.org/wiki/Hashtable#Time_complexity_and_common_uses_of_hash_tables

Perfektes Hashing ist hier weder notwendig noch praktikabel. Dein Bit-Array dagegen verbraucht einen derart großen Haufen Speicher, dass es leicht zu Swapping führen kann und passt zweitens niemals in den CPU-Cache (Zusätzlich zu der vorher bereits bemerkten Abhängigkeit von Kernel-Details). Dass sich damit ein Laufzeitvorteil herausholen ließen, erscheint mir nach wie vor unrealistisch.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
20.01.2009, 10:22 Uhr
~raps
Gast



Zitat:

Zitat von ~raps:
fuer einen sicheren hash brauchst du n*n als bitbreite, wobei n die bitzahl der moeglichen eintraege ist, also 250 000, ergo 36bit.
ansonsten ist es eine weak-hashtable die entsprechend buckets braucht, laufzeit ist somit O(n*log(n)).

eine bit-table ist hingegen linear O(n). fuer den fall vom threadstarter ist das die schnellste loesung. wie sich das hypotetisch unter anderen bendingungen verhaellt ist fuer diesen thread glaube ich nicht so sehr relevant. ich hab lediglich eine problemorientierte loesung vorgeschlagen.

Warum sollte es nur 250 000 mögliche Einträge geben?


hast recht, sorry, 400 000 sagte ja der threadstarter.

Dieser Post wurde am 20.01.2009 um 11:48 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
20.01.2009, 10:49 Uhr
~raps
Gast



Zitat von 0xdeadbeef:
Lies dich bitte noch mal schlau über Hashtables. Was du da schreibst, ist stumpf nicht wahr.

Wenn wir von einer vernünftigen Hashtable ausgehen, d.h., einer ausreichend groß dimensionierten Hashtable (die Auslastung sollte nie über etwa 70-80% steigen) und eine vernünftige Hash-Funktion (z.B. Jenkin's one-at-a-time hash), die eine ausreichend gleichförmige und zufällige Verteilung hat, lässt sich abschätzen, dass ein Element in O(1) auslesbar ist. Die Mathematik dahinter greift auf Stochastik und Kombinatorik zurück und ist nicht ganz trivial; im Endeffekt läuft es darauf hinaus, dass ein Haufen Binomialkoeffizienten < 1 wegfallen.

ich sprach vom worst case, da du ja fuer die bittable auch vom worst case schriebst (mit boesen kernels die speicher auslagern, mit rumalllokieren dass es garnicht gibt etc.)

"theoretically the worst-case lookup time can be as bad as O(n)"


die bit-table ist im worst case O(1) beim zugriff.
die bit-table hat in jedem fall konstanten speicherverbrauch (im gegensatz zum nicht einschaetzbaren von deiner hashtable bzw. ueberlauf, je nach implementierung.)
die bit-table zugriffe sind schneller (ein cachemiss, besonders mit prefetching, braucht weniger als Jenkin's hash mit lauter RAW-hazards).




Zitat:

Dein Bit-Array dagegen verbraucht einen derart großen Haufen Speicher, dass es leicht zu Swapping führen kann und passt zweitens niemals in den CPU-Cache (Zusätzlich zu der vorher bereits bemerkten Abhängigkeit von Kernel-Details). Dass sich damit ein Laufzeitvorteil herausholen ließen, erscheint mir nach wie vor unrealistisch.

ja, kann schon verstehen dass du das noch nicht einschaetzen kannst, aber wenn du sowas mal selbst versuchst, wirst du auch sehen, dass diese simple methode alles andere in den schatten stellt was geschwindigkeit angeht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
20.01.2009, 14:00 Uhr
~raps
Gast


ich hab mir mal 30min meiner mittagspause genommen um zweil vanilla implementierungen zu machen.

bitte: http://rafb.net/p/YTJhYX63.html

resultat:
Intel 2.6GHz, 12MB Cache, 8GB Ram
BT: ca >4500ms
HT: ca >6000ms
(sorry, ich sitze da gerade nicht dran und hab nicht genauere werte im kopf
AMD 2.4GHz, 256KB Cache, 2GB Ram
BT: 8969ms
HT:17264ms

das hash template ist von stl_port, leider hab ich hier in der arbeit keine stream, deswegen printf, sorry.
hah ja, tab-size ist 2 (auch hier vorgeschrieben, sorry) und ich hab auch auf beiden rechnern winXP 32 hochgefahren (das ist doch das OS mit dem boesen paging, oder?)

compiliert mit VisualStudio05 und allen optimierungen.

ach ja, falls sich jemand meint die muehe machen zu muessen zu optimieren, dann bitte beides. ich hab bewust keine 'magic' eingebaut, weil das wohl einer normalen sauberen implementierung entsprechen wuerde.

so, guten mittag euch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
20.01.2009, 14:43 Uhr
~kronos
Gast


Du machst einen Denkfehler: Es gibt zwar nur 400k verschiedene Werte. Das heißt aber nicht, dass diese Werte zwischen 0 und 400k liegen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
20.01.2009, 15:02 Uhr
~raps
Gast



Zitat von ~kronos:
Du machst einen Denkfehler: Es gibt zwar nur 400k verschiedene Werte. Das heißt aber nicht, dass diese Werte zwischen 0 und 400k liegen!


sorry, aber



erste wert vom vector: 0xc37bc7f7
dazu mal im vergleich 400 000: 0x0061A80
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
20.01.2009, 19:47 Uhr
0xdeadbeef
Gott
(Operator)


Du gibst weder eine Größe für die Hashtable an, noch eine auf die erwarteten Werte zugeschnittene Hashfunktion. Natürlich ist das so langsam, was erwartest du denn? Wahrscheinlich kopiert das hash_set dauernd seine Daten hin und her und hasht die halbe Zeit neu. Davon abgesehen musst du natürlich die Implementierungen in zwei Prozesse auftrennen, sonst leidet der Lauf der Hashtable ggf. unter den selben Problemen, die die Bittable mit sich bringt. Swapping ist, wenn du gigabyteweise Speicher anforderst, durchaus eine ernstzunehmende Möglichkeit.

Bitte, tu uns allen den Gefallen und informier dich darüber, wie und unter welchen Bedingungen Hashtables funktionieren, und was man tun muss, damit sie das gut tun. Dieser Haufen, es tut mir leid, Bockmist zeigt lediglich, dass du nicht verstehst, worum es hier überhaupt geht.

Nachtrag: Oh, und natürlich ist der Speicherverbrauch deiner Bittable keinesfalls konstant, er skaliert mit der Registerbreite der CPU (wie bereits angemerkt). Schreib mir bitte mal eine Bittable-Implementierung für x86-64 - ich habe Gerüchte gehört, diese Architektur sei auf dem Vormarsch.

*grummel*Bitarrays für alle möglichen Werte, so ein Unfug...*grummel*
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.01.2009 um 19:49 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
21.01.2009, 00:38 Uhr
kronos
Quotenfisch
(Operator)



Zitat von ~raps:

erste wert vom vector: 0xc37bc7f7
dazu mal im vergleich 400 000: 0x0061A80


Höchster möglicher Wert im Vektor bei 32bit: 0xffffffff
In deine Tabelle passt nicht einmal 0xdeadbeef...
*plonk*
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 21.01.2009 um 00:39 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
21.01.2009, 01:25 Uhr
0xdeadbeef
Gott
(Operator)


Er kriegt acht Werte in ein Byte, scheinbar reicht der Speicherbereich des Vektors hier von 0xa37bc7f7 bis 0xc37bc7f7. Die Platzierung verwundert mich ein bisschen; scheinbar legt sein Betriebssystem ein sehr großes Heapsegment an, was wohl der Grund sein dürfte, warum das ganze überhaupt funktioniert.

Natürlich bräuchte er auf einer 64bit-Maschine über 2 Exabyte für diesen Scherz (und eine Menge Zeit, während die Maschine den Speicher nullt), und auf einer 32bit-Plattform wird es mit weiteren 400 MB auf dem Heap, sonstigem Verbrauch des Programms, anderer Programme und des Betriebssystems bei unter 2 Gigabyte auch schon knapp. Und das unter der Annahme, dass keine weiteren Prozesse laufen, die vergleichbar große Mengen RAM verbrauchen - gut möglich, dass der Ansatz überhaupt nur auf einer Maschine praktikabel ist, die PAE nicht nur beherrscht, sondern auch ausnutzt. Dazu kommen natürlich mögliche Probleme mit der Heapfragmentation, wenn das ganze mehrfach durchgeführt werden soll.

Es ist einer der albernsten Ansätze, die ich je gehört habe, ganz ernsthaft. Mit uint16_t könnten wir über sowas reden, aber von der Größenordnung sind wir hier ja weit entfernt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: