Para esta tarefa, seu código deve receber duas matrizes classificadas de números inteiros X e Y como entrada. Ele deve calcular a soma das distâncias absolutas entre cada número inteiro em X e o número mais próximo em Y.
Exemplos:
X = (1 5,9)
Y = (3,4,7)
A distância é 2 + 1 + 2.
X = (1,2,3)
Y = (0,8)
A distância é 1 + 2 + 3.
Seu código pode receber entradas da maneira que for conveniente.
A principal restrição é que seu código deve ser executado em tempo linear na soma do comprimento das duas matrizes. . (Você pode assumir que a adição de dois números inteiros leva tempo constante.)
1 + 2 + 3
derivadoX = (1,2,3)
eY = (0,8)
?1
,2
e,3
emY
é0
. Assim, as diferenças são1-0
,2-0
,3-0
.Respostas:
Haskell ,
7064 bytesExperimente online!
Explicação
Primeiro, definimos
(%)
como a diferença absoluta entre dois números. Então, definimos(#)
como a função interessante. Na primeira linha, correspondemos quando as duas listas não estão vazias:Em nosso primeiro caso a partir daqui que se ligam
d
ae:_
come:_<-d
. Isso garante qued
não esteja vazio e define seu primeiro elementoe
.Então, se o segundo elemento de ( ) é mais estreita do que a primeira ( ) para o primeiro elemento de ( ), voltamos a remoção do primeiro elemento de e ligando de novo com o mesmo .X Y XY X Y X
e
c
a
x#d
Se correspondermos ao padrão, mas não passarmos a condição, fazemos:
O qual remove o primeiro item de e adiciona a diferença absoluta do primeiro elemento de ao resultado restante.XX X
Por fim, se não correspondermos ao padrão, retornamos . Não corresponder ao padrão significa que deve estar vazio porque não pode estar vazio.X Y0 X Y
Este algoritmo possui notação de ordem .O(|X|+|Y|)
Haskell , 34 bytes
Aqui está como eu faria isso no tempo :O(|X|×|Y|)
Experimente online!
fonte
Python 2 ,
124120 bytesExperimente online!
Salva 4 bytes movendo-se para programa versus função.
É possível atender à restrição de complexidade de tempo porque as duas listas são classificadas. Observe que toda vez que o loop
i
é incrementado ouj
incrementado. Assim, o loop é executado na maioria daslen(X)+len(Y)
vezes.fonte
C (gcc), 82 bytes
Isso recebe a entrada como duas matrizes inteiras e seus comprimentos (já que C não tem como obter seu comprimento). Isso pode ser mostrado para executar
O(a+b)
porquea
oub
é diminuído em cada iteração do loop, que termina quandoa
atinge0
(eb
não pode ser diminuído abaixo0
).Experimente online!
Algumas notas:
Em vez de indexar nas matrizes, incrementar os ponteiros e desreferenciar diretamente economiza bytes suficientes para que valha a pena (
*x
vsx[a]
ey[1]
vsy[b+1]
).A
--b&&
condição verifica deb>1
maneira indireta - seb
for1
, ela será avaliada como zero. Como isso modificab
, não precisamos alterá-lo no primeiro ramo do ternário (que avançay
), mas precisamos alterá-lo novamente no segundo (que avançax
).Nenhuma
return
declaração é necessária, porque a magia negra. ( Acho que é porque a última instrução a ser avaliada sempre será an+=...
expressão, que usa o mesmo registro que o usado para valores de retorno.)fonte
Ruby, 88 bytes
Experimente online!
Além disso, por diversão, uma função anônima mais curta que não atende às restrições de complexidade:
fonte
[5, 6], [0, 1, 5]
.JavaScript (Node.js) , 80 bytes
x
,y
são passados por referência, que não copiam o conteúdo1/v
é falso sex[i]
estiver fora de alcance, de outra format
->d>y[j+1]-v
->v+v>y[j]+y[j+1]
é falso desde que as seguintes condições sejam atendidas. E que meiosy[j]
é o número mais próximov
nay
v
é menor que(y[j]+y[j+1])/2
, ouy[j+1]
está fora do intervalo, que seria convertido emNaN
e comparado com oNaN
rendimentofalse
>
cartaz para economizar mais 1 bytet
é sempre um valor booleano e*
converte-o para0
/1
antes de calcularExperimente online!
fonte
Mathematica, 40 bytes
Se você deve criar um programa completo, com entradas:
Aqui está o momento para até 1.000.000 de pontos (amostrados a cada 10.000) para
y
:Perto de linear.
fonte