이 알고리즘을 여전히 이진 검색 알고리즘으로 간주 할 수 있습니까?


14

두 번째 코드 kata (매번 다른 방법으로 이진 검색 알고리즘을 5 번 구현하도록 요청 함)를 수행하는 동안 다음과 같이 작동하는 약간 다른 솔루션을 생각해 냈습니다.

정렬 된 lenght 100 배열을 가지고 있고 시작 필드에 숫자 200이 있고 끝 필드에 숫자 400이있는 것을 보았습니다. 인간을 공부하는 수학으로, 필드를 검색하면 필드 35 주위에서 검색을 시작할 것입니다 일반 이진 검색 알고리즘에서와 같이 필드 50이 아닌 숫자 270.

그런 다음 배열의 필드 35에서 숫자가 270이면 35는 내가 검색 한 인덱스입니다.

그렇지 않은 경우 내가 얻은 숫자 (예 : 280)를 비교하고 배열의 하단 부분을 수행하는 작업을 반복 할 수 있습니다 (그래서 시작 필드가 200이고 종료 필드가 280을 포함하는 35 개의 필드가 있음) 내가 찾은 숫자는 내가 찾고있는 것보다, 또는 배열의 윗부분보다 큽니다 (260을 얻었습니다. 이제 65 개의 인덱스가 있습니다. 첫 번째 인덱스는 260이고 마지막 인덱스는 400입니다.) 내가 얻은 숫자가 내가 찾고있는 숫자보다 작은 경우이 하위 배열의 인덱스 4, 전체 배열의 인덱스 39입니다.

문제는이 알고리즘을 이진 검색 알고리즘으로 간주 할 수 있습니까? 그렇지 않은 경우 자체 이름이 있습니까?


2
이진 검색인지 여부는 순전히 의견의 문제입니다. 본질적으로, 당신이 줄 수있는 유일한 대답은 "그렇습니다. 이진 검색이라고 부르기에 이진 검색에 충분히 가깝습니다"또는 "아니요, 그렇지 않습니다"입니다. 논쟁이 이어진다.
David Richerby

답변:


23

나는 이것을 이진 검색이라고 부르지 않을 것이다.

이진 검색과 분명히 유사하며 이진 검색의 개선으로 보는 것이 당연합니다. 그러나 알고리즘 복잡도 특성이 크게 다른 Interpolation Search는 데이터가 균일하게 분포되어 있다고 가정 할 때 O (log (log (n))의 실행 시간을 예상했지만 O (n) 최악의 경우 런타임을 통해이를 지불합니다.

경계 요소의 선택에 따라 이진 검색의 최악의 실행 시간은 O (log (n))이 아니라 "이진 검색의 최악의 실행 시간은 O (log (n))"입니다. 이것은 보간 검색을 이진 검색 알고리즘으로 분류 할 수 없음을 의미합니다.


아마도 보간 검색이 잘못 진행될 때 보간 검색을 중단하면 O (log n) 최악의 경우와 O (log log n)를 충분히 선형 인 데이터에 유지할 수 있습니다. 내 생각에 "log n 시도 후에 대상을 찾지 못하면 이진 검색으로 전환"과 같은 것이 작동하지만 그것을 증명하기에는 너무 게으르다. 물론 이진 검색보다 기본적으로 두 배의 킬러 입력 클래스가 있습니다.
Steve Jessop 2016 년

그 킬러 입력 아이디어는 흥미 롭습니다. 킬러 입력이 검색에 부정적인 영향을 줄 수 있도록하는 대신 (즉, 배열의 끝 부분을 쪼개서) "분리 가능 범위"를 배열의 3 분의 2 또는 그 이상으로 제한 / 자르십시오. 최악의 경우 log3 (n)을 가지지 만 여전히 log (log) 최상의 경우를 즐기십시오.
Andrew Gallasch 2016 년

1
@SteveJessop 점근 적 복잡성은 완전한 그림이 아니라는 것을 기억하십시오. O (log n)는 매우 빠릅니다. 또한 이진 검색은 각 루프에서 거의 작동하지 않습니다. 보간 탐색의 문제점은 이미 각 루프에서 더 많은 작업을 수행한다는 사실을 보충하기 위해 매우 긴 입력이 필요하다는 것입니다. 당신은 제안이 그것에 더 많은 작업을 추가합니다. 균일하지 않은 데이터에 대해 O (n)을 받아 들일 수 없다면 가장 좋은 해결책은 일부 하이브리드 방식이 아닌 순수한 이진 검색을 수행하는 것입니다.
Taemyr

@SteveJessop : 알고리즘을 전환 할 필요가 없습니다. 이것은 병렬로 수행 될 수 있습니다. 범위 R이 주어지면 점 P1을 이진 검색의 일반적인 중간 점으로, 보간을 사용하여 P2를 결정할 수 있습니다. 이제 세 가지 하위 범위가 있으며이 중 어느 것도 원래 범위의 절반보다 클 수 없습니다. P1과 P2에 대해 목표 값을 확인하고 세 가지 하위 범위 중 어느 것이 재귀해야하는지 알고 있습니다.
MSalters

17

O(loglogn)


멋있는. 이제 질문은 코드 카타에 사용할 수 있는지 여부이지만 문제는 롤입니다. 그래도 바이너리 검색보다 더 복잡하다는 것을 알았습니다.
user6245072

몇 년 전에 로그 파일을 인덱싱하는 코드를 작성할 때 이것을 한 번 발견했습니다. 또한 내 데이터에 대해 보간과 이진 슬라이스 사이의 단계를 번갈아 수행하는 것이 자체 옵션보다 낫다는 것을 발견했습니다. 이름이 있는지 또는 알려진 효과인지 확실하지 않습니다.
Neil Slater

@NeilSlater가 보간 검색을 헤지했을까요?
Steve Cox

@SteveCox : 방금 해당 용어를 검색했지만 아무것도 찾지 못했습니다. 새로운 질문으로 그에게하기로 결정 cs.stackexchange.com/questions/59750/...
닐 슬레이터

-1

나는 올바른 용어가 이분법적인 검색이라고 생각합니다.

숫자의 평평한 분포를 기반으로 후속 탐색을 통해 평평한 배열로 검색합니다.

이것은 사람이 사전에서 단어를 검색하는 방법에 해당합니다. 그러나 데이터 분포가 불규칙하면 매우 비효율적 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.