En C# .NET, me gusta usar HashSets debido a su supuesta complejidad de tiempo O (1) para las búsquedas. Si tengo un gran conjunto de datos que se van a consultar, a menudo prefiero usar un HashSet en una lista, ya que tiene esta complejidad de tiempo.¿Cuál es la complejidad del tiempo de búsqueda de HashSet <T> (IEqualityComparer <T>)?
Lo que me confunde es el constructor de la HashSet, que toma IEqualityComparer como argumento:
http://msdn.microsoft.com/en-us/library/bb359100.aspx
En el enlace anterior, las observaciones señalan que el "constructor es un (1) Operación O, "pero si este es el caso, tengo curiosidad si la búsqueda todavía es O (1).
En particular, me parece que, si tuviera que escribir un Comparer para pasar al constructor de un HashSet, cada vez que realizo una búsqueda, el código Comparer debería ejecutarse en cada clave para verificar ver si hubo una coincidencia. Esto no sería O (1), sino O (n).
¿La implementación construye internamente una tabla de búsqueda cuando los elementos se agregan a la colección?
En general, ¿cómo puedo averiguar la información sobre la complejidad de las estructuras de datos .NET?
Simplemente pruébela con diferentes tamaños de entrada y vea si el tiempo de búsqueda escala o permanece constante. Sin embargo, estoy bastante seguro de que la documentación es correcta. –
Es * aún * un HashSet una vez que el constructor ha terminado. La estructura de datos fuente en sí misma no se mantiene (por ejemplo, no hay un "proxy" en este caso). La búsqueda es O (1) pero el inserto está * amortizado * O (1). –
@Kirby Eso no cambia. Puede construir el HashSet desde un IEnumerable o agregar los elementos individualmente más tarde: lo único que * podría * ser diferente, lo que no afecta la complejidad del tiempo [lookup], es la capacidad. –