합계되는 두 개의 숫자를 선택하십시오.


9

가장 가까운 이웃 문제가 있습니다.

실수 (매우 큰 !)과 목표 실수 , SUM이 가장 가까운 및 를 찾으십시오.a1,…,annpaiajp . 우리는 합리적인 전처리 / 인덱싱을 허용합니다a1,…,an (까지 O(nlog⁡n))이지만 쿼리시 (제공됨) p) 결과가 매우 빠르게 반환되어야합니다 (예 : O(log⁡n) 시각).

(단순한 예 : SINGLE 만 원한다면 ai 가장 가까운 p, 우리는 정렬합니다 a1,…,an 오프라인, O(nlog⁡n)쿼리시 이진 검색을 수행합니다. O(log⁡n)).

작동하지 않는 솔루션 :

1) 정렬 a1,…,an오프라인 상태 인 다음 쿼리 시간에 양쪽 끝에서 시작하여 두 개의 포인터를 안쪽으로 이동하십시오 ( http://bit.ly/1eKHHDy ). 좋지 않기 때문에O(n) 쿼리 시간.

2) 정렬 a1,…,an 오프라인에서 쿼리 시간에 ai "버디"에 대한 이진 검색을 수행하여 p. 좋지 않기 때문에O(nlog⁡n) 쿼리 시간.

3) 모든 쌍을 정렬 (a1,…,an)오프라인으로 설정 한 다음 이진 검색을 수행하십시오. 좋지 않기 때문에O(n2) 전처리.

감사!

추신. 실습에 필요한 추가 일반화 : (1)a1,…,an 과 p 50 차원 벡터, (2) 벡터 코사인 거리와 "닫기"및 (3) k-최고의 가장 가까운 쌍, 그저 1 최고가 아닙니다.


전처리 시간 또는 전처리 후 사용할 수있는 공간에 제한이 있습니까? 우리가 제한되어 있다면O(n) 공간, 당신은 그것을 해결할 수 있다고 믿을만한 이유가 있습니까? O(lg⁡n)시각? 그것은 나에게는 끔찍한 것 같습니다.
— DW

전처리는 O (n 로그 n). 문제 진술을 업데이트했습니다.
— Kevin

쿼리가 빠를 수 있다고 믿을만한 이유는 없지만 가장 가까운 이웃 (kd-trees, locality-sensitive hashing 등)에 대한 많은 유용한 결과는 반 직관적으로 좋습니다. 지역에 민감한 해싱을 사용하는 대략적인 솔루션은 실제 사용에 적합합니다.
— Kevin

답변:


17

이것은 거의 불가능합니다.

전처리 시간으로 문제를 해결할 수 있다고 가정하십시오. P(n) 쿼리 시간 Q(n). 그런 다음 3SUM 문제 를 해결하는 간단한 알고리즘 이 있습니다.n 실수, 세 요소의 합이 0입니까? P(n)+n⋅Q(n)시각. 우리는 모든 숫자를 사전 처리 한 다음 각 숫자에 대해ak우리는 ai+aj 가장 가까운 −ak; 일치하면−ak 정확히 3SUM 문제에 대한 해결책을 찾았습니다.

그러나 3SUM으로 알려진 가장 빠른 알고리즘은 O(n2)이 알고리즘은 최적으로 추측됩니다. 또한 매칭이 있습니다Ω(n2)제한적이지만 자연스러운 의사 결정 트리 모델의 하한. 정수 세트의 경우 , "비트로 게임을하는"약간의 2 차 알고리즘이 있지만 정수 RAM 모델에서도 3SUM은 필요한 것으로 추측됩니다.Ω(n2/polylogn) 시각.

따라서 추측이 정확하다고 가정하면 문제에 (거의) 2 차 전처리 시간 또는 (거의) 선형 쿼리 시간이 필요합니다.


2

사전 처리 중에 무제한 공간과 무제한 시간을 사용할 수있는 경우 다음 솔루션이 요구 사항을 충족합니다.

  • 전처리 과정에서 세트 계산 {ai+aj:1≤i≤j≤n}이 세트를 정렬 된 순서로 저장하십시오. 이 세트는 생성 및 정렬 가능O(n2) 시간이 걸리고 O(n2) 그것을 저장할 공간.

  • 이제 질문에 답하기 위해 ai,aj 어디 ai+aj ~에 가깝다 p이 정렬 된 목록에서 이진 검색을 수행하면됩니다. 그것은 걸릴 것입니다O(lg⁡n) 시각.

이 솔루션을 사용할 수없는 경우 요구 사항을보다 신중하게 생각하고 그에 따라 질문을 편집해야합니다.


안녕하세요, 감사합니다! 그러나 귀하의 솔루션은 내 솔루션 # 3과 동일하며 O (n ^ 2) 전처리 시간으로 인해 문제가됩니다. 제 경우에는 n이 매우 커서 (예 : 1m) O (n ^ 2) 연산을 피해야합니다.
— 케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.