왜 선형 검색보다 더 잘 간주되는 정렬 된 데이터가 필요한 이진 검색이 필요한 이유는 무엇입니까?

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/204260

문제

나는 항상 선형 검색이 순진한 접근이라는 것을 항상 들었다. 그러나 바이너리 검색 전에 정렬이 필요할 때 정렬이 필요할 때 왜 선형 검색보다 더 낫지 않은 이유는 무엇인가?

선형 검색은 O(n)이며 바이너리 검색은 O(log n)입니다. 그것은 바이너리 검색이 더 좋다는 말의 기초가있는 것 같습니다. 그러나 바이너리 검색에는 최상의 알고리즘을위한 O(n log n) 인 정렬이 필요합니다. 바이너리 검색은 실제로 으로 실제로 으로 더 빠르지 않아야합니다.

저는 저자가 순진한 선형 검색 접근법을 사용하는 대신 삽입 정렬에서 삽입 된 장소를 찾는 장소를 찾는 것이 가장 좋습니다. 이 경우 각 루프 반복에서와 같이 정당화 된 것으로 보입니다. 이진 검색이 적용될 수있는 정렬 목록이 있습니다. 그러나 검색에 필요한 데이터 세트에 대한 보증이없는 일반적인 경우에는 정렬 요구 사항으로 인해 선형 검색보다 2 진 검색이 실제로 악화되지 않습니다.

선형 검색보다 바이너리 검색을 더 잘 만드는 실제적인 고려 사항이 있습니까? 또는 정렬에 필요한 계산 시간을 고려하지 않고 선형 검색보다 더 잘 고려되는 이진 검색은?

도움이 되었습니까?

해결책

가는 리니어 탐색보다 바이너리 검색을 만드는 것처럼 보이는 실용적인 고려 사항이 있습니까?

예 - 한 번만 정렬해야합니다. 그러면 원하는만큼 O (로그 N) 바이너리 검색을 수행 할 수 있지만 선형 검색은 매번 (n) o (n)입니다.

물론 이것은 실제로 동일한 데이터에서 여러 검색을 수행하는 경우에만 이점이 있습니다.그러나 "한 번 쓰고, 자주 읽기"시나리오는 매우 일반적입니다.

다른 팁

기본 가정은 하나의 검색을하지 않는다는 것입니다.

그래서 동일한 데이터를 여러 번 검색 해야하는 경우 한 번 정렬하고 바이너리 검색에서 이익을 얻을 수 있습니다.

자주 검색하고 데이터를 변경하는 경우 새 항목이 목록에 정렬 된 정렬 된 목록을 사용하는 것이 가치가 있습니다.

리조트가 필요없는 동일한 목록을 여러 번 검색 할 때 기본적으로 바이너리 검색이 더 좋습니다.

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

리스트가 이미 정렬되면 (또는 거의 정렬) 매우 빨리 정렬 알고리즘이 있습니다.대부분의 성능 결정은 정리되지 않은 목록을 기대합니다.

일단 정렬 된 목록이 있으면 매번 다시 정렬 할 필요가 없으므로 사전에 o 이상을 보유하고 있으면 사전에 정렬을 정렬하면 GENALACODICTAGCODE <O(n log n + k log n) < p>O(k*n)>

두 전화 책을 상상해보십시오.

한 번의 전화 번호부는 알파벳 순서로 이름이 있습니다.원하는 항목을 찾으려면 중간에 열리고 항목을 확인한 다음 overshot 또는 아래쪽을 사용하는지 여부에 따라 앞으로 또는 뒤로 이동하십시오.

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

두 번째 책은 합리적으로 크기의 도시에서 작동합니까?

나는 선형 검색에 대한 이진 검색 값이 문맥이라고 생각합니다.엄청난 순서가없는 데이터 세트로 시작하고 소수의 항목을 뽑아 내기 위해서만 이진 검색을 정렬하고 수행하는 것만 큼 느려집니다.그러나 응용 프로그램의 수명 동안 정렬 된 목록을 유지하고 정기적으로 액세스하는 경우 바이너리 검색이 훨씬 더 좋은 방법입니다.

다른 많은 사람들이 대답했던 것처럼 정렬 단계는 한 번만 수행 할 수 있고 실제 검색이 원하는만큼 여러 번 수행 할 수 있기 때문에 바이너리 검색이 실제로 바람직합니다. 그러나, n (즉, 특정 입력 크기)의 특정 값에 대해, 바이너리 검색은 선형 검색 (심지어 하나의 단일 실행)보다 더 많은 더 많은 것을 더 많이 수행한다.

"티핑 포인트"는 변형시 복잡성 방정식을 해결함으로써 계산됩니다.

n log n + log n = n
.

Wolfram Alpha에서 참조 N 에 대한 숫자 값이 있습니다.이 값은 바이너리 검색과 정렬이 항상 선형 검색만으로 항상 빠릅니다. 물론 귀하의 사례에서 작동하는 n 실제 가치는 추정하기가 어려울 수있는 많은 요인에 달려 있습니다.

이 재미있는 기사 현재 프로세서에 대한 깊이있는 성능 측정에서 멋진 성능 측정을 포함하는 probst :

정렬 된 정수 배열을 통해 검색 해야하는 경우

성능은 실제로, 정말로 중요하고 선형 검색을 사용하면 배열은 크기가 64 개의 요소 아래에 있으며, 바이너리 검색 위.

layman의 단어 :

10 억 개의 항목이있는 순서가없는 목록이 있고, 당신이 찾고있는 항목은 마지막 하나인지 10 억 개의 항목을 읽을 것입니다.

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

"바이너리 검색이 더 좋다"의 좋은 이유가 많이 나열되어 있지만 사용자의 관점에서 이점을 살펴볼 수도 있습니다.

정렬 된 삽입을 수행 할 때 데이터 입력간에 소규모 대기 시간 간격으로 분리 된 작은 대기 시간과 함께 매우 잘 생활 할 수있는 동안 "검색"을 가능한 한 빨리 할 수 있습니다.사용자의 관점에서 이진 검색과 결합 된 정렬 된 삽입물은 최상의 사용자 경험을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 softwareengineering.stackexchange
scroll top