Se le da una lista de ( a, b ) y una lista de x . Calcule el máximo ax + b para cada x . Se puede suponer una , b y x son números enteros no negativos.
Su programa o función debe ejecutarse en el tiempo esperado (al azar si su código involucra eso, no la entrada) O ( n log n ) tiempo donde n es la longitud de entrada total (suma o máximo de las longitudes de ambas listas).
Este es el código de golf. El código más corto gana.
Ejemplo
[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]
Salida:
[11 12 14 16 20]
Explicación:
11 = 1*1 + 10
12 = 1*2 + 10 = 2*2 + 8
14 = 2*3 + 8
16 = 2*4 + 8 = 4*4 + 0
20 = 4*5 + 0
Nota sobre la complejidad:
Si usó un incorporado que tiene una buena complejidad de caso promedio, y puede ser aleatorizado para obtener la complejidad esperada fácilmente en teoría, puede asumir que su idioma lo hizo.
Eso significa que, si se puede probar que su programa está en O ( n log n ), posiblemente con excepciones de casos extremos debido a la implementación de su lenguaje, pero no se puede ver lógicamente en su propio código, diremos que es O ( n log n ).
fuente
O(n log(n))
? ¿Puedes proporcionar un algoritmo de referencia?Respuestas:
Pyth -
9998 bytesEsta es más o menos una traducción directa de la respuesta de Python de @ KeithRandall. Definitivamente se puede jugar mucho más al golf.
Publicaré una explicación pronto.Toma dos listas delimitadas por comas, separadas por comas mediante stdin.
Pruébalo aquí
fuente
Python, 214 bytes
Calcula el casco convexo iterando a través de la entrada
a,b
ena
orden creciente . El casco convexo se registraH
utilizando el formato-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bn
dondexi
es la coordenada x de la intersección dea{i-1},b{i-1}
yai,bi
.Luego itero a través de la entrada
x
s en orden ordenado, truncando el casco convexo para mantener el ritmo a medida que avanzo.Todo es lineal excepto los tipos que son O (n lgn).
Ejecútalo como:
fuente
H
forma lineal para cada unox
enX
, ¿verdad ?. ¿No es posible que tengamos complejidad O (n ^ 2) cuando ambas listas tienen la misma longitud?H
linealmente para cada unox
, pero debido a que hago losx
s en orden, recuerdo dónde se detuvo la última búsqueda y comienzo la siguiente búsqueda allí. Por lo tanto, elwhile
bucle interno puede ejecutarse como máximo O (n) veces en todosx
(aunque podría ejecutar O (n) veces para cualquier individuox
).while
bucle interno en el primerfor
bucle.Haskell, 204
271bytesEditar : jugó mucho más al actualizar el casco convexo como una lista (pero con la misma complejidad que la versión sin golf), usando "split (x + 1)" en lugar de "splitLookup x", y eliminando todas las llamadas a funciones calificadas como Predule. pliegue
Esto crea una función f que espera la lista de pares (a, b) y una lista de valores x. Supongo que cualquier miembro de la familia APL lo dejará boquiabierto con las mismas ideas, pero aquí va:
Uso de la muestra:
Funciona en tiempo O (n log n); ver abajo para el análisis.
Editar: Aquí hay una versión sin golf con el análisis big-O y una descripción de cómo funciona todo:
fuente
Lisp común - 648
692Con una búsqueda binaria real.
Explicación
Sea n la longitud de (a, b) yk la longitud de los puntos.
a
(líneas paralelas), conservando solo la línea paralela con el máximob
, que siempre es mayor que la otra (evitamos divisiones por cero al calcular las intersecciones) - O (n)dada esa lista, construya una lambda que realice una comprobación de intervalo para su entrada y calcule el valor máximo: el árbol binario está construido en O (n) (consulte /programming//a/4309901/124319 ). La búsqueda binaria que se aplicará tiene una complejidad O (ln (n)) . Con la entrada de ejemplo, creamos la siguiente función (esa función se compila luego):
aplicar esa función para todos los elementos - O (k.ln (n))
Complejidad resultante: O ((n + k) (ln n))) en el peor de los casos.
No podemos proporcionar una estimación de complejidad para el número total de entradas (n + k), porque k y n son independientes. Por ejemplo, si n es wrt k asintóticamente negligente , entonces la complejidad total sería O (k) .
Pero si suponemos que k = O (n) , entonces la complejidad resultante es O (n.ln (n)) .
Otros ejemplos
Y si retrocedemos las citas para ver qué se está calculando, podemos ver que ni siquiera necesitamos hacer ninguna comparación (una vez que la primera lista está preprocesada):
Aquí hay otro ejemplo (tomado de un comentario):
La función efectiva:
fuente
(LIST* A B C R) should be a lambda expression
.(use-package :optima)
(editar ...)optima
. Finalmente, el código que proporcioné debe ser evaluable.(MAPCAR (EVAL (LAMBDA (X) ...
que se evalúa a la respuesta. ¿Dejaste algún código de depuración allí?