이진 검색과 보간 검색을 결합한 연구 나 이론이 있습니까?


14

방금 이 알고리즘을 이진 검색 알고리즘으로 간주 할 수 있습니까 ?를 읽었습니다 . 몇 년 전에 날짜 / 시간 창으로 큰 일반 텍스트 파일에서 로그 항목을 찾기 위해 로그 파일에 대한 인덱서 / 검색을 작성했음을 상기했습니다.

이 작업을 수행하는 동안 보간 검색을 시도하기로 결정했습니다 (이것이 무엇인지 알지 못했지만 아이디어 자체를 우연히 발견했습니다). 그런 다음 어떤 이유로 바이너리 바이너리 단계로 보간 단계를 번갈아 가며 계속 생각했습니다 .0 단계에서 테스트 포인트를 결정하기 위해 보간하고 1 단계에서 정확한 중간 점 등을 취합니다.

그런 다음 순수한 보간 검색, 순수한 이진 검색 및 조합 시도를 사용하여 시스템을 벤치마킹했습니다. 이 방법은 무작위로 선택된 시간을 찾기 전에 필요한 테스트 시간과 횟수에있어 확실한 승자가되었습니다.

연결된 질문에서 영감을 얻어 방금 "보간 보간 검색 및 이진 검색"을 빠르게 검색했지만 아무것도 찾지 못했습니다. 또한 답변 중 하나에 대한 내 의견에 제안 된대로 "헤지 보간 검색"을 시도했습니다.

알려진 것을 우연히 발견 했습니까? 특정 유형의 데이터에 더 빠르다는 이론적 근거가 있습니까? 로그 파일은 일반적으로 시간이 많았으며 (예 : 검색 할 천만 개의 행이있는 1-2GB의 텍스트), 날짜 / 시간의 확산은 많은 활동, 일반적인 피크 시간 및 조용한 시간으로 인해 복잡했습니다. 내 벤치 마크 테스트는 찾기 위해 목표 시간의 균일 한 분포에서 샘플링되었습니다.

답변:


5

알려진 것을 우연히 발견 했습니까?

영형(영형 영형 )영형(영형 )

  • 내성 검색 은 보간 검색과 이진 검색을 반복하는 방법입니다. 더 자세한 내용은 없습니다.
  • JB Sidney의 N. Santoro에 의한 보간 이진 탐색 (IBS) (1985).

    일반적으로 보간 검색은 검색된 배열이 지정된 임계 값보다 큰 경우에만 유용합니다. 고려 된 검색 세그먼트가 사용자 정의 임계 값보다 작 으면 이진 검색이 무조건 적용됩니다. 그 역치에 대해 보간 탐색 단계가 적용되고 그 뒤에 이진 탐색 단계가 적용됩니다.

    이것은 당신의 접근 방식에 많은 공통점을 가지고 있습니다.

  • Biagio Bonasera, Emilio Ferrara, Giacomo Fiumara, Francesco Pagano, Alessandro Provetti의 적응 형 검색 (AS)

    저자의 말을 사용하여 :

    [Interpolation-binary search]는 보간과 이진 검색을 결합하지만 혼합하지 않는 유사한 솔루션을 고안했습니다. 점근 적 복잡성은 동일하지만 몇 가지 뚜렷한 차이점이 있습니다.

    [절단]

    따라서 모든 입력에 대해 AS가 IBS보다 더 많은 기본 작업을 수행하지 않음을 보여줄 수 있습니다.

    알고리즘은 검색 세그먼트의 최상의 절반을 신중하게 찾는 데 "간단한"보간 검색보다 최대 두 배의 연산을 소비 할 수 있습니다. 이는 반복에 필요한 반복 횟수가 적다는 것을 의미합니다 (그러나 더 많은 오버 헤드가 있음) .


6

두 세계를 모두 활용하기 위해 두 알고리즘을 인터리빙하는 것은 알려진 기술이지만 일반적으로 "병렬"로 실행하고 종료되는 즉시 응답을 반환하는 것으로 기술되어 있습니다.

이론적으로는 빠르지 만 보간 검색에는 이진 검색에 비해 두 가지 단점이 있습니다.

  • 최악의 성능 (선형)을 가지고 있습니다.

  • 중간 점을 계산하는 오버 헤드는 다소 큽니다. 이진 검색 반복은 보간 검색보다 수백 배 빠릅니다.

범위가 큰 동안 보간 검색을 수행하고 범위가 작아지면 이진 검색으로 전환하는 방법이 가장 효율적이라고 생각합니다. 이 실험을 해 볼 수 있다면 좋을 것입니다.

로그로그로그로그로그로그

나는 당신의 결과가 두 가지 현상으로 설명 될 수 있다고 생각합니다.

  • 이진 검색을 결합하면 최악의 동작을 피할 수 있습니다

  • 작은 데이터 세트에서 이진 검색으로 전환하는 긍정적 효과


3
"이진 검색 반복은 보간 검색보다 수백 배 빠릅니다". OP의 경우,이 두 가지 방법으로 중간 점을 계산하는 것의 차이는 중간 점의 값을 검색하는 데 필요한 I / O 시간으로 인해 줄어 듭니다.
liori

@liori : 동일한 데이터에서 반복되는 이진 검색의 초기 반복은 동일한 소수의 요소가 사용되기 때문에 캐시 친화적 일 수 있습니다. 따라서 분기 및 8 분의 1은 캐시에서 뜨겁게 유지 될 것으로 예상됩니다. 범위가 충분히 큰 경우 이진으로 시작하고 세 번의 반복 후에 보간으로 전환하는 것이 좋습니다. (또는 비동기 I / O를 수행하고 어떤 결과가 먼저 도착하는지 사용할 수있는 경우).
Peter Cordes 2016 년

또한 메모리 내 검색의 경우에도 캐시 미스 (200 사이클 이상)는 Intel Haswell 에서 64 비트 정수 나누기 (32-96 사이클)보다 몇 배의 대기 시간을 갖습니다 . 32 비트 정수 나누기가 훨씬 빠릅니다 (22-29 사이클). 주 메모리 대역폭은 모든 코어에 대한 공유 리소스이지만 정수 나누기는 각 코어에 복제 된 리소스 만 사용합니다.
Peter Cordes 2016 년

2
그러나 여러 개의 분산 액세스가 한 번에 비행 중일 경우 더 빠르기 때문에 메모리 대기 시간은 메모리 대역폭보다 훨씬 나쁩니다. 최신 x86 하드웨어의 인 메모리 bsearch를 위해 현재 중간 점을로드하기 전에 NEXT 반복에 대한 두 가지 가능성 을 프리 페치 ( prefetcht0명령 포함 ) 하는 것이 승리 입니다. 다음 페치 주소를 미리 예측할 수 없으면 그렇게 할 수 없습니다. 따라서 이론적 인 고려 사항 외에도 실질적인 구현 세부 사항이 중요 할 수 있습니다 .
Peter Cordes 2016 년

@liori : 로그 파일을 인덱스 할 때 레코드를 찾기 위해 요청시 읽었으므로 중간 지점 당 I / O가 가장 중요한 요소였습니다. 파일에서 오프셋을 계산하고 블록을 읽는 것 사이에 2 배 이상의 크기가있을 수 있으므로 계산 된 중간 점 수가 결정 요인이됩니다. 로그 파일없이 색인을 생성하기 위해 복제 할 경우 (여기에서 게시하고 게시 할 내용) 측정 가능한 속도 차이는 없지만 측정 가능한 "중간 점 수"차이가있을 수 있습니다.
Neil Slater
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.