2013-06-10 1 views
0

튜플의 다음 목록을 고려하십시오. [(5,4,5), (6,9,6), (3,8,3), (7,9,8]]주어진 튜플보다 큰 모든 요소를 ​​가진 튜플을 효율적으로 검색하십시오.

나는 그 튜플의 모든 원소가 주어진 튜플 (바늘)보다 크거나 같은리스트에 적어도 하나의 튜플이 존재하는지 확인하기 위해 알고리즘을 고안하려고한다.

예를 들어 주어진 튜플 (6,5,7)의 경우 알고리즘은 주어진 튜플의 모든 요소가 목록의 첫 번째 튜플 인 (5,4,5)보다 작기 때문에 True를 반환해야합니다. 그러나 주어진 튜플 (9,1,9)의 경우 알고리즘은 각 요소가 주어진 튜플보다 큰 목록에 튜플이 없으므로 False를 반환해야합니다. 특히 이것은 주어진 튜플의 두 번째 요소 1에 기인합니다.이 요소는 목록의 모든 튜플의 두 번째 요소보다 작습니다.

순진한 알고리즘은 목록의 튜플을 하나씩 반복하고 내부 루프의 튜플 요소를 반복합니다. n 개의 튜플이 있다고 가정하면, 각 튜플에는 m 개의 요소가 있습니다. 이것은 O (nm)의 복잡성을 줄 것입니다.

복잡도가 낮은 작업을 생성하는 알고리즘을 사용할 수 있을지 생각 중입니다. 데이터를 저장하기위한 전처리 또는 멋진 데이터 구조가 허용됩니다!

필자의 원래 생각은 이진 검색의 변형을 사용하는 것이었지만 첫 번째 튜플을 기반으로 일부 튜플을 제거한 후에는 순진한 솔루션으로 되돌릴 수없는 데이터 구조를 찾지 못했습니다. 이 알고리즘은 결국에는 O (nm)가 될 수 있음을 의미합니다.

감사합니다.

답변

0

이러한 종류의 문제는 spatial indexing 시스템에서 해결됩니다. 쿼리를 효율적으로 실행할 수있는 많은 데이터 구조가 있습니다.

+0

포인터 주셔서 감사합니다! 나는 그것을 들여다 볼 것이다! – Paul

0

S가 각 m-tuples의 n 개 원본 세트의 복사본이되도록합시다. 그런 다음 검색 당 O (m ln n)의 비용으로 S의 모든 테스트 튜플에 대한 이진 검색을 사용할 수 있습니다 (검색 당 최대 m 개의 비교가있는 최대 ng 검색 갯수로 인해).

참고 : P에 Q, 즉 Q의 요소가 P의 해당 요소보다 작지 않은 S에 튜플 P, Q가 있다고 가정합니다. 튜플 Q는 S에서 제거 될 수 있습니다. 실제로 이것은 종종 S의 크기를 m의 작은 배수로 잘라서 O (m ln m) 성능을 제공합니다. 그러나 최악의 경우, 전혀 감소를 제공하지 않을 것입니다.

+0

답변 해 주셔서 감사합니다 jwpat7! 토폴로지 정렬을 살펴 보았지만 답변의 첫 부분을 완전히 이해했다고 생각하지 않습니다. 대답을 조금 자세히 설명해 주시겠습니까? 예를 들어 토폴로지별로 정렬 된 후 튜플간에 명확한 순서가없는 경우이 경우에 이진 검색은 어떻게 작동합니까? 예를 들어, 목록 = [<2,1,2>, <1,2,0>, <1,1,3>] 일 경우 여기에서 테스트 튜플 <1,2,1>에 대해 이진 검색을 어떻게 사용해야합니까? – Paul

관련 문제