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,benaorden creciente . El casco convexo se registraHutilizando el formato-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bndondexies la coordenada x de la intersección dea{i-1},b{i-1}yai,bi.Luego itero a través de la entrada
xs 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
Hforma lineal para cada unoxenX, ¿verdad ?. ¿No es posible que tengamos complejidad O (n ^ 2) cuando ambas listas tienen la misma longitud?Hlinealmente para cada unox, pero debido a que hago losxs en orden, recuerdo dónde se detuvo la última búsqueda y comienzo la siguiente búsqueda allí. Por lo tanto, elwhilebucle interno puede ejecutarse como máximo O (n) veces en todosx(aunque podría ejecutar O (n) veces para cualquier individuox).whilebucle interno en el primerforbucle.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í?