Você recebe uma lista de ( a, b ) e uma lista de x . Calcule o eixo máximo + b para cada x . Você pode assumir a , b e x são inteiros não negativos.
Seu programa ou função deve ser executado no tempo esperado (aleatoriamente se o seu código envolver isso, não na entrada) O ( n log n ) tempo em que n é o comprimento total da entrada (soma ou máximo dos comprimentos de ambas as listas).
Isso é código-golfe. O menor código vence.
Exemplo
[[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5]
Resultado:
[11 12 14 16 20]
Explicação:
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 a complexidade:
Se você usou um built-in com uma boa complexidade de caso médio e pode ser randomizado para obter facilmente a complexidade esperada em teoria, você pode assumir que seu idioma fez isso.
Isso significa que, se seu programa puder ser testado como O ( n log n ), possivelmente com exceções de maiúsculas e minúsculas por causa da implementação do seu idioma, mas não puder ser visto logicamente em seu próprio código, diremos que é O ( n log n ).
fonte
O(n log(n))
? Você pode fornecer um algoritmo de referência?Respostas:
Pitão -
9998 bytesEsta é praticamente uma tradução direta da resposta em Python do @ KeithRandall. Definitivamente pode ser jogado muito mais.
Em breve postarei uma explicação.Leva duas listas delimitadas por vírgula, separadas por vírgulas por meio de stdin.
Experimente aqui
fonte
Python, 214 bytes
Calcula o casco convexo iterando pela entrada
a,b
ema
ordem crescente . O casco convexo é registradoH
usando o formato em-1,0,x1,a1,b1,x2,a2,b2,x2,...,xn,an,bn
quexi
é a coordenada x da interseção dea{i-1},b{i-1}
eai,bi
.Então, eu itero as entradas
x
na ordem classificada, truncando o casco convexo para acompanhar o andamento.Tudo é linear, exceto os tipos que são O (n lgn).
Execute-o como:
fonte
H
linearmente para cadax
noX
, não é ?. Não é possível termos complexidade O (n ^ 2) quando ambas as listas têm o mesmo comprimento?H
linearmente para cada umx
, mas, como faço parax
s, lembro onde a última pesquisa parou e inicie a próxima pesquisa lá. Portanto, owhile
loop interno pode executar no máximo O (n) vezes em todosx
(mesmo que possa executar O (n) vezes para qualquer indivíduox
).while
loop interno no primeirofor
loop.Haskell, 204
271bytesEdit : jogou golfe ainda mais, atualizando o casco convexo como uma lista (mas com a mesma complexidade da versão não destruída), usando "split (x + 1)" em vez de "splitLookup x" e removendo todas as chamadas de função qualificadas, como Predule. foldl.
Isso cria uma função f que espera a lista de (a, b) pares e uma lista de valores x. Eu acho que vai ser deslumbrado longitudinalmente por qualquer coisa na família APL usando as mesmas idéias, mas aqui vai:
Uso da amostra:
Funciona em tempo O (n log n); veja abaixo para análise.
Edit: Aqui está uma versão não-gasta com a análise big-O e uma descrição de como tudo funciona:
fonte
Lisp comum - 648
692Com uma pesquisa binária real.
Explicação
Seja n o comprimento de (a, b) ek o comprimento dos pontos.
a
(linhas paralelas), mantendo apenas a linha paralela com o máximob
, sempre maior que a outra (evitamos divisões por zero ao calcular interseções) - O (n)dada essa lista, crie um lambda que execute uma verificação de intervalo para sua entrada e calcule o valor máximo - a árvore binária é construída em O (n) (consulte /programming//a/4309901/124319 ). A pesquisa binária que será aplicada possui complexidade O (ln (n)) . Com o exemplo de entrada, criamos a seguinte função (essa função é então compilada):
aplique essa função a todos os elementos - O (k.ln (n))
Complexidade resultante: O ((n + k) (ln n))) no pior cenário.
Não podemos fornecer uma estimativa de complexidade para o número total de entradas (n + k), porque k e n são independentes. Por exemplo, se n for wrt k assintoticamente desprezível , a complexidade total seria O (k) .
Mas se supormos que k = O (n) , a complexidade resultante é O (n.ln (n)) .
Outros exemplos
E se movermos as aspas para ver o que está sendo calculado, podemos ver que nem precisamos fazer nenhuma comparação (depois que a primeira lista for pré-processada):
Aqui está outro exemplo (retirado de um comentário):
A função efetiva:
fonte
(LIST* A B C R) should be a lambda expression
.(use-package :optima)
(edição ...)optima
. Finalmente, o código que forneci deve ser avaliável.(MAPCAR (EVAL (LAMBDA (X) ...
e avalia a resposta. Você deixou algum código de depuração lá?