2012-03-29 4 views
0

Wir haben eine Anwendung, die auf einem Low-Power-Prozessor ausgeführt wird, der schnelle Antwort auf eingehende Daten haben muss. Die Daten kommen mit einem zugehörigen Schlüssel. Jede Taste reicht von 0 - 0xFE (max 0xFF). Die Daten selbst reichen von 1kB bis 4kB. Das System verarbeitet Daten wie:Schneller Such-Einfüge-Lösch-Algorithmus für Low-Power-Prozessor

data in 
key lookup -> insert key & data if not found 
buffer data in existing key 

Nach einem Ereignis werden ein Schlüssel und zugehörige Daten zerstört.

Wir sind ein paar Lösungen trialing:

  1. Pre-zugewiesen std::vector<std::pair<int,unsigned char *>>, die einen Schlüsselwert auf der Grundlage der Indexposition nachschlägt.

  2. std::map<int, unsigned char *>

  3. Rot-Schwarz-Baum

  4. std::vector<...> mit einer binären Art und binärer Suche nach dem Schlüssel des

Gibt es andere Algorithmen, die schnell auf Einfügen- sein könnte Suchen-Löschen?

Danke.

+0

Sie werden Duplikate für einen einzelnen Schlüssel haben, oder werden neue Daten mit einem vorhandenen Schlüssel die alten Daten ersetzen? –

+0

Da Sie über sehr kleine Datensätze (1-Byte-Schlüssel) auf einem Low-Power-Prozessor sprechen, sollten Sie das Denken über traditionelle algorithmische Leistung und große O-Notation für Algorithmen definitiv ignorieren. Denken Sie daran, dass all dies nur gilt, wenn Datensätze in Richtung Unendlichkeit wachsen. Die praktische Leistung für kleine Sets folgt diesen Mustern nicht. Machen Sie 1) oder 2) und profilieren Sie die Leistung – TJD

+0

@Mark - Single Key, neue Daten werden gegen diesen Schlüssel gepuffert – user626201

Antwort

1

Wenn der Schlüssel im Bereich [0, 0xFF), dann könnten Sie verwenden:

std::vector<std::string> lut(0xFF); //lookup table 

//insert 
lut[key] = data; //insert data at position 'key' 

//delete 
lut[key].clear(); //clear - it means data empty 

//search 
if(lut[key].empty())  //empty string means no key, no data! 
{ 
    //key not found 
} 
else 
{ 
    std::string & data = lut[key]; //found 
} 

Bitte beachte, dass ich leere Zeichenfolge verwendet, um diese Daten anzuzeigen, ist nicht vorhanden.

+0

Wie würden Sie das Datenelement mit dem Schlüssel verknüpfen? – user626201

+0

@ user626201: Siehe meine aktualisierte Antwort. lassen Sie mich wissen, wenn Sie irgendwelche Zweifel haben. – Nawaz

+0

Die Verwendung von 'lut [key] .empty()' ist direkter als der Vergleich mit einer leeren Zeichenfolge. –

2

std::map verwendet einen ausgewogenen Baum (wie Rot-Schwarz-Baum) selbst, es hat also keinen Sinn, ihn erneut zu implementieren.

Ein sortierter std::vector mit binärer Suche hat die gleiche Leistung eines ausgeglichenen Binärbaums. Der Unterschied besteht darin, dass das Platzieren eines Schlüssels in der Mitte des Vektors teuer ist.

Da Ihre Schlüssel eine sehr begrenzte Reichweite haben, die beste Wahl ist ähnlich wie die erste Vorschlag:

std::vector<unsigned char *> data(0xFF); // no need to have a pair 

diese Weise eine einfache Überprüfung von data[key] == NULL zeigt Ihnen, ob Daten für diesen Schlüssel vorhanden ist oder nicht. Wenn ich es wäre, würde ich es sogar einfacher machen:

unsigned char *data[0xFF]; 
+0

Warum muss das Array dynamisch zugewiesen werden? Ich würde für 'unsigned char * data [0xff] 'gehen. –

+0

@MarkRansom, Ups, ich meinte das! Nicht dynamisch zuzuordnen war einer der Gründe, warum ich es von Vektor in Array geändert habe! – Shahbaz

+0

@Shahbaz - Danke - der Low-Tech-C-Weg war total vergessen :) Ich denke, ich war vorbei, alles zu komplizieren ... – user626201

Verwandte Themen