에 속합니다. [0..5], [10..20], [7..13], [- 1. .37]) 그리고 내가 좋아하는 데이터 구조로 그 세트를 배열 할 수있다. 가장 효율적인 방법은 무엇인가 은 특정 test_number가 속한 것을 설정 하는가?특정 알고리즘을 테스트하는 효율적인 알고리즘은 특정 숫자가
저수준 세트를 기반으로 밸런스 이진 트리에 세트를 저장하는 것에 대해 생각해 보았습니다. 각 노드는 세트 수가 가장 적은 모든 세트를 보유하게됩니다. 이렇게하면 집합에 대해 테스트중인 test_number가 집합의 가장 작은 숫자보다 작은 지 여부를 기반으로 집합 수를 효율적으로 제거 할 수 있습니다. 그런 다음 해당 노드와 모든 노드를 해당 노드의 오른쪽으로 잘라냅니다 (test_number보다 큰 범위에서 낮은 수를 가짐). 나는 이것이 집합의 약 25 %를 평균적으로 정리할 것이라고 생각하지만, test_number가 그 집합에 속하는지 여부를 결정하기 위해 이진 트리의 나머지 노드를 모두 선형으로 조사해야 할 것입니다. (어떤 노드의 집합 목록을 집합에서 가장 높은 수로 정렬하여 더 최적화 할 수 있습니다. 특정 목록 내에서 이진 검색을 수행하여 어떤 집합에 test_number가 포함되어 있는지 결정할 수 있습니다. 불행히도 대부분의 경우 다루는 세트 중 겹치는 세트 경계는 없습니다.)
이 모델은 전체 모델의 폴리곤이 효율적으로 테스트 할 수있는 방법을 찾았 기 때문에 그래픽 처리에서이 문제가 해결되었다고 생각합니다. 특정 픽셀,하지만 그 알고리즘의 유형의 용어를 모르겠다.
세그먼트 트리는 집합 수를 계산하는 가장 빠른 방법이 아닙니다. 그것은 O (m (log (n) + k))를 필요로하기 때문에, 여기서 m은 검사의 수이고, k는 그것이 속하는 세트 수입니다. n은 총 세트 수입니다. 내 알고리즘은 O (m.log (n))입니다. –
Mehrdad, 귀하의 아이디어는 적절한 데이터 세트에 비해 탁월합니다. 그러나 세그먼트 트리는 매우 유연합니다. 너는 정수로 제한되어 있지만 복식을 다룰 수있다. 그리고 거대한 범위를 쉽게 처리 할 수 있습니다 ([0..2000000000]). 공간과 시간을 엄청나게 늘릴 수 있습니다. – Sol
계산에만 관심이 있다면 세그먼트 트리에 세트 수를 저장하면됩니다. 카운트 검색에 드는 비용은 O (n log n)이됩니다. –