문제

내가 찾는 것은 좋은 알고리즘을 줄 수 있는 나에게 독특한 가장자리에서의 다각형 데이터입니다.이 경우에,이 다각형은 정의 두 배열입니다.하나의 배열은 수의 포인트별 다각형,그리고 다른 배열은 목록의 정점을 지수입니다.

나는 버전이 있는 그지만,성능이 느리에 도달 할 때 500,000 길 수 없습니다.내 버전 산책을 통해 각각의 얼굴과 추가 각자의 정점을 stl::설정합니다.나의 데이터 설정은 주로 삼각형 쿼드 폴리,그리고 대부분의 가장자리에 공유될 것입니다.

이 있는 똑똑한 알고리즘에 대한 이?

도움이 되었습니까?

해결책


사용 두 번 해시 지도입니다.
각 가장자리에는 두 개의 인덱스,B.말할 수는 A>B
첫째,최고 수준의 해쉬도 지도를 다시 지도는 차례로 maps B 어떤 값을 나타내는 당신이 원하는 정보에 대한 모든 가장자리입니다.(또는 bool 지 않는 경우에 필요한 정보를 유지하는 것이 가장자리).
기본적으로 이 두 가지 수준의 트리 구성하는 해시의지도입니다.

보 edge 이 구조에서 당신은 큰 인덱스,그것을 보면서 최고 수준과 끝까지 함께 해시 지도입니다.다음은 작은 지수와 모양에 그것을 이 해시 지도입니다.

다른 팁

명확히하기 위해, 당신은 다음과 같은 다각형 목록을 원합니다.

A +-----+ B
   \    |\
    \ 1 | \
     \  |  \
      \ | 2 \
       \|    \
      C +-----+ D

그런 다음 다음과 같은 가장자리 대신 :

A - B -+
B - C  +- first polygon
C - A -+

B - D -+
D - C  +- second polygon
C - B -+

그런 다음 중복 B -C 대 C -B 가장자리를 제거하고 공유하고 싶습니까?

알고리즘으로 어떤 종류의 성능 문제를보고 있습니까? 합리적인 해시 구현이있는 세트는 꽤 괜찮을 것입니다. 반면에 해시가 데이터에 최적이 아닌 경우 성능에 크게 영향을 줄 수있는 많은 충돌이 발생합니다.

둘 다 맞습니다. 좋은 해시 세트를 사용하면 필요한 수준을 넘어 성능을 얻었습니다. 나는 내 자신의 작은 해시 세트를 굴 렸습니다.

총 가장자리 수는 N/2와 N. N 사이에 있습니다. 모든 공유 가장자리는 N/2가 될 것이며 모든 고유 한 가장자리는 N이 될 것입니다. 여기에서 UINT64의 버퍼를 할당하고 내 지수를 이러한 값에 포장합니다. 작은 독특한 테이블 세트를 사용하여 고유 한 가장자리를 빠르게 찾을 수 있습니다!

먼저 정점이 고유한지 확인해야합니다. 그것은 당신이 특정 위치에서 하나의 가장자리만을 원한다면입니다. 그런 다음이 데이터 구조를 사용합니다

typedef std::pair<int, int> Edge;

Edge sampleEdge;

std::map<Edge, bool> uniqueEdges;

Edge에는 정렬 된 순서로 Edge를 구성하는 정점 지수가 포함되어 있습니다. 따라서 SampleDge가 인덱스 번호 12 및 5가있는 정점으로 구성된 가장자리 인 경우, sample 에디드 .first = 5 및 sampledge.12

그럼 당신은 그냥 할 수 있습니다

uniqueEdges[sampleEdge] = true;

모든 가장자리에 대해. 독창적 인 모서리는 모든 고유 한 가장자리를 담을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top