Algoritmo para encontrar uma linha que divide o número de pontos igualmente

7

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.

Ravi Teja
fonte
Presumo pontos são todos em um avião D? 2
Aryabhata

Respostas:

9

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)

Yuval Filmus
fonte
Eu sinto que isso funciona melhor ao explicar a mesma idéia. "direção" em vez de "linha" me deixou confusa.
Bernhard Barker