Ich lief über eine Behauptung, dass HashSet <T> .Contains() ist eine O (1) -Operation. Das hat mich überrascht, da jede Diskussion über Hashing die Möglichkeit von Kollisionen erwähnt, die möglicherweise zu O (n) Laufzeit führen.O (1) Hash-Lookups?
Neugierig, ich schaute in Dokumentation für HashSet <T>. Enthält und auch HashTable.Contains. Die Dokumentation für beide Methoden macht denselben Anspruch.
Wenn ich in Reflektor schaue, HashSet <T> .Contains() ist mit einer for-Schleife implementiert, durchläuft eine Liste von Steckplätzen mit Werten, die den gleichen Hash haben.
Nun haben die gleichen Diskussionen über Hashing auch erwähnt, dass ein guter Hashing-Algorithmus Kollisionen vermeidet und unter diesen Umständen wird die Suche in der Tat O (1) sein. Aber mein Verständnis der Big-O-Notation ist, dass es die schlechteste Laufzeit ist, nicht die beste.
Also ist die O (1) Behauptung falsch? Oder fehlt mir etwas?
Ich hasse große O-Notation =] – Luiscencio
@Luiscencio Große O-Notation ist einfach die Wörter, die Sie einem anderen Programmierer sagen können, wie eine Funktion skaliert wird. Welche Wörter schlagen Sie vor, dass ein anderer Programmierer schnell eine halb genaue Vorstellung davon bekommt, wie gut eine gegebene Funktion skaliert? –
[Witz] Was ist mit Ihren "Funktionen ist f ***** g essen die f ***** g Prozessor" – Luiscencio