Ich versuche herauszufinden, die Komplexität des Löschens mehrerer Elemente von Std :: Set. Ich verwende this page als Quelle.std :: set löschen komplexität anomalität?
Es behauptet, dass die Komplexität für das Löschen eines einzelnen Elements mit einem Iterator amortisiert O (1), aber das Löschen mehrerer Elemente mit der Bereichsform ist log (c.size()) + Std :: distance (erste, letzte) (dh - Protokoll der Größe des Sets + Anzahl der gelöschten Elemente).
Wenn die Anzahl der zu löschenden Elemente (n) viel kleiner ist als die Anzahl der Elemente in der Menge (m), bedeutet dies, dass die Elemente, die gelöscht werden sollen, wiederholt und gelöscht werden eine Zeit ist schneller (O (n)) als sie mit einem Aufruf zu löschen (O (log m) unter der Annahme n < < m).
Offensichtlich, wenn das wirklich der Fall gewesen wäre, würde die interne Implementierung der zweiten Form nur die obige Schleife tun.
Ist dies ein Fehler auf der Website? Ein Fehler in den Spezifikationen? Fehle ich gerade etwas?
Danke, Shachar
mehrere Artikel mit dem Bereich Form _erasing ist log (c.size()) + std :: Abstand (first, last) (dh - Protokoll der Größe des Satzes + die Anzahl der Elemente gelöscht). _ - mit fester Satzgröße ist genau wie O (n) skaliert, wobei n die Anzahl der gelöschten Elemente ist, die man erhält, wenn man sie einzeln löscht. – Cthulhu
Das ist interessant, ich denke, Sie könnten es beide Möglichkeiten testen, um den Unterschied zu sehen. Vielleicht würde es beim Zurücksetzen des Iterators nach jedem einzelnen Löschen etwas Overhead geben (da dies den Iterator ungültig macht) –
@Cthulhu, die gleiche Logik gilt immer dann, wenn ein Plus in der Komplexität verwendet wird. Alles, was Sie für konstant halten (oder sogar beschränkt), hat automatisch die Komplexität von O (1). –