Algoritmo para encontrar a menor diferença na matriz


8

Queremos um algoritmo que, considerando uma matriz de comprimento de números inteiros, encontre a diferença mínima entre dois números inteiros na matriz.n

Um desses algoritmos é classificar a matriz e verificar pares de números adjacentes. Isso leva tempo .O(nlogn)

Existe uma maneira mais rápida, por exemplo, um algoritmo ?O(n)


O(n) não é mais rápido do queO(nlogn)
David Merinos

Respostas:


7

Isso depende do seu modelo de computação. Se você permitir apenas aritmética e comparações (o modelo de árvore de decisão algébrica), haverá um limite inferior para a distinção de elementos , o problema de decidir se todos os elementos são distintos. Seu problema é obviamente ainda mais difícil, portanto o mesmo limite inferior se aplica.Ω(nlogn)

(Há algumas letras miúdas: o limite inferior só é válido se o grau dos polinômios comparados estiver limitado. Se tudo o que você está fazendo é comparar várias diferenças , então está . O modelo de árvore de decisão algébrica também permite comparar polinômios mais gerais nas entradas, desde que tenham graus limitados.)xixj

Existem outros modelos que podem ter um desempenho melhor - por exemplo, em alguns modelos, você pode classificar números inteiros em . Mas imagino que você não queira permitir o tipo de truque usado em tais algoritmos.o(nlogn)


Obrigado. O que você quer dizer com "comparar várias diferenças "? Como existem esses pares, isso não levaria tempo ? xixjΘ(n2)Ω(n2)
boaten

Não necessariamente. Os algoritmos baseados em comparação são permitidos apenas para comparar pares de elementos. Aqui, estou permitindo que você faça consultas mais complicadas, como ou até . Sabemos que existe uma solução que usa comparações do tipo e comparações do tipo . A questão é: você pode fazer melhor, e a resposta é não, se você estiver restrito a fazer consultas lineares (ou, em geral, consultas com graus limitados). x1x2>x3x4x1+5x817x3<5O(nlogn)xi>xjO(n)xixj>xkx
Yuval Filmus

Não tenho certeza se entendi o significado prático desse limite para a distinção de elementos. Você não teria um O (n) esperado com uma tabela de hash?
Jkff #

Uma tabela de hash não pode ser implementada usando esse modelo de computação. Em geral, limites mais baixos são difíceis de provar. O modelo de árvore de decisão algébrica é aquele em que limites inferiores não triviais são prováveis. Não vejo como provar um limite inferior em nenhum outro modelo - na verdade, esses limites inferiores são normalmente conhecidos apenas por funções aleatórias. Você está certo de que pode haver um truque que vai além desse modelo, mas não consigo pensar em nenhum. ω(n)o(nlogn)
Yuval Filmus

-1

Se os números inteiros na matriz tiverem um número limitado de dígitos, você poderá classificar uma matriz com o algoritmo de classificação radix , que é O (kN) e verificar os pares adjacentes de números (O (N))? A complexidade resultante será O ((k + 1) N), linear.


1
Lembre-se das condições sob as quais o tempo de execução da classificação de base é realmente bom.
Raphael

@ Rafael Bem, a pergunta original era se o algoritmo linear existe, então pensei nisso. Você quer dizer que k será maior que log (N) para N pequeno?
Pavel Davydov

k e são parâmetros independentes, razão pela qual a classificação radix não é um algoritmo de tempo linear para todas as entradas e, portanto, não contradiz o associado à classificação (comparação). (O artigo da Wikipedia explica isso também.)NΩ(nlogn)
Raphael

@ Rafael Sim, mas para uma matriz de números inteiros com menos de 64 bits (isso é um caso bastante comum), será linear. Vou editar minha resposta. Obrigado por seus comentários.
Pavel Davydov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.