estoy confundido en el análisis del rendimiento de binarySearch
del CollectionsAclaración de estado de rendimiento de búsqueda binaria de recogida de javadoc
Dice:
Si la lista especificada no implementa la interfaz de acceso aleatorio y es grande, este método realizará una búsqueda binaria basada en iteradores que realiza O (n) cruces de enlaces y comparaciones de elementos O (log n).
No estoy seguro de cómo interpretar esto O(n)
+ O(log n)
.
Quiero decir, ¿no es peor que simplemente atravesar la lista enlazada y comparar? Todavía obtenemos solo O(n)
.
Entonces, ¿qué significa esta afirmación sobre el rendimiento? Tal como está redactado, no puedo entender la diferencia de una búsqueda lineal simple en la lista vinculada.
¿Qué es lo que no entiendo aquí?
La clave aquí es que el tiempo de ejecución total no es realmente 'O (n) + O (log n)' ya que los dos Big-O están indicando diferentes operaciones.Es realmente 'O (n) * (tiempo para recorrer un enlace) + O (log n) * (tiempo para comparar dos elementos)'. Entonces es importante hacer esta distinción. – tskuzzy
@tskuzzy: correcto, pero técnicamente el tiempo es 'O (n)' para una 'n' suficientemente grande, sin importar qué tan grande 'el tiempo para comparar dos elementos' se compare con' el tiempo para atravesar un enlace'. La ventaja sobre la búsqueda lineal es visible para comparaciones lentas. –
@TomaszNurkiewicz: ¿No importa que para el recorrido solo actualicemos un puntero? 'operación constante'? – Cratylus