En primer lugar, medida antes de hacer la optimización.
¿Realmente necesita optimizar esa búsqueda?
Si es así, entonces, en segundo lugar, primero piense en la complejidad algorítmica. P.ej. ¿puedes usar un árbol (por ejemplo, std::map
) en lugar de una matriz? Si es así, depende de la frecuencia relativa de las inserciones/eliminaciones frente a las búsquedas, pero la premisa de tener una matriz ordenada a mano indica que las búsquedas son frecuentes en comparación con los cambios en el conjunto de datos, por lo que tendría sentido hacer un poco de trabajo adicional para inserciones/eliminaciones, lo que hace que cada búsqueda sea mucho más rápida, a saber, el tiempo logarítmico.
Si encuentra que, efectivamente, los tiempos de búsqueda son un cuello de botella que hay que enfrentar, y no, no hay cambio de la representación de datos es posible, y la lista es corta, entonces una búsqueda lineal generalmente será más rápido, ya que hace menos trabajo por comparación.
De lo contrario, si la lista es más larga y no se conoce ni asume ninguna distribución particular de valores, y los valores no pueden tratarse como numéricos, y el consumo de memoria debe ser constante (descarta construir una tabla hash, por ejemplo) , la búsqueda binaria produce 1 bit de información por comparación y es probablemente lo mejor que puede hacer para la primera búsqueda.
Cheers & hth.
Si tiene un ordenador cuántico puede probar http://en.wikipedia.org/wiki/Grover%27s_algorithm :) –
@ David: La lista está ordenada, sin embargo, por lo que el algoritmo de Grover es peor que la búsqueda de bisección. O (sqrt N)> O (lg N) –
una máquina de estado trabajó un orden de magnitud para mí en datos grandes, pero la complejidad/memoria para construir estados es mucho más grande que la clasificación. – technosaurus