Não sei como resolver esse problema no tempo , mas existe um algoritmo O ( n 2 log n ) .O ( n2)O ( n2registron )
Seja o círculo cujo centro é s i , o i- ésimo ponto, com raio r . Não é difícil descobrir que o conjunto de pontos P = { p 0 , p 1 , … , p m } possa ser delimitado por um círculo com raio r se a interseção I ( P ) de C ( p 0 ) , C ( p 1 ) , …C( sEu)sEuEurP= { p0 0, p1, … , Pm}rEu( P) não está vazio. Além disso, se I ( P ) não estiver vazio, deve haver alguns pontos em I ( P ) colocados em algum bd C ( p i ) (o limite de C ( p i ) ). Portanto, para cada C ( s i ) e cada ponto p em sua ligação, tentamos descobrir quantos círculos contêm p . A contagem máxima entre todos os p será a resposta para esse problema.C( p0 0) , C(p1) , … , C(pm)Eu(P)Eu(P)bd C( pEu)C( pEu)C( sEu)ppp
Vamos examinar os pontos em . Existe um mapeamento individual entre os pontos em bd C ( s i ) e o número real em [ 0 , 2 π ) . Para cada círculo C ( s j ) , a interseção entre C ( s j ) e bd C ( s i ) pode ser representada por um intervalo [ b e g i n jbd C( sEu)bd C( sEu)[ 0 , 2 π)C( sj)C( sj)bd C( sEu) . Portanto, para todos os círculos que não sejam C ( s i ) , há no máximo n - 1 intervalos (alguns círculos podem não se cruzar com C ( s i ) ). A contagem máxima pode ser encontrada facilmente, classificando todos os 2 ( n - 1 ) pontos finais do intervalo, varrendo-os em ordem e contando o número sobreposto atual. Para cada C ( s i ) , esta etapa pode ser realizada em O ( n log n[ b e geu nj, E n dj]C( sEu)n - 1C(si)2(n−1)C(si) time, e existem n tais círculos, portanto, a complexidade do tempo desse algoritmo é O ( n 2 log n ) .O(nlogn)nO(n2logn)
Acho que as perguntas difíceis são saber se o círculo que você selecionou é realmente "máximo" dentro do conjunto. A única maneira de pensar para determinar isso é tentar todas as combinações possíveis dos pontos e testar o tamanho do círculo que os envolve.
Você pode reduzir o espaço de pesquisa dividindo primeiro o espaço do ponto em uma grade de células quadradas com largura 2r. Em seguida, localize a célula com a maior densidade. Como você já localizou um círculo de X pontos, pode concluir que, se um círculo existir com mais pontos, ele deverá ter pelo menos X pontos. E use isso como ponto de partida para testar as diferentes combinações dos pontos.
Se você estiver procurando apenas um conjunto de pontos que provavelmente seja o máximo, poderá reduzir ainda mais o número de combinações que precisa testar selecionando aqueles que se enquadram em uma vizinhança de células onde a densidade da vizinhança é maior que X.
Dito isto, ambas as "reduções" podem falhar e, na pior das hipóteses, você estará computando círculos para todas as combinações possíveis de pontos.
fonte
fonte