2013-09-23 4 views
6

I는 각각 (1.33, 103.4) 포맷은 [위도 두 ArrayList를 더블 데이터 유형 1.latitudes 2. 경도, 200 위에 소자 배열에서 가장 가까운 좌표 찾기?

내가 말하고, 랜덤 테스트 좌표를 제공 대답했다 한 , 경도]

가장 가까운 포인트를 쉽게 찾을 수있는 알고리즘이 있습니까? 아니면 모든 가능한 포인트를 계산하고, 빗변을 찾고, 가장 가까운 포인트를 반환하기 위해 200 개의 hypotenuses를 비교해야합니까? 감사

+2

를 정렬하는 것입니다. 또한 모든 포인트는 지리적으로 서로 가깝기 때문에이 영역을 평이한 것으로 간주 할 수 있습니다. 그렇지 않으면 지구의 곡률을 고려해야합니다. –

+3

거리의 정의는 무엇입니까?"hypothenuse"는 평면 기하학에서 나온 용어이지만 "경도"와 "위도"를 사용하면 점이 구면의 표면에 있음을 나타냅니다. – meriton

+3

R 나무 (https : // ko)를 보았습니까? .wikipedia.org/wiki/R-tree)? 또는 일반적으로 공간 인덱싱 알고리즘 (https://en.wikipedia.org/wiki/Spatial_index#Spatial_index)? –

답변

0

배열이 정렬 된 경우 이진 검색을 사용하여 배열에서 요청 된 지점의 위치를 ​​찾을 수 있습니다. 색인을 찾은 후에 가장 가까운 것을 찾기 위해 4 개의 지점을 확인해야합니다.

1) 당신이 가정이 정렬 된 배열의 현명한 경도 및 위도 현명한

2

) 먼저 하나를 검색하고이 근처에 점

3를 찾을 수) 그런 다음 두 번째를 검색하고이 더 많은 포인트를 찾을 수

4) 이제 (결과는이 점은 대상 지점 주위에 사각형을 형성합니다))

5 교차 수도 2 ~ 4 점에서이

6) 가장 가까운 지점 찾기

2

한 축을 따라 점들의 배열을 정렬하십시오. 그런 다음 배열에서이 축을 따라 필요한 점에 가장 가까운 점을 찾고 거리를 계산합니다 (문제의 토폴로지 및 축척에 적합한 측정 항목을 사용).

그런 다음이 지점까지의 거리가 지금까지의 최상의 결과보다 커질 때까지 양방향으로 배열을 검색하십시오. 최단 거리 지점이 답입니다.

이로 인해 전체 배열을 검색해야 할 수 있으며 문제의 기하학에 따라 제약을받는 Branch and bound의 형식이됩니다. 포인트가 검색 할 포인트 주변에 합리적으로 균등하게 분포되어 있으면 스캔을 수행 할 필요가 없습니다.

대체 공간 인덱스 (쿼드 트리와 같은)는 더 나은 결과를 제공하지만 포인트 수가 적 으면 인덱스를 준비하는 데 드는 비용이 단순 정렬보다 훨씬 커집니다. 다른 배열은 같은 방식으로 정렬되지 않으므로 정렬로 인해 발생하는 위치 변경을 추적해야합니다. 데이터를 단일 점 배열로 변경하면 정렬은 동시에 전체 점의 순서를 변경합니다.

0

long (또는 lat) 축을 검색하는 데 가장 가까운 lat (또는 long) 값을 선택해야한다는 사실은 사실이 아닙니다. 실제로 long (또는 long) 선상에 있지만 long 위도) 값

worng approach

그래서 가장 좋은 방법은 모든 빗변을 계산하는 경우에, 당신은 거리를 계산하고 모두 하나 개의 루프 분 (거리) 로직을 구현할 수있는 모든 거리를 계산하고 그들에게

+0

한 축을 따라 가장 가까운 점을 선택하는 접근법이 검색의 시작점입니다. 그것은 적어도 하나의 축을 따라 거리를 최소화합니다. 후속 프로브 (양방향 모두)가 가장 가까운 점을 식별합니다. 거리 메트릭의 선택은 고려되는 영역의 곡률에 따라 다릅니다. – Pekka

관련 문제