Recentemente, fui entrevistado em uma entrevista para elaborar um algoritmo que divide um conjunto de pontos em um sistema de coordenadas, de modo que metade dos pontos esteja em um lado da linha e o restante no outro lado.
Os pontos são colocados de maneira desigual e a linha não deve passar por nenhum dos pontos.
Alguém pode dar uma abordagem para resolver o problema? A análise do algoritmo é apreciada.
Dicas: conte os pontos, use medianas.
Presume-se que o número de pontos seja par.
Respostas:
Uma abordagem é escolher uma direção "genérica" (na prática, uma direção aleatória), projetando todos os pontos nessa direção e, em seguida, usando um algoritmo mediano (sua linha deve corresponder a qualquer tradução que esteja entre as duas medianas). Se você escolher uma direção incorreta, os pontos poderão se agrupar, impossibilitando separá-los nessa direção. No entanto, se você escolher uma direção "genérica", isso não acontecerá (supondo que os pontos sejam distintos). Como existem algoritmos lineares de tempo médio, esse é um algoritmo . Usando o algoritmo de seleção rápida aleatória, você obtém um algoritmo de tempo linear prático.O(n)
fonte