Sí:
Usted conoce el elemento se encuentra dentro de cualquiera índice de [0,i]
de la primera lista o [0,i]
de la segunda lista. Tome el elemento i/2
de cada lista y compare. Proceda por bisección.
No incluyo ningún código porque este problema se parece mucho a la tarea.
EDITAR: Bisección es el método detrás de la búsqueda binaria.Funciona así:
Supongamos que i = 10; (indexación basada en cero, estamos buscando el 11 ° elemento en general).
En el primer paso, sabrá que la respuesta está en list1 (0 ... 10) o list2 (0 ... 10). Tome a = list1 (5) y b = list2 (5).
Si a> b, entonces hay 5 elementos en list1 que vienen antes de a, y al menos 6 elementos en list2 que vienen antes de a. Entonces a es un límite superior en el resultado. Del mismo modo, hay 5 elementos en list2 que vienen antes de b y menos de 6 elementos en list1 que vienen antes de b. Entonces b es un límite inferior en el resultado. Ahora sabemos que el resultado está en la lista1 (0..5) o en la lista2 (5..10). Si es < b, entonces el resultado se encuentra en la lista1 (5..10) o en la lista2 (0..5). Y si a == b tenemos nuestra respuesta (pero el problema decía que los elementos eran distintos, por lo tanto a! = B).
Recordamos este proceso, reduciendo el tamaño del espacio de búsqueda a la mitad en cada paso. La bisección se refiere al hecho de que elegimos el elemento medio (bisectriz) fuera del rango que sabemos que incluye el resultado.
Por lo tanto, la única diferencia entre esta búsqueda y la binaria es que en la búsqueda binaria lo comparamos con un valor que estamos buscando, pero aquí lo comparamos con un valor de la otra lista.
NOTA: esto es realmente O(log i)
que es mejor (al menos no peor que) que O(log n)
. Además, para i pequeño (quizás i < 100), en realidad serían menos operaciones para fusionar los primeros i elementos (búsqueda lineal en lugar de bisección) porque eso es mucho más simple. Cuando agrega el comportamiento del caché y la ubicación de los datos, la búsqueda lineal puede ser más rápida para i hasta varios miles.
Además, si i> n continuación, se basan en el hecho de que el resultado tiene que ser hacia el final de cualquiera de las listas, su rango inicial de candidatos en cada lista es de ((en) .. n)
¿Es esta tarea? –
@ Ben: NOPE Esto no es tarea ... Estoy preparándome para asistir a algunas entrevistas este verano ... Ahora sabes y :) –
posible duplicado de http: // stackoverflow.com/questions/2531103/nth-smallest-number-among-two-databases-of-size-n-each-using-divide-y-conquista – outis