¿Está bien mi implementación de Búsqueda ternaria?

No, no es.

Si estoy en lo cierto, entonces está intentando implementar una búsqueda ternaria muy similar a la búsqueda binaria pero con 3 particiones en cada paso de la búsqueda.

Si recuerda, la complejidad de la búsqueda binaria es [matemática] O (\ log_2 n) [/ matemática] debido a su propiedad de reducir a la mitad la lista en cada paso.

Del mismo modo, la búsqueda ternaria debe tener una complejidad de [matemáticas] O (\ log_3 n) [/ matemáticas]. Pero eso no está sucediendo en el código que ha proporcionado debido a un cálculo incorrecto de mid1 y mid2. Aunque finalmente puede encontrar los datos en la lista, pero no está reduciendo la lista a un tercio de la sublista en cada paso. Por lo tanto, está realizando más número de iteraciones de búsqueda que la búsqueda binaria. Debe calcular valores medios como este para corregir su búsqueda ternaria:

int mid1 = lbound + (ubound – lbound) / 3;
int mid2 = lbound + (2 * (ubound – lbound)) / 3;

El siguiente código puede ayudarlo a observar mejor …

#include
usando el espacio de nombres estándar;
int L [101010];
int TernarySearch (int left, int right, int key)
{
mientras (derecha> izquierda)
{
int d = derecha-izquierda;
int Mid1 = izquierda + (d / 3);
int Mid2 = Mid1 + (d / 3);
if (L [Mid1] == key) {return Mid1;}
if (L [Mid2] == key) {return Mid2;}
if (tecla L [Mid1]>)
{
derecha = Mid1;
}
más si (L [Mid2] {
izquierda = Mid2 + 1;
}
más
{
izquierda = Mid1;
derecha = Mid2;
}
}
volver -1;
}
int main ()
{
int n, clave;
cin >> n;
para (int i = 0; i {
cin >> L [i];
}
cin >> clave;
int x = TernarySearch (0, n, clave);
si (x == -1)
{
cout << "La clave no existe" << endl;
}
más
{
cout << "La posición de la clave es" << x << endl;
}
devuelve 0;
}

Podría agregar otro comparador de parámetros de plantilla que puede establecer de manera predeterminada en std :: less para manejar casos en los que los operadores de comparación no están sobrecargados para T. También sus parámetros deben ser referencias a objetos const (vector const & Lista, T const y datos). Además de esto, el nombre de la función debe ser ternaySearch o ternary_search pero bot Ternary_Search.

Esas observaciones no tienen nada que ver con la lógica del algoritmo. Debería intentar probar su algoritmo en algunos casos extremos y ver cómo funciona, por ejemplo, si el vector está ordenado en orden ascendente / descendente.

  • ¿Está seguro de que T implementa los operadores de @Comparison que está utilizando?
  • no se garantiza que el vector esté en orden: el conjunto es.

En cuanto a la exactitud de su algoritmo, debe identificar y probar las condiciones de contorno. Por ejemplo, ¿qué sucede si datos> algún elemento en la Lista?