
En informática , una búsqueda por referencia (o "finger search") en una estructura de datos es una extensión de cualquier operación de búsqueda que dicha estructura admita, donde se proporciona una referencia (o "finger") a un elemento de la estructura de datos junto con la consulta. Si bien el tiempo de búsqueda de un elemento se suele expresar como una función del número de elementos en una estructura de datos, los tiempos de búsqueda por referencia dependen de la distancia entre el elemento y la referencia.
En un conjunto de n elementos, la distancia d ( x , y ) (o simplemente d cuando no hay ambigüedad) entre dos elementos x e y es su diferencia de rango. Si x e y son los elementos i y j más grandes de la estructura, entonces la diferencia de rango es | i - j |. Si una búsqueda normal en alguna estructura normalmente tomaría tiempo, entonces una búsqueda con el dedo x usando el dedo y debería idealmente tomar Tiempo . Nótese que, dado que d ≤ n , en el peor de los casos, la búsqueda con el dedo es tan ineficiente como la búsqueda normal. Sin embargo, en la práctica, estas búsquedas con el dedo degeneradas realizan más trabajo que las búsquedas normales. Por ejemplo, si f( n ) es log( n ) y la búsqueda con el dedo realiza el doble de comparaciones que la búsqueda normal en el peor de los casos, se deduce que la búsqueda con el dedo es más lenta cuando d > √n . Por lo tanto, la búsqueda con el dedo solo debe usarse cuando se puede esperar razonablemente que el objetivo esté realmente cerca del dedo.
Implementaciones
Algunas estructuras de datos populares admiten la búsqueda por dedos sin necesidad de modificar la estructura en sí. En estructuras donde la búsqueda de un elemento x se realiza reduciendo el intervalo en el que se puede encontrar x , la búsqueda por dedos desde y se suele realizar invirtiendo el proceso de búsqueda desde y hasta que el intervalo de búsqueda sea lo suficientemente grande como para contener x , momento en el que la búsqueda continúa con normalidad.
Listas enlazadas ordenadas
En una lista enlazada , normalmente se busca un elemento de forma lineal recorriendo la lista de un extremo al otro. Si la lista enlazada está ordenada y tenemos una referencia a algún nodo que contiene y , entonces podemos encontrar x en tiempo O( d ) comenzando nuestra búsqueda desde y .
Matrices ordenadas
En un arreglo ordenado A , normalmente se busca un elemento x en A con una búsqueda binaria . La búsqueda de dedos se realiza realizando una búsqueda unilateral desde A [ j ] = y . Mientras que la búsqueda binaria reduce a la mitad el espacio de búsqueda después de cada comparación, la búsqueda unilateral duplica el espacio de búsqueda después de cada comparación. Específicamente, en la k -ésima iteración de la búsqueda unilateral ( suponiendo ), el intervalo en consideración es A [ j , j +2 k − 1 ]. La expansión se detiene tan pronto como A [ j + 2 k − 1 ] ≥ x , momento en el cual se realiza una búsqueda binaria de x en este intervalo .
Si la búsqueda unilateral requiere k iteraciones para encontrar un intervalo que contenga x , entonces se deduce que d > 2k − 2. La búsqueda binaria en este rango también requerirá otras k iteraciones. Por lo tanto, la búsqueda de x a partir de y requiere un tiempo de O( k ) = O(log d ).
Saltar listas
En una lista de saltos , se puede buscar x desde un nodo que contenga el elemento y simplemente continuando la búsqueda desde este punto. Tenga en cuenta que si , entonces la búsqueda procede hacia atrás, y si Luego , la búsqueda continúa hacia adelante. El caso hacia atrás es simétrico a la búsqueda normal en una lista de saltos, pero el caso hacia adelante es en realidad más complejo. Normalmente, se espera que la búsqueda en una lista de saltos sea rápida porque el centinela al inicio de la lista tiene la misma altura que el nodo más alto. Sin embargo, nuestro dedo podría ser un nodo de altura 1. Debido a esto, ocasionalmente podríamos ascender mientras intentamos buscar; algo que normalmente nunca ocurre. Sin embargo, incluso con esta complicación, podemos lograrun tiempo de búsqueda esperado de O(log d ). [ 1 ]
Trepa
Un treap es un árbol de búsqueda binaria (BST) aleatorio. Buscar en un treap es igual que buscar un elemento en cualquier otro BST. Sin embargo, los treaps tienen la propiedad de que la longitud esperada del camino entre dos elementos de distancia d es O(log d ). Por lo tanto, para realizar una búsqueda de dedos desde el nodo que contiene y para x , se puede ascender por el árbol desde y hasta encontrar un ancestro de x , momento en el que la búsqueda normal en el BST procede como de costumbre. Si bien determinar si un nodo es ancestro de otro no es trivial, se puede ampliar el árbol para admitir consultas de esta forma y obtener un tiempo de búsqueda de dedos esperado de O(log d ). [ 1 ]
Cuerdas y árboles
Las implementaciones de la estructura de datos de cuerda suelen emplear un iterador de posición para recorrer la cadena. Este iterador puede considerarse como un dedo que apunta a un carácter específico de la cadena. Al igual que la mayoría de los árboles equilibrados, las cuerdas requieren un tiempo de O(log( n )) para recuperar datos en una hoja del árbol cuando solo se dispone de la raíz. Leer cada hoja del árbol requeriría un tiempo de O( n · log( n )). Sin embargo, al almacenar información adicional, el iterador puede leer la siguiente hoja en solo O(1) y todas las hojas del árbol en solo O( n ). Las implementaciones de cuerdas suelen almacenar en caché información adicional sobre toda la ruta desde la raíz hasta la posición del nodo actual en el iterador. Otras implementaciones de estructuras de datos de árbol a veces almacenan información adicional en el propio árbol, guardando un puntero en cada nodo a su padre o sucesor (además de los punteros habituales en cada nodo a sus hijos), y almacenando solo la posición del nodo actual en el iterador. [ 2 ] [ 3 ]
Generalizaciones
Si se puede realizar una búsqueda de dedos de forma iterativa en un tiempo O ( f ( d )), donde cada iteración toma un tiempo O (1), entonces al proporcionar c dedos diferentes, se puede realizar una búsqueda de dedos en un tiempo O ( c min{ d ( x , y1 ), ..., d ( x , yc ) }). Esto se logra iniciando la búsqueda de dedos para los c dedos e iterando un paso hacia adelante cada uno hasta que el primero termine.
Dada cualquier secuencia A = [ a 1 , ..., a m ] de m accesos, se dice que una estructura tiene la propiedad de dedo estático para un dedo fijo f , si el tiempo para realizar A esLos árboles splay tienen esta propiedad para cualquier elección de f sin procesamiento adicional en secuencias de accesos suficientemente grandes. [ 4 ]
Aplicaciones
La búsqueda por dedos permite reutilizar el trabajo realizado en búsquedas anteriores. Por ejemplo, una forma de iterar sobre los elementos de una estructura de datos es simplemente buscarlos por dedos en orden, donde el dedo de una consulta corresponde a la ubicación del resultado de la anterior. Se puede optimizar la estructura de datos mediante este método si se sabe que las búsquedas se realizan con frecuencia cerca de la última.
Un árbol de búsqueda de dedos es un tipo de estructura de datos que permite especificar dedos de forma que todas o algunas de sus operaciones compatibles sean más rápidas al acceder o modificar una ubicación cercana a un dedo. A diferencia de las búsquedas de dedos descritas en este artículo, estos dedos no se proporcionan en el momento de la consulta, sino que se especifican por separado para que todas las operaciones futuras los utilicen. Una ventaja de esto es que el usuario no necesita manipular ni almacenar referencias internas a la estructura; simplemente puede especificar un elemento dentro de ella.
Referencias
- 1 2 "Árboles de dispersión aleatorios: resultados teóricos y experimentales" (PDF) .
- ↑ "Consideraciones generales de diseño para un iterador de árbol" .
- ↑ Steven J. Zeil. "Recorriendo árboles con iteradores" Archivado el 16 de febrero de 2016 en Wayback Machine .
- ↑ "John Iacono. Optimalidad independiente de la clave. Algorithmica, 42(1):3-10, 2005" (PDF) . Archivado del original (PDF) el 13 de junio de 2010.
- Algoritmos de búsqueda
- Árboles (estructuras de datos)