notas de optimización
Tanto los algoritmos hashset y radix sort pueden ser optimizados por señalar tres hechos:
- pares e impares valores se puede manejar por separado
- calcular una raíz cuadrada entero es una operación muy rápida (típicamente consta de 3-5 divide y unos pocos añade)
- Cache localidad es importante para ambos de estos algoritmos
El optimizados los algoritmos que se muestran a continuación suelen ser 5 veces más rápidos y utilizan menos de la mitad de la RAM del caso no optimizado. En algunos casos, cuando el tamaño de los datos es similar al tamaño de caché L2/L3, pueden realizarse 100 veces más rápido o más.
algoritmo optimizado basado en radix tipo
estructura de datos es cinco listas de números enteros: IN, AODD, Bodd, Apar, Beven El listas A y B utilizan la mitad del tamaño entero de IN. (Por ejemplo, si EN = 64bits, Un & B = 32bits)
- lista de exploración en para encontrar el mayor números pares e impares MAXodd y MAXeven
- Deje LIMITodd = piso (sqrt (MAXodd))
- Let LIMITeven = floor (sqrt (MAXeven))
- Para cada número en la lista IN: a. Calcule la raíz cuadrada si es positiva. Si es exacto, agregue la raíz cuadrada para listar Aodd/Aeven. segundo.Si el número es> = 0 y < = LIMITodd/LIMITeven, añadirlo a la lista Bodd/Beven
- lista de ordenación Radix AODD y Bodd utilizando sólo log2 (LIMITodd) bits
- Escaneo lineal AODD y Bodd para un partido
- Radix lista de ordenación Apar y Beven utilizando sólo log2 (LIMITeven) bits
- escaneo lineal Apar y Beven para un partido
Si cualquiera de exploración lineal encuentra una coincidencia, devuelve ese partido inmediatamente.
La razón de que esto es mucho más rápido que el algoritmo radix tipo sencillo que es:
- Las matrices están ordenados Typicaly tener menos de 1/4 del número de valores y necesita sólo la mitad del número de bits por entero , por lo que un total de menos de 1/8 de RAM en uso en un tipo determinado que es bueno para la memoria caché.
- La especie radix se hace en mucho menos bits que conducen a un menor número de pases, por lo que incluso si lo hace superar el L1 o L2 caché de leer RAM menos veces, y se lee mucho menos RAM
- La exploración lineal es típicamente mucho más rápido debido a que el Una lista contiene sólo las raíces exacta cuadrados y la lista B sólo contiene valores pequeños
algoritmo optimizado basado en hashset
estructura de datos es la lista de números enteros en, además de dos hashsets a y B el Los conjuntos A y B usan la mitad del tamaño entero e de IN
- lista de exploración en encontrar el mayor números pares e impares MAXodd y MAXeven
- Deje LIMITodd = piso (sqrt (MAXodd))
- Deje LIMITeven = piso (sqrt (MAXeven))
- Para cada número impar en la lista IN: a. Calcule la raíz cuadrada si es positiva. Si es exacto, compruebe si existe raíz cuadrada en B & devuelva si es verdadero; de lo contrario, agréguela a A. b. Si el número es> = 0 y = < LIMITodd/LIMITeven, comprobar si existe en un & regreso si lo contrario añadirlo a B.
- Borrar A y B y repita el paso 4 para los números pares verdaderos
la razón de que esto es más rápido que el algoritmo hashset sencillo es que:
- la hashset es normalmente 1/8 de la cantidad de memoria RAM que conduce a un mejor rendimiento de la caché
- entradas Sólo cuadrados exactos y números pequeños han hashset, por lo mucho menos tiempo se pasa h reducción a cenizas y la adición/valores eliminación
Hay una pequeña optimización adicional disponible aquí: A y B puede ser un solo hashset, que almacena bandera de bits con cada entrada para decir si el entero es en A o B (que puede No estar en ambos porque entonces el algoritmo habría terminado).
¿Se puede usar espacio extra? Intenta pensar cómo podrías usarlo. –
Publicar lo que ya has intentado sería agradable. De esa forma podríamos ver qué tan cerca está de una solución. –
La pregunta no establece una limitación específica en el espacio, pero creo que debería ser razonable. – gillyb