¿Por qué es difícil realizar una búsqueda binaria en una lista vinculada?

No es difícil, solo es lento (generalmente).

En una búsqueda binaria, primero mira el elemento central de su lista. Si el elemento es más grande que el que está buscando, repita el proceso en la mitad inferior de la matriz, de lo contrario repita el proceso en la mitad superior de la matriz hasta que se quede sin elementos o encuentre el elemento estas buscando. En cada recurrencia, debe encontrar el elemento central de una parte de la lista.

En el caso de una lista vinculada, encontrar el elemento del medio requiere atravesar la primera mitad de los elementos. Para una lista enlazada que contiene N elementos, su búsqueda solo tomará N comparaciones de registro, pero habría atravesado aproximadamente N elementos en el proceso . Por lo tanto, para una comparación razonablemente rápida, el costo de recorrer la lista eclipsará el costo de hacer las comparaciones. Por lo general, obtendrá un mejor rendimiento simplemente haciendo una búsqueda lineal de todos los elementos hasta que encuentre el que está buscando. El tiempo promedio para una búsqueda lineal es proporcional a N / 2.

Sin embargo, hay una excepción. Si la operación de comparación es extremadamente costosa (como abrir un archivo y mirar su contenido), entonces el costo de atravesar la lista podría caerse y una búsqueda binaria en una lista vinculada funcionaría bien.

La idea de la búsqueda binaria es que mire el índice [math] \ lfloor {\ frac {n} {2}} \ rfloor [/ math] de su estructura de datos y compare el elemento en ese índice con su elemento objetivo. Esto guía si miras hacia la derecha o hacia la izquierda.

búsqueda booleana (List sc, int start, int end, int target) {
if (inicio> fin)
volver 🙁; //¡triste!
int middle = floor ((inicio + final) / 2;
if (sc.get (middle) == target)
volver 🙂; //¡feliz!
if (objetivo búsqueda de retorno (sc, start, middle-1, target);
más
búsqueda de retorno (sc, middle + 2, end, target);
}

En este caso,

List

Puede ser una ArrayList o LinkedList.

En una lista vinculada, encontrar el índice i toma tiempo [math] \ Theta (n) [/ math] para una lista de n elementos. Esto se debe a que no tenemos acceso aleatorio, por lo que pasar por índice lleva mucho tiempo. Por lo tanto, la búsqueda binaria ya no se ejecuta en [math] \ Theta (\ log n) [/ math] time, sino que se ejecuta en [math] \ Theta (n) [/ math] time:

(Dado que [math] T (n) = T (\ frac {n} {2}) + \ Theta (n) [/ math] tiene solución [math] \ Theta (n) [/ math] para el caso 1 o 3 del método maestro. Nunca puedo recordar qué caso es cuál.)

En una ArrayList (también conocido como vector), ir por índice lleva tiempo [math] \ Theta (1) [/ math] porque tenemos acceso aleatorio.

Espero que esto ayude.

Una lista vinculada sacrifica el acceso directo (es decir, la capacidad de ir directamente al i-ésimo elemento de una lista a bajo costo) para una inserción y eliminación más barata de elementos. Una lista de matriz hace exactamente el compromiso opuesto.

Un algoritmo de búsqueda binaria depende del acceso directo para encontrar el medio de sublistas sucesivas. Para encontrar el medio de una lista vinculada (suponiendo que la estructura mantiene un recuento total para que no tenga que recorrer la lista para encontrar la longitud de la lista) debe “visitar” la mitad de los elementos, por lo que bien podría haber buscado ellos.

Las listas vinculadas no permiten acceder a un elemento aleatorio en tiempo constante, a diferencia de una matriz. Las listas enlazadas solo permiten acceso secuencial, yendo al siguiente elemento de la lista (o también yendo al elemento anterior si la lista está doblemente vinculada). Acceder al elemento [math] k [/ math] ‘de una lista vinculada requiere pasos [math] k-1 [/ math] si comienza desde el principio o pasos [math] | jk | [/ math] si tiene el [math] j [/ math] ‘th elemento en cuestión.

La complejidad temporal de la búsqueda binaria se basa en el acceso aleatorio a cualquier elemento en tiempo constante. Con una lista vinculada no hay acceso aleatorio de tiempo constante. La complejidad del tiempo para la búsqueda binaria aumentaría de [math] O (\ log n) [/ math] con una matriz a [math] O (n \ log n) [/ math] con una lista vinculada, siendo incluso peor que un Búsqueda lineal simple.

Para realizar una búsqueda binaria en cualquier cosa, deberíamos tener información sobre su punto de inicio y su punto final para encontrar su punto medio, pero en el caso de una lista vinculada, tenemos información sobre su encabezado pero no sabemos sobre su final, así que cómo podemos encontrar el elemento medio incluso si tiene un puntero en la última posición, aún no podemos realizar una búsqueda binaria porque no podemos acceder a sus índices como lo hacemos en una matriz.

More Interesting

¿Se puede programar un algoritmo complejo de una manera simple? Suponga que no se necesitan optimizaciones.

Algoritmos: ¿Cómo encuentro un elemento en una secuencia que sea más pequeño que mi número en la secuencia, a la izquierda de mi número y a la derecha de todos esos elementos?

¿Cuál es el libro correcto para comprar algoritmos de Amazon y para alguien que no tiene idea sobre el algoritmo?

¿Cómo puedo encontrar una incrustación plana de un gráfico plano?

¿Cómo resuelven los árboles de segmentos el problema de apuñalamiento (todos los intervalos que contienen un punto dado)?

En los términos más simples, ¿qué es un algoritmo? ¿Cual es su propósito?

¿Cuál es la diferencia entre: algoritmo, técnica y técnica algorítmica?

¿Cómo se puede mejorar la velocidad de los algoritmos de reconocimiento facial?

El año pasado, logré resolver dos problemas de ACM ICPC en las regiones. Ya que falta solo un mes para la competencia de este año, ¿puedo resolver uno o dos más este año si entreno duro hoy o no hay ninguna posibilidad?

¿Cuál crees que es la razón por la cual las personas pueden resolver acertijos complejos? ¿Es práctica o nacen genios?

¿Cuál es la diferencia entre array estático y automático?

¿Debo conocer algoritmos y estructuras de datos si quiero ser un desarrollador de pila completa?

¿Por qué debería aprender algoritmos antes de entrar en la programación?

¿Es una matriz que está en un orden ordenado un montón mínimo?

¿Podemos decir que el Aprendizaje automático es nuestro compromiso para los problemas para los que no pudimos encontrar algoritmos? Argumentos