Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » map ohne reserve?

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 <
010
31.01.2007, 17:48 Uhr
flappinski



aber dann muss ich ja noch viel mehr Vergleiche machen, dann muss ich jeden der 12 Mio. Einträge in der 600000 Mann starken map suchen, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
31.01.2007, 18:06 Uhr
Blubber2063



Hmmm, was willst du jetzt machen? Ich dachte du hast eine Textdatei mit 12 Millionen Einträgen(Bei der Größe würde ne DB schon sinn machen) und du willst davon einen oder eine Teilmenge für dein Programm bereit stellen. Wenn dem so ist bist du mit einem einfachen Vergleich ob du diesen String gesucht hast besser dran als mit der Map, falls du sie danach noch mal brauchst kannst du die genutzen ja dann in der Map ablegen, aber alles in eine Map eintragen ist viel schlimmer.

Falls ich dein Problem falsch verstanden habe, erkläre es mir noch mal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
31.01.2007, 18:15 Uhr
flappinski



das ist schon nah dran. aber diese Teilmenge, die ich bereitstellen will ist 600 Tausend stück gross. Das bedeutet doch nach Deiner Lösung, dass ich jeden dieser 12 Mio. Einträge mit allen 600 Tausend vergleichen muss. Oder? Ich kann die Teilmenge nur über eine Liste von 600 Tausend Namen spezifizieren.
O.k. ich glaube jetzt kann ich es auf den Punkt bringen:
Wie kann ich 600 Tausend Namen aus einer Liste von 12 Mio. rausholen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
31.01.2007, 18:22 Uhr
Blubber2063



Woher hast du denn die 600.000 Namen die du brauchst ? Also da müsste man jetzt schon fast ne Analyse drüber machen, aber tendentiell würde ich sagen die schnellste Lösung wäre alle Namen die du haben willst in eine Hashtable einzutragen und dann jeweils den aktuellen Datensatz zu hashen und zu schaun ob in der Table ein Wert dafür existiert, wenn ja kannst du die Hashtable ja mit den richtigen Daten füllen. Allerdings solltest du dir bei der Datenmenge wirklich überlegen ob sich der Einsatz einer Datenbank nicht lohnt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
31.01.2007, 20:15 Uhr
0xdeadbeef
Gott
(Operator)


Ich würd an der Stelle ganz ernsthaft ne Datenbank empfehlen, die macht genau das und ist im Zweifel besser optimiert, als alles, was du so schreiben kannst. Ansonsten, ne std::map implementiert in aller Regel einen Rot-Schwarz-Baum, garantiert ist logarithmische Skalierung so ziemlich aller Operationen mit der Anzahl der Einträge.

Prinzipiell gibt es eine Reihe von Möglichkeiten, das ganze zu verarbeiten. Da die Schlüssel eine Ordnung haben - lexikographischen Vergleich - musst du auf jeden Fall nicht mit allen Namen vergleichen, die du wissen willst, sofern du diese vorher in einem Baum speicherst - da bietet sich z.B. std::set an. Denkbar wäre auch, schon eingelesene Namen (sofern die Einträge eindeutig sind) nach Einlesen aus diesem set zu löschen, dann hast du später weniger zu vergleichen. Ich stell mir das etwa so vor:

C++:
#include <fstream>
#include <iostream>
#include <map>
#include <pair>
#include <set>
#include <sstream>
#include <string>

int main() {
  std::ifstream valid_keys_in("valid_keys.txt");
  std::ifstream db_in("db.txt");

  std::set<std::string> valid_keys;
  std::map<std::string, std::pair<std::string, std::string> > grepped_db;
  std::string line, key, str, job;
  std::istringstream isstr;

  while(valid_keys_in >> key)
    valid_keys.insert(key);

  while(std::getline(db_in, line)) {
    isstr.clear();
    isstr.str(line);
    isstr >> key >> str >> job;
    if(isstr) {
      std::set<std::string>::iterator i = valid_keys.find(key);
      if(i != valid_keys.end()) {
        grepped_db[key] = std::pair<std::string, std::string>(str, job);
        valid_keys.erase(i);
      }
    }
  }
}


Ansonsten, wenn du vorher weißt, wie groß das Ding ungefähr wird und du die SGI-Erweiterungen der stdlib benutzen kannst, empfiehlt sich u.U. ne hash_map.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 31.01.2007 um 20:16 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
01.02.2007, 11:27 Uhr
~flappinski
Gast


whow, vielen dank für diese ausführliche Antwort, ich werde sie beherzigen und antworten, wenn ich die Zeit gefunden habe, sie zu beantworten. Die gefunden Einträge zu löschen, darauf kam ich auch auf dem Weg zur Arbeit.
set kenne ich nicht, werde ich mir mal anschauen. Die Datenbnk würde ich gerne vermeiden, weil ich dann die Möglichkeit verliere, dieses Program auf anderen Platformen ganz einfach zu übertragen. Und ich brauche diese Abfrage auch nur einmal am Anfang, alles spätere (und das ist das eigentliche Programm) braucht das nicht mehr, es muss also nicht in`s äusserste optiomiert sein, nur mit den obigen Mitteln ist glaube ich auch schon recht viel rauszuholen.
Vielen Dank,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
01.02.2007, 13:23 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Das stimmt so nicht ganz. Mysql bringt unter Windows und unter Linux mysql.h mit - das reicht schon, um sehr einfach mit MySQL zu arbeiten. Wenn du es Objektorientiert haben willst, schau dir mysql++ an. Ist auch auf beiden Systemen identisch. Ich habe sehr viel Code, was ich lokal (Windows) entwickle und was auf eine Unixserver läuft. Ebenso Programme, die MySQL verwenden. Also ist der Code ebenso zu portieren und auch viel einfacher und passender - wie Blubber und Beefy schon geschrieben haben - genau für solche Fälle gibt es Datenbanken.

Wenn du dich doch für eine DB entscheiden solltest, hilt dir dieser Post evtl. weiter
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: