Valores menores más cercanosEn Ciencias de la Computación, el problema valores menores más cercanos es el siguiente: para cada posición en una secuencia no ordenada de números, buscar entre las posiciones anteriores la última posición que contiene un valor menor. Este problema se puede resolver de manera eficiente, tanto por medio de algoritmos paralelos como no paralelos:Berkman, Schieber y Vishkin (1993), quienes por primera vez identificaron la utilidad de este procedimiento para otros programas paralelos, desarrollaron algoritmos eficientes para resolverlo en un modelo de máquina de acceso aleatorio paralelo. Este problema también puede ser resuelto en tiempo lineal en una computadora no paralela usando un algoritmo basado en pila. Posteriormente otros investigadores han estudiado algoritmos para resolverlo en otros modelos de computación paralela. EjemploSupongamos que la entrada es la secuencia van der Corput binaria.
El primer elemento de la secuencia (0) no tiene ningún valor previo. El menor (y único) valor más cercano anterior a 8 y a 4 es 0. Los tres valores anteriores a 12 son menores, pero el más cercano es el 4. De esta forma, los valores menores más cercanos para esta secuencia (indicando la no existencia de un valor previo más pequeño por un guion) son
En la mayoría de las aplicaciones, las posiciones de los valores menores más cercanos, y no los propios valores, deben calcularse, y en muchas aplicaciones el mismo cálculo debe efectuarse al inverso de la secuencia con el fin de encontrar el siguiente valor más pequeño que es más cercano en la secuencia. AplicacionesBerkman, Schieber y Vishkin (1993) mencionan muchos otros problemas que pueden ser resueltos de manera eficiente en paralelo usando el cálculo de los valores menores más cercanos. Entre ellos, se incluyen los siguientes:
( ( ) ( ( ( ) ( ) ) ) ) 1 2 1 2 3 4 3 4 3 2 1 0 Técnicas similares también pueden aplicarse a problemas de triangulación de polígonos, la construcción de envolventes convexas (paralelización del algoritmo secuencial deGraham para envolventes convexas), la reconstrucción de árboles a partir de dos de los ordenamientos transversales de árboles, y la construcción del quadtree.[1] Algoritmo secuencialEn una computadora secuencial, es sencillo el cálculo de los valores menores más cercanos utilizando una pila: uno procesa los valores en orden secuencial, usando la pila para mantener una subsecuencia de los valores que han sido procesados hasta el momento y que son menores que cualquier valor anteriormente procesado. En pseudocódigo, el algoritmo es el siguiente. S = new empty stack data structure for x in the input sequence: while S is nonempty and the top element of S is greater than or equal to x: pop S if S is empty: x has no preceding smaller value else: the nearest smaller value to x is the top element of S push x onto S A pesar de tener una estructura de ciclo anidado, el tiempo de ejecución de este algoritmo es lineal, porque cada iteración del ciclo interno elimina un elemento que se había añadido en alguna iteración anterior del ciclo exterior. Está estrechamente relacionado con un algoritmo de Knuth para ordenamiento con una pila (para entradas que puedan ordenarse de esta manera).[2] Un algoritmo secuencial aún más simple (Barbay, Fischer y Navarro (2012), Lemma 1) ni siquiera necesita una pila, sino que asume que la secuencia de entrada se da como un arreglo A [1, n], y almacena el valor menor precedente del valor i-ésimo A[i] en P [i]. Asumimos un mínimo global artificial en A [0]: for i from 1 to n: set j to i-1 while A[j] > A[i]: set j to P[j] set P[i] to j Algoritmos paralelosBerkman, Schieber y Vishkin (1993) mostraron la forma de resolver el problema de los valores menores más cercanos de manera eficiente en una máquina de acceso aleatorio. Para una secuencia de n valores, almacenados en un arreglo, muestran que el problema puede ser resuelto en tiempo O(log log n) usando una cantidad lineal de trabajo total. Para secuencias donde todos los valores son números enteros en el intervalo [1, s],Berkman, Matias y Ragde (1998) mejoraron esta cota a O(log log log s); también mostraron que, para valores suficientemente grandes de s, O(log log n) es la mejor cota que se puede lograr para el problema. Desde entonces, algoritmos paralelos para este problema se han desarrollado en otros modelos de computación paralela, incluyendo computadoras paralelas con una red de comunicaciones estructurada en forma de hipercubo,[3] y el modelo paralelo sincrónico.[4] Notas
Referencias
|