La búsqueda de una matriz de elementos usando la búsqueda binaria toma, en el peor de los casos, iteraciones porque, en cada paso, recortamos la mitad de nuestro espacio de búsqueda. Si, en cambio, utilizamos 'búsqueda ternaria', cortaríamos dos tercios de nuestro espacio de búsqueda en cada iteración, por lo que el peor de los casos debería tomar \ log_3 N <\ log_2 N iteraciones ...log 2 N log 3 N < log 2 N
Parece que la búsqueda ternaria es más rápida, entonces, ¿por qué usamos la búsqueda binaria?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
El cuadrado malo
fuente
fuente
Respuestas:
Si aplica la búsqueda binaria, tiene muchas comparaciones. Si aplica la búsqueda ternaria, tiene muchas comparaciones, ya que en cada paso, debe realizar 2 comparaciones para cortar el espacio de búsqueda en tres partes. Ahora, si hace los cálculos, puede observar que: Como sabemos que , en realidad obtenemos más comparaciones con la búsqueda ternaria.2 ⋅ log 3 ( n ) + O ( 1 ) 2 ⋅ log 3 ( n ) + O ( 1 ) = 2 ⋅ log ( 2 )
Por cierto: búsqueda ary puede hacer mucho sentido en el caso si las comparaciones son bastante costosos y pueden ser paralelizados, como entonces, las computadoras paralelas se pueden aplicar.n
Tenga en cuenta que el argumento se puede generalizar para búsqueda ary con bastante facilidad. Solo necesita mostrar que la función es estrictamente monótona y aumenta para los valores enteros de .f ( k ) = ( k - 1 ) ⋅ log ( 2 )n kf(k)=(k−1)⋅log(2)log(k) k
fuente
DCTLib tiene razón, pero olvida las matemáticas por un segundo.
Por su lógica, entonces, n -ary debería ser el más rápido. Pero si lo piensa, n -ary es exactamente igual a una búsqueda de iteración regular (solo iterando a través de la lista 1 por 1, pero en orden inverso). Primero, selecciona el último (o penúltimo) elemento de la lista y compara ese valor con tu valor de comparación. Luego, elimina ese elemento de su lista y luego elige el último elemento de la nueva lista, que es el penúltimo valor de la matriz. Cada vez, solo estaría eliminando 1 valor a la vez hasta que encuentre su valor.
En cambio, debería pensarlo así: ¿cómo elimino la mayoría de los valores de la lista en cada iteración? En una búsqueda binaria, siempre elimina la mitad de la lista. En una búsqueda ternaria, existe la posibilidad (33.33% de probabilidad, en realidad) de que pueda eliminar 2/3 de la lista, pero hay una posibilidad aún mayor (66.66%) de que solo elimine 1/3 de la lista. para calcular O (n), debe mirar el peor de los casos, que es 1/3, menos de 1/2. A medida que te acercas más y más a n, empeora aún más.
No solo se mejorará el peor de los casos con la búsqueda binaria, sino que también se mejorará su tiempo promedio . Mirando el valor esperado (qué porción de la lista podemos eliminar en promedio), usamos esta fórmula:
(P_lower) x (parte que podemos eliminar si es inferior) + (P_higher) x (parte que podemos eliminar si es superior) = E
Para la búsqueda binaria, esto es .5x.5 + .5x.5 = .5 (siempre eliminamos la mitad de la lista). Para búsquedas ternarias, este valor es .666x.333 + .333x.666 = 0.44, o en cada paso, es probable que solo eliminemos el 44% de la lista, por lo que es menos eficiente que la búsqueda binaria, en promedio. Este valor alcanza su punto máximo en 1/2 (la mitad de la lista) y disminuye a medida que se acerca a n (iteración inversa) y 0 (iteración regular).
Ok, entonces mentí ... hay un poco de matemática involucrada, ¡pero espero que ayude!
fuente
Tenga en cuenta que el argumento de comparación log (N) vs 2 log (N) se basa en una interpretación ingenua del algoritmo. Si realmente me sentara y escribiera esto en el ensamblaje x86, los resultados se invertirían. El problema es el uso de enteros para casos de prueba combinados con un compilador insuficientemente inteligente que no puede eliminar las comparaciones redundantes. Vuelva a intentar con cadenas y una función de comparación de cadenas apropiada, y codifíquelo para llamar a la función de comparación una vez por ciclo y encontrará que la búsqueda ternaria es más rápida nuevamente.
fuente