JavaScript의 선형 및 이진 검색
배열을 통한 검색
목록에서 무언가를 찾고 있습니다. 실제로 목록에 있는지 확실하지 않지만 있다면 어디에 있는지 알고 싶습니다. 이 경우 무지개가 있고 특정 색상을 찾고 있습니다.
var rainbow = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];
쉬운 나쁜 선형 방법
"쉬워요! 배열의 각 요소를 반복하고 일치 항목을 반환하겠습니다!"라고 생각할 수 있습니다. 이것은 작동하며 선형 검색이라고 합니다.
function linearSearch(arr, elToFind) {
for (var i=0; i<arr.length; i++) {
if (arr[i] == elToFind) {
return i;
}
} return null;
}
linearSearch(rainbow, "green"); // returns 3
linearSearch(rainbow, "white"); // returns null
Buttttttt, (그리고 이것의 크기는 데이터 세트의 크기에 따라 다름) 여기에는 성능 상충 관계가 있습니다. 배열의 일부가 아님을 확인하려면 모든 단일 요소를 반복해야 합니다. 7가지 색상만 이야기할 때 이것은 nbd이지만 수천 또는 수백만 개의 레코드 배열을 살펴보고 있다면 어떨까요? Forget it.
이진 검색
Abinary search는 정렬된 배열을 가져와서 특정 요소를 찾습니다. 요소가 배열에 있는 경우 검색은 요소의 인덱스를 반환합니다. 그렇지 않으면 null을 반환합니다. 배열이 이미 정렬되어 있기 때문에 검색 대상 검색 요소를 배열 중간에 있는 요소와 비교하여 한 번에 검색 범위의 절반을 제거할 수 있습니다. 더 뜨겁고 더 차가운 게임이라고 생각하십시오.
이진 검색으로 Rainbow 예제 재시도
당신과 나는 앞서 언급한 무지개의 ROY G. BIV 순서를 이해하지만, 당신의 브라우저는 Kindergarten으로 가지 않았습니다. Rainbow에서 이진 검색을 수행하려면 (알파벳순으로) 정렬해야 합니다. 다행스럽게도 JavaScript에는 배열에 대한 정렬 방법이 내장되어 있습니다.
var rainbow = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];
var sortedRainbow = rainbow.sort();
// returns ["blue", "green", "indigo", "orange", "red", "violet", "yellow"];
엄청난! 이제 이진 검색에 전달할 수 있는 것이 있습니다.
function binarySearch(sortedArray, elToFind) {
var lowIndex = 0;
var highIndex = sortedArray.length - 1;
while (lowIndex <= highIndex) {
var midIndex = Math.floor((lowIndex + highIndex) / 2);
if (sortedArray[midIndex] == elToFind) {
return midIndex;
} else if (sortedArray[midIndex] < elToFind) {
lowIndex = midIndex + 1;
} else {
highIndex = midIndex - 1;
}
} return null;
}
var sortedRainbow = ["blue", "green", "indigo", "orange", "red", "violet", "yellow"];
binarySearch(sortedRainbow, "green"); // returns 1
binarySearch(sortedRainbow, "white") // returns null
좋아, 많이 했어. 아니면 당신이 검색 천재이고 그것을 완전히 이해했을 수도 있습니다. 이진 검색을 한 줄씩 살펴보겠습니다.
binarySearch 함수는 sortedArray와 찾고 있는 요소(elToFind)를 받습니다.
while 루프는 검색이 한 요소로 좁혀질 때까지 실행됩니다.
다음
이제 두 가지 검색 방법(선형 및 이진)을 살펴보았으므로 서로에 대한 성능을 측정할 방법이 필요합니다. 내 다음 게시물에서는 로그(대수학 2로 후퇴)와 Big O 표기법을 살펴보겠습니다. 계속 지켜봐!
Reference
이 문제에 관하여(JavaScript의 선형 및 이진 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/stephjs/linear-and-binary-search-in-javascript-4b7h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)