2017-10-12 7 views
1

저는 사각형 (즉, 영역)이있는 눈금에서 일부 지리적 계산을 수행하고 있습니다. 나는 델파이를 사용하고 있지만 논리는 아마 C++에도 적용될 수 있습니다. 우선 내가하고 싶은 일을 설명해 드리겠습니다.존재하지 않는 데이터 액세스 또는 생략

다음 이미지 "는 층을 통한 이동"각 사각형의 중심점을 나타내고, 2 차원 배열 Square로 표시되는 내 그리드의 일부분과 같습니다

Image

녹색 사각형의 X 및 Y 좌표는 2이므로 Square[2,2]입니다. 실제 좌표는 예컨대 Square[2,2].LatitudeSquare[2,2].Longitude에 추가 정보로서 저장된다. 내가 계산에 사용하는 Square[2,2].Info.

이제 목적이 생겼습니다. 주변 지역에 대한 계산이 필요합니다. 주변 지역 중 얼마나 많은 사람들이 "이웃"이라고 불릴 수 있는지는 내가 정의한 "층"의 수에 달려 있습니다. 위의 이미지에서 두 개의 "레이어"를 사용했습니다. 즉, 녹색 셀에서 시작하면 그 주위를 한 번 (파란색 화살표) 이동 한 다음 두 번째 레이어 (빨간색 화살표)를 다시 이동합니다.

이제 문제가 발생합니다. 아래 이미지에서 Square[2,2] 대신 Square[1,1] (녹색 사각형)으로 시작했을 경우 두 번째 레이어 (빨간색)는 왼쪽과 아래쪽의 데이터에 액세스하려고합니다. 존재하지 않습니다 (예 : "-1"열과 행). 아래 이미지를 참조하십시오. 이 문제는 물론 모든 국경에서 발생합니다.

Image

나는 아마 모든 시나리오에 대한 IF-문으로 예외를 만들 수 있습니다,하지만 당신은 존재하지 않는 데이터를 액세스하려고 할 경우 이러한 상황을 처리 할 수있는 일반적인 프로그래밍 "속임수"가 있는지 궁금 해서요.

예를 들어, 존재하지 않는 사각형이 있더라도 첫 번째 이미지에 묘사 된 화살표 패턴을 따라 모든 인접한 사각형에 매 시간 액세스 할 수 있다면 매우 편리하다고 상상해보십시오. 따라서 첫 번째 이미지를 보면 Square[3,0] 다음에 Square[3,-1] 등의 정보를 입력하면 Square[0,3]의 '실행 가능'영역으로 돌아옵니다.

+0

너무 광범위하다고 판단합니다. StackOverflow는 알고리즘을 작성하는 사람이 아니며 알고리즘 디자인에 대한 자습서를 추천합니다. 특정 문제에 대한 질문의 초점을 좁혀주십시오. –

+0

코드를 최적화하기 전에 처리해야 할 가장 큰 데이터 셋은 무엇입니까? 모든 요소를 ​​반복함으로써 가장 큰 데이터 세트에서 기존 O (n) 접근 방식을 시도해 보셨습니까? 모든 요소를 ​​방문하면 아마 그렇게 할 수 있습니다. – user3437460

+0

@RemyLebeau : 죄송합니다. 게시물을 편집하여 더 많은 정보와 프로그래밍 문제를 해결했습니다. – artnaz

답변

0

주변을 방문하려면 일종의 BFS (너비 우선 검색)을 사용할 수 있습니다.

그러나 스파 스 구조 (마지막 그림과 같이)에서는 데이터 구조를 사용하여 좋은 방법으로 셀을 구성하는 것이 좋습니다. 아마도 kd-tree이 적합합니다. 트리의 모든 기존 셀을 추가하고 지정된 셀 주변에서 범위 검색을 수행하여 주변의 다른 셀을 가져옵니다.

또한 다른 공간 데이터 구조를 살펴보십시오 (kd-tree 페이지 하단의 목록 참조).

+0

* 너비 * 처음 검색하지 않아야합니까? (당신은 빵집에서 구입하는 것에 대해 이야기하지 않습니다.) https://en.wikipedia.org/wiki/Breadth-first_search – dummzeuch

+0

고마워요, 그것은 실제로 가능한 방법 일 것입니다. 그러나 백만 개의 위치가 있다면 모든 위치에서 그러한 분할 기법을 수행하는 것이 상당히 비효율적입니다. 필자의 경우, 나는 이웃들이 내가 그린 화살표로 접근 할 수있는 것을 정확히 알고있다. 그러나 문제는 지역 외부에 존재하는 존재하지 않는 지역을 접근하는 방법을 프로그램하는 것입니다. 아니면 당연히 생각하는 것만 큼 쉽지 않을 것입니다 ... – artnaz