tenemos dos bases de datos de tamaño n que contienen números sin repeticiones. Entonces, en total tenemos 2n elementos. Se puede acceder a ellos mediante una consulta a una base de datos a la vez. La consulta es tal que le da una k y devuelve la entrada k-ésima más pequeña en esa base de datos. necesitamos encontrar la enésima entrada más pequeña entre todos los elementos 2n en las consultas O (logn). la idea es usar divide y vencerás, pero necesito ayuda para pensar en esto. ¡Gracias!enésimo número más pequeño entre dos bases de datos de tamaño n que usan dividir y conquistar
Respuesta
Así es como pensé esto. Como se trata de un problema educativo, le sugiero que deje de leer si alguno de los puntos le hace pensar: "Ajá, no había pensado en eso, puedo pensar más en esas líneas solo".
1) La misma observación que sdcwc: con una posible pequeña objeción sobre si comienza en 0 o 1, la base de datos se puede considerar como una matriz ordenada. Pido el elemento 0, obtengo el más pequeño. Pido 12, obtengo el 13 ° más pequeño. Y así. Encuentro esto más fácil de visualizar.
2) Sabemos que estamos buscando un algoritmo O (log n). Eso significa que en términos generales estamos buscando una de dos cosas:
O nos comienza a cabo mediante el cálculo del elemento más pequeño, y luego calcular el segundo más pequeño, más pequeño cuarto, octavo, etc., hasta que estemos arriba al tamaño que queremos, cada paso en tiempo constante. Esto no me parece prometedor.
O comenzamos con un problema de tamaño n luego realizamos algunas operaciones de tiempo constante que nos permiten resolver el problema original resolviendo un problema de tamaño n/2.Obviamente, podemos resolver el problema para n = 1 en tiempo constante, para completar el algoritmo. Esto suena un poco más plausible.
En realidad, no necesariamente tiene que ser n/2 cada vez. Podría ser n/3, o 999 * n/1000, y el resultado seguirá siendo O (log n). Pero no hay nada de malo en buscar n/2 primero.
3) ¿Cómo vamos a reducir el problema de esa manera? Bueno, si podemos descontar/eliminar m elementos del inicio de una matriz u otra como más pequeños que la k-ésima más pequeña, entonces podemos encontrar el (km) el elemento más pequeño del par resultante de matrices, y será el la quinta más pequeña de las matrices originales.
4) Finalmente, la observación de avance es que si el m-ésimo elemento más pequeño de la matriz A es más pequeño que el m-ésimo elemento más pequeño de la matriz B, entonces ese m-ésimo elemento de A no puede ser el (2m) el elemento más pequeño de la dos arreglos combinados. Es más pequeño que eso (o de igual valor: no estoy seguro de si "no hay repeticiones" significa "no hay repeticiones en cada base de datos", o "no hay repeticiones entre las bases de datos combinadas"), ya que hay como máximo 2 * (m- 1) elementos estrictamente más pequeños que en ambas matrices combinadas.
A menos que haya cometido un error, el resto es la codificación. Con un pequeño argumento adicional para explicar el fuera de-1 cuando k es impar, esta solución es en realidad O (log k), que es O (log n) ya que k < = 2 * n.
Vi este problema en un examen de calificación no hace mucho tiempo, y huele como un problema de tarea. Por lo tanto, haré solo dos sugerencias:
Estudie la búsqueda binaria, prestando especial atención a la naturaleza precisa de las invariantes de bucle. El libro de Jon Bentley Programming Pearls tiene una buena explicación
Intente generalizar las invariantes para la búsqueda binaria.
Haz un dibujo con varios casos especiales:
- Cada número en DB1 es más pequeño que cada número en DB2
- Viceversa
- DB1 es igual a DB2
- Cada número en DB2 es dos veces el número correspondiente en DB1
Este es un problema bastante difícil; Tendrás un tiempo más fácil si vas directamente a una prueba de corrección.
... * dos * sugerencias? –
@Tom: Este tipo de cosas es bastante típico para los profesores. Para cuando un profesor ha escrito dos sugerencias, piensa en un tercero. Creo que voy a dejarlo :-) –
@Tom: dos sugerencias: miedo y sorpresa, y una eficiencia despiadada. –
Consejos:
- observar sus "bases de datos" son realmente dos conjuntos ordenados.
- Toma elementos del "medio" de las matrices y compáralos. El resultado de la comparación podría permitirle "descartar" una parte.
- 1. Dividir y conquistar - Array plural
- 2. dividir y conquistar y recursión
- 3. Programación dinámica y Dividir y conquistar
- 4. Dividir una lista en listas más pequeñas de N tamaño
- 5. Dividir una cadena/número cada enésimo carácter/número?
- 6. Cómo paralelizar un algoritmo de dividir y conquistar en Clojure
- 7. Sincronización entre dos bases de datos
- 8. Fortran: el número entero más grande y el más pequeño
- 9. ¿Algún idioma funcional admite dividir y conquistar de forma nativa?
- 10. Paralelismo en el algoritmo de dividir y conquistar
- 11. ¿Busca el n-ésimo elemento más pequeño en la matriz sin ordenar?
- 12. Pruebas unitarias en aplicaciones web que usan bases de datos
- 13. Número más grande y más pequeño en una matriz
- 14. Agregar relación de clave externa entre dos bases de datos
- 15. Forma más rápida fusionar dos bases de datos SQLITE
- 16. ¿Cómo puedo encontrar las diferencias entre dos bases de datos?
- 17. Algoritmo para encontrar el N más pequeño de forma que N! es divisible por un primado elevado a una potencia
- 18. Comparar dos bases de datos SQL
- 19. manera más pequeño para expandir una lista de n
- 20. C++ elenco a la matriz de un tamaño más pequeño
- 21. Significado de "n: m" y "1: n" en el diseño de bases de datos
- 22. Conéctese a dos bases de datos
- 23. C Trae enésimo byte de número entero
- 24. ¿De qué tamaño son las instalaciones de bases de datos SQL Server más grandes del mundo?
- 25. ¿Comparar estructuras de dos bases de datos?
- 26. Tamaño óptimo para particiones de bases de datos
- 27. ¿Diferentes bases de datos usan una cita de nombre diferente?
- 28. MySQL: tipo de datos más pequeño para un bit
- 29. encontrar el polígono convexo que contiene más pequeño con un número determinado de puntos
- 30. ¿ActiveRecord habla con dos bases de datos?
muy bien explicado – user2290820