2016-10-20 4 views
0

Ich versuche, mein Programm effizienter laufen zu lassen, und ich glaube, dass die Behebung dieser linearen Suche eine große Hilfe in Bezug auf die Geschwindigkeit leisten würde, aber ich bin neugierig, wie ich das ändern würde Suche, da ich glaube, dass die Liste nicht unbedingt geordnet ist. Gibt es eine Möglichkeit, die Liste basierend auf dem ersten Argument key zu sortieren?Schnellere Suche in der Liste?

Was mit zur Zeit arbeite ich:

int* key_sequences::data(int key){ 
    for(it=myList.begin(); it!=myList.end(); ++it){ 
     if(it->first==key){ 
      return &(it->second[0]); 
     } 
    } 
    return nullptr; 
}; 
+1

Binäre Suche ist ohne eine sortierte Sequenz nicht möglich. –

+2

Die offensichtliche Antwort wäre, die Verwendung einer Liste zu beenden und sie durch eine geeignetere Datenstruktur zu ersetzen (möglicherweise eine "Map" oder "ungeordnete_map", aus der Sicht der Dinge). Abhängig davon, wann/wie oft eingefügt/gelöscht wird, können Sie auch eine "FlatMap" - binäre Suche in einem sortierten Array in Betracht ziehen. –

+2

Oft wird eine Sequenz wiederholt nach aufeinander folgenden Schlüsseln durchsucht. Das Cachen des letzten Suchergebnisses kann dann die Gesamtzeit von O (n²) auf O (n) reduzieren. Aber ich würde die Datenstruktur in etwas geeigneteres, wie eine "Karte" ändern. –

Antwort

0

in einer einfach verketteten Liste Suche ist O (n), wobei n die Größe der Liste ist. In einigen Implementierungen verwenden Leute jedoch drei Listenzeiger, einen am Anfang, einen in der Mitte und einen am Ende, so dass bei der Suche - sie können den Prozess beschleunigen, so dass Sie online suchen können Dies.

ABER, wenn ich Sie wäre und war so interessant in der Beschleunigung der Suche, würde ich versuchen, eine andere Datenstruktur (Hash? Wie std::unordered_map) oder sortieren Sie die Liste.