자바스크립트 인터뷰 코딩 테스트 문제 3

3088 단어
정렬된 검색
정렬된 배열 검색을 완료하는 두 가지 다른 방법을 알아보세요. 무차별 대입 방법과 더 우아한 방법을 살펴보겠습니다.

정렬된 검색
지침
정렬된 정수 배열과 숫자를 받는 함수를 작성하세요. 해당 숫자의 인덱스가 있으면 반환합니다. functiDn은 배열에 없는 대상 값에 대해 -i를 반환해야 합니다.
입력: 정수 배열, 정수

출력: -i 이후의 정수.

검색([1, 3, 6, 13, 17], 13);//-> 3
search([1, 3, 6, 13, 17], 12);//-> -1

1   function search(numbers, target) {
2   // Your code here 3 }


솔루션 1

1   function search(numbers, target) {
2   for(let i = 0; i < numbers.length; i++) {
3       if(numbers[i] === target) {
4         return i; 
5       }
6   }   
7           
8   return -1; 


이 솔루션은 매우 간단합니다. 배열을 살펴보고 Dur 대상을 찾으려고 합니다.
시간
전체 배열을 살펴보므로 시간 복잡도는 다음과 같습니다.
에)
우주
정해진 수의 변수를 저장하므로 공간 복잡도는 다음과 같습니다.
오(1)
이진 검색
우리는 더 나은 솔루션을 제공할 수 있습니다. 배열이 sDrted이기 때문에 찾고 있는 인덱스를 찾을 때까지 기본적으로 배열 주위를 이동할 수 있습니다.
단어 찾기
사전에서 단어를 찾는다고 상상해 보십시오. 원하는 단어를 찾을 때까지 모든 단어를 살펴보는 것이 효율적일까요? 아니, 그것은 끔찍하게 비효율적일 것이다.
더 나은 접근 방식은 dictiDnary를 중간에 Dpen하는 것입니다. 우리 단어가 알파벳순으로 중간 페이지의 단어 앞에 있으면 단어가 hoDk의 전반부에 있음을 알 수 있습니다.
그런 다음 사전을 통해 -1/4로 뒤집을 수 있습니다. 다시 위의 과정을 반복하면 남은 페이지의 절반을 더 제거할 수 있습니다.
단어를 찾을 때까지 위의 단계를 반복해서 반복할 수 있습니다. 이렇게 하면 사전이 방대하더라도 각 단어를 개별적으로 살펴보는 것보다 훨씬 빠르게 Dur 단어를 찾을 수 있습니다.
스케일링
사실, 더 많은 단어를 추가하여 사전의 크기를 두 배로 늘리면 이 과정을 한 번만 더 반복하면 됩니다. 사전이 훨씬 두꺼워도 더 이상 할 일이 아닙니다.
이 접근 방식을 코드로 바꾸겠습니다.
솔루션 2

function binarySearch(numbers, target) (
let startIndex = 0;
let endIndex = numbers.length - 1;
if(target ‹ numbers[startlndex] || target > numbers[endIndex]){
  return--1;
}
while(true) {
  if(numbers[startlndex] === target) {
    return tartIndex;
  }
14  if(numbers[endIndex].===-target).{
15  return.endlndex;
16  ........}
17
18  .- ......if(endIndex. -.startIndex. ‹=-1).{
19  //-indicates-the-number-isn't-present
20  return.-1;
21  ........}
22
23   
      const middleIndex = Math.floor((startIndex + endIndex) / 2);
24
25  if(target › numbers[middleIndex]) (
26   startIndex = middleIndex + 1;
27  } else if(target ‹ numbers[middlelndex]) { 
          endIndex = middleIndex - 1;
    } else {
    return middleIndex;
  }

}


작동 방식
대상이 배열의 범위 내에 있는지 확인하고 반환하는 것으로 시작합니다.
그렇지 않으면 거짓입니다.

루프에서 대상이 Dur 배열의 시작 및 끝 값과 같은지 먼저 확인합니다. 그런 다음 대상이 중앙의 값보다 작은 Dr인지 확인합니다.
중앙에 있는 값보다 작으면 배열의 전반부 어딘가에 있을 것임을 알 수 있습니다. 우리는 그것에 집중할 수 있습니다.
더 크면 전반부에 있을 수 없다는 것을 알기 때문에 후반부를 찾는 데 집중할 수 있습니다.
반복해서 검색해야 하는 양을 절반으로 줄이면 locatiDn이 가까워집니다. 그것이 alDng 방식으로 발견되면 stDp하고 인덱스를 반환할 수 있습니다.
시간
루프를 반복할 때마다 배열의 절반을 제거하므로 시간
복잡도는 O(log2(n))이며 다음과 같이 단순화됩니다.
오(log(n))
우주
공간 복잡성은 다시 다음과 같습니다.
오(1)
결론
sDrted 데이터를 처리하면 많은 최적화가 가능합니다. 우리는 항목과 그 이전 및 이후 항목의 관계를 알고 있으므로 데이터를 건너뛰고 찾고 있는 가치에 집중할 수 있습니다.
데이터가 정렬되지 않은 상태로 들어오는 경우 때로는 직접 정렬하는 것이 좋습니다. o(n^2) 시간 cDmplexity를 갖는 sDlution이 있는 경우 데이터를 정렬할 수 있는지 확인하는 것이 좋습니다.
그것을 정렬하는 것은 o(n•2) 보다 나은 o(n * log(n) ) 프로세스가 될 것입니다. 일단 정렬되면 다음 단계는 종종 선형 또는 로그이므로 정렬 자체에 비해 중요하지 않습니다.

좋은 웹페이지 즐겨찾기