2016-07-15 11 views
-1

Grundsätzlich habe ich viele Vektoren, die binäre Daten speichern. Ich möchte sie duplizieren. Das erste, was mir in den Sinn kam, ist ein set. Die Nachschlagleistung von set stimmt jedoch nicht mit der eines Vektors überein. Gibt es einen anderen Container, der Daten duplizieren und schneller ausführen kann? Ich brauche schnelle Suche, weil die Binärdaten von einem Server abgerufen, dedupliziert und an den Client gesendet werden, und dies ist ein kontinuierlicher Prozess.Gibt es einen anderen Container, der einem Set mit der Lookup-Leistung eines Vektors ähnlich ist?

+0

Mit Lookup meinen Sie "finden" Operation oder Direktzugriff? Wenn Sie sich auf 'find' beziehen, ist' set' schneller als 'vector'. – Naveen

+0

Da es sich um Binärdaten handelt, weiß ich nicht, was ich "finden" soll. Ich betrachte also den wahlfreien Zugriff. Der Engpass ist hier die 'insert'-Operation eines Sets. Es ist wirklich langsam – Rakshith

+0

Können die Daten sortiert werden oder muss es in eingefügter Reihenfolge sein? – Galik

Antwort

1

Sie haben viele Möglichkeiten, aber alles hängt von Ihren Daten ab. Gehen für eine *set Datenstruktur klingt wie die Standardoption, aber Sie müssen Maßnahme mit einigen realistischen Datensätzen.

Lassen Sie mich einige kurze Punkte zu den verfügbaren Containern notieren, die Sie überprüfen können.

  • Set

     
    Elements are sorted. 
    Don't have to worry about removing of duplicate entries. 
    Its a node based container, so no performance benefits from cache locality. 
    Try to go for boost::flat_set 
    
  • unordered_set

     
    No ordering of elements, So not sorted by default. 
    Hash based container, so would seem like it would provide better performance. 
    Hashing of large keys will result in poor performance, 
    So, will have to resort to an augmented data structure which maps the actual data key to some integer value based on partial hashing of the key or something. 
    But, that depends upon hashing performance. Again, *Measure* (can't stress enough) 
    
  • Vector

     
    Upto a certain number of elements, this would certainly beat std::set for performance. 
    Upto you to find that range. 
    std::sort followed by std::unique will give you deduplicated range of data. 
    Should consider boost::flat_set before implementing a set using vector on your own. 
    
  • boost :: flat_set

     
    Already discussed as above. 
    

Um es zusammenzufassen, Sie haben Ihre Leistungsmessung Tests auf Ihrem Datensatz zu tun.