Entrada:
Un conjunto de arrays (de números).
Los elementos dentro de cada matriz están ordenados, pero el conjunto de matrices no está necesariamente ordenado. Las matrices no son necesariamente del mismo tamaño. El número total de elementos es .
Salida: El ésimo más pequeño elemento de todos los elementos en la entrada.
¿Cuál es el algoritmo más eficiente para este problema?
¿Es posible, por ejemplo, lograr un tiempo de ejecución de ?
Respuestas:
Puedes hacerlo enO(l+k log l) tiempo y O(l) espacio extra de la siguiente manera:
Si reemplaza el montón binario con un montón de Fibonacci, creo que esto lo lleva a amortizarO(l+k) tiempo, pero en la práctica será más lento que el montón binario a menos que l es enorme.
Sospecho que el límite del montón de Fibonacci es óptimo, porque intuitivamente tendrá que inspeccionar al menosk elementos para encontrar el k el más pequeño, y tendrá que inspeccionar al menos un elemento de cada l matrices ya que no sabes cómo están ordenadas, lo que inmediatamente da un límite inferior de Ω(max(k,l))=Ω(k+l) .
fuente
Aquí hay un aleatorizadoO(ℓlog2n) algoritmo. Probablemente se puede desrandomizar usando el mismo truco usado para desrandomizar la selección rápida habitual.
Emulamos el algoritmo clásico de selección rápida. En cada fase, elige un pivote y calcula cuántos elementos hay debajo de él, enO(ℓlogn) , utilizando la búsqueda binaria en cada lista. Luego elimina elementos del lado equivocado y repite. El proceso termina después delogn iteraciones en expectativa.
fuente
Esto parece ser resuelto por el documento Selección y clasificación generalizadas (versión preliminar) de Frederickson y Johnson en STOC '80.
Dan límites superiores e inferiores de:Θ(ℓ+∑ℓi=1log|Ai|) que resulta ser ℓlogn para la mayoría de las distribuciones de tamaño de matriz.
El algoritmo real para lograr el límite superior aparentemente se da en un artículo anterior: Algoritmos óptimos para generar información cuantil en X + Y y matrices con columnas ordenadas , Proc. Decimotercera Conferencia Anual sobre Ciencias de la Información y Sistemas, Universidad Johns Hopkins (1979) 47-52.
fuente
Unℓ la fusión de vías lleva tiempo Θ(nlogℓ) (use una forma eficiente de representar una cola prioritaria de los elementos principales en cada lista), luego elija el k -th elemento en tiempo constante. Creo que esto se discute en "Ordenar y buscar" de Knuth para ordenar. Obtener el más pequeño (o el más grande) claramente tomaΘ(ℓ) , para una matriz sin clasificar es O(n) IIRC.
Por favor describa su algoritmo.
fuente