정렬 된 데이터가 필요한 이진 검색이 선형 검색보다 나은 이유는 무엇입니까?


20

나는 선형 검색이 순진한 접근 방식이며 바이너리 검색이 더 나은 점근 적 복잡성으로 인해 성능보다 우수하다고 들었습니다. 그러나 바이너리 검색 전에 정렬이 필요할 때 선형 검색보다 나은 이유를 이해하지 못했습니다.

선형 검색은 O(n)이진 검색입니다 O(log n). 그것은 이진 검색이 더 낫다는 말의 기초 인 것 같습니다. 그러나 이진 검색에는 O(n log n)최상의 알고리즘을위한 정렬이 필요 합니다. 그래서 이진 검색은 빠른 실제로 안 는 정렬이 필요합니다.

저자는 순진 선형 검색 방법을 사용하는 대신 삽입 정렬에서 항목을 삽입 해야하는 위치를 찾는 데 이진 검색을 사용하는 것이 더 낫다는 CLRS를 읽고 있습니다. 이 경우 각 루프 반복마다 이진 검색을 적용 할 수있는 정렬 된 목록이 있으므로 정당화 된 것으로 보입니다. 그러나 검색이 필요한 데이터 세트가 정렬 요구 사항으로 인해 선형 검색보다 실제로 이진 검색을 사용하지 않는다는 보장이없는 일반적인 경우에는?

선형 검색보다 이진 검색을 향상시키는 실용적인 고려 사항이 있습니까? 또는 정렬에 필요한 계산 시간을 고려하지 않고 이진 검색이 선형 검색보다 나은 것으로 간주됩니까?


6
다른 많은 것들과 마찬가지로, 그것은 모두 다음과 같습니다 : "그것은 달려있다 ...;)"
Jeff B

목록이 이미 정렬되어 있으면 선형 검색이 여전히 더 좋다고 생각하십니까? 여기서 고려해야 할 사항이 있습니다.
JB King

3
제목 변경을 생각하는 사람에게는 정렬 된 데이터에 대해 설명하지 마십시오. 제거하면 완전히 다른 질문처럼 보입니다.
Aseem Bansal

답변:


53

선형 검색보다 이진 검색을 더 잘 만드는 것을 간과해야 할 실질적인 고려 사항이 있습니까?

예-O (n log n) 정렬을 한 번만 수행하면 원하는 횟수만큼 O (log n) 이진 검색을 수행 할 수 있지만 선형 검색은 매번 O (n)이 가능합니다.

물론 이것은 실제로 동일한 데이터에 대해 여러 번 검색하는 경우에만 유리합니다. 그러나 "한 번 작성하고 자주 읽는"시나리오는 일반적입니다.


한 번만 작업을 수행하는 경우 최적화하는 데별로 도움이되지 않습니다.

14

기본 가정은 한 번만 검색하지 않는 것입니다.

따라서 동일한 데이터를 여러 번 검색해야하는 경우 한 번만 정렬하면 바이너리 검색을 통해 이익을 얻을 수 있습니다.

자주 검색하고 데이터를 변경하는 경우 새 항목이 목록으로 정렬되는 정렬 된 목록을 사용하는 것이 좋습니다.

따라서 기본적으로 이진 검색이 필요하지 않고 동일한 목록을 여러 번 검색 할 때 더 좋습니다.

검색하기 전에 매번 정렬해야 할 때 이점이 없습니다.

탄원서에는 목록이 이미 정렬되어 있거나 거의 정렬되어있을 때 매우 빠른 정렬 알고리즘이 있습니다. 대부분의 성능 결정에는 정렬되지 않은 목록이 필요합니다.


2
자주 검색하고 자주 삽입하면보다 복잡한 데이터 구조 (예 : 이진 트리)를 볼 수 있습니다.
MarkJ

@MarkJ 원래 포스터의 기본 질문은 목록에서 검색하는 것이 었습니다. 그렇지 않으면 나는 당신과 완전히 동의합니다.
Uwe Plonus

7

정렬 된 목록이 있으면 매번 다시 정렬 할 필요가 없습니다. 즉, O (log n) 개 이상의 검색이있는 경우 사전에 정렬하면 게인이 이길 수 있습니다 ( O(n log n + k log n)vsO(k*n)


5

두 개의 전화 번호부를 상상해보십시오.

하나의 전화 번호부는 알파벳 순서로 이름이 있습니다. 원하는 항목을 찾으려면 중간에서 열고 항목을 확인한 다음 오버 슛 또는 언더 슛 여부에 따라 앞뒤로 이동하십시오.

다른 전화 번호부는 이름이 임의의 순서로 있습니다. 원하는 항목을 찾으려면 처음부터 시작하여 원하는 것을 찾을 때까지 계속하십시오.

두 번째 책은 합당한 규모의 도시에서 작동합니까?


3

선형 검색보다 이진 검색의 가치는 맥락 적이라고 생각합니다. 정렬되지 않은 거대한 데이터 세트로 시작하여 소수의 항목 만 가져 오려는 경우 이진 검색을 정렬하고 수행하는 속도가 느려집니다. 그러나 응용 프로그램 수명 기간 동안 정렬 된 목록을 유지 관리하고 정기적으로 액세스하면 이진 검색이 훨씬 더 좋습니다.


3

다른 많은 사람들이 대답했듯이 정렬 단계는 한 번만 수행 할 수 있으며 실제 검색은 원하는 횟수만큼 수행 할 수 있기 때문에 이진 검색이 실제로 바람직합니다. 그러나 n의 특정 값 (예 : 특정 입력 크기)의 경우 이진 검색은 선형 검색 (한 번의 단일 실행에서도)보다 항상 더 성능이 좋습니다.

"팁 포인트"는 다음과 같은 비 점수 복잡도 방정식을 해결하여 계산됩니다.

n log n + log n = n

Wolfram Alpha에서 볼있듯이 이진 검색 및 정렬이 선형 검색보다 항상 빠르도록 n에 대한 숫자 값 이 있습니다. 물론 귀하의 경우에 작동 하는 n실제 값은 추정하기 어려운 많은 요소에 달려 있습니다.

Mark Probst 의이 흥미로운 기사 에 따르면 현재 프로세서에 대한 심도있는 성능 측정이 포함되어 있습니다.

정렬 된 정수 배열을 검색해야하고 성능이 실제로 중요하다면 배열의 크기가 약 64 요소 미만이면 선형 검색을 사용하고 위의 경우 이진 검색을 사용하십시오.


2

평신도의 말로 :

100 억 개의 항목이있는 정렬되지 않은 목록이 있고 마지막으로 찾은 항목이 있으면 100 억 개의 항목을 읽게됩니다.

이진 검색의 경우 인덱싱을 한 번만 수행 할 수 있습니다. 순서를 유지하기 위해 올바른 위치에 나중에 삽입 할 수 있습니다.


2

"이진 검색이 더 낫다"는 여러 가지 좋은 이유가 이미 나열되어 있지만 사용자 관점에서 이점을 살펴볼 수도 있습니다.

정렬 된 삽입을 수행 할 때 데이터 입력 동작간에 작은 대기 시간이 분할되어 일반적으로 매우 잘 살 수 있지만 "검색"이 가능한 빨리 이루어 지길 원합니다. 사용자 관점에서 이진 검색과 결합 된 정렬 된 삽입은 최상의 사용자 경험을 제공합니다.

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