예꾸
개발자국
예꾸
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • CS (6)
      • 데이터베이스 (5)
      • 운영체제 (0)
      • Computer Architecture (1)
    • 끄적끄적 (4)
    • 이론 (29)
      • 알고리즘 (18)
      • 자료구조 (4)
      • WEB (2)
      • JS (2)
      • Git (2)
      • Python (1)
    • 면접준비 (3)
      • Vue (1)
      • Design Pattern (1)
      • Frontend (1)
    • 개발기술 (20)
      • Git PUSH 자동화 (3)
      • VUE (1)
      • Linux (2)
      • MERN Stack (2)
      • React기반 Gatsby로 블로그 개발하기 (6)
      • Typescript (0)
      • 감정일기장(React) (3)
      • CI CD (3)
    • 코드트리 (6)
      • 블로그 챌린지 (3)
      • 모의시험 (3)
    • 취업준비 (3)
      • 코딩테스트 후기 (3)
    • 프로그래머스 (8)
      • SQL (7)
      • 알고리즘 (1)
    • 백준 (31)
      • 그리디(탐욕법) (6)
      • 구현 (5)
      • 그래프탐색(dfs, bfs) (5)
      • 완전탐색 (5)
      • 문자열 (5)
      • 누적합 (2)
      • DP(다이나믹 프로그래밍) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 구현
  • gatsby
  • javascript
  • React
  • 코드트리 추천
  • 프로그래머스
  • 코딩테스트실력진단
  • 프로그래머스 SQL
  • 나만의공부노트
  • 자료구조
  • 코딩테스트
  • JS
  • 운영체제
  • 백준 그리디
  • 백준 그래프탐색
  • 알고리즘
  • 코드트리
  • 컴퓨터 시스템의 구조
  • 백준 완전탐색
  • 백준 문자열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
예꾸

개발자국

[이진탐색] binary Search - JS, Python
이론/알고리즘

[이진탐색] binary Search - JS, Python

2021. 4. 21. 03:56

이진탐색 알고리즘

  • 이진탐색의 전처리 과정은 오름차순 정렬이다
  • 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘
  • 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교하는 알고리즘
  • 반으로 쪼개면서 탐색하기

1. 정렬된 리스트를 준비한다

2. idx 0부분을 start, idx 마지막 부분을 end, (start + end) // 2를 mid로 설정

3. array[mid]값이 target보다 크면 end를 mid-1지점으로 바꾼다 + mid도 다시 설정

4. array[mid]값이 target보다 작으면 start를 mid+1지점으로 바꾼다 + mid도 다시 설정

5. start가 end보다 클때까지 반복한다 

6. 반복했음에도 값이 없으면 None을 반환하고, array[mid]가 target과 같으면 mid + 1값(target값의 index)을 출력 

Big O

BEST : O(logN)

WORST : O(logN)

 

단계별로 확인해야 하는 데이터 갯수가 반씩 줄어든다, 즉 단계마다 2로 나누는것과 동일

 

 

장점

  • 선형탐색과 비교했을 때 탐색시간이 빠르다 (선형탐색 시간 복잡도 O(N))

단점

  • 정렬된 리스트에서만 사용할 수 있다

 

Python 코드

반복문 구현

# 반복문 구현
def binaray_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        # 찾은 경우 중간점 인덱스 반환
        if array[mid] == target:
            return mid
        elif array[mid] > target:
            end = mid - 1
        else:
            start = mid + 1
    return None



n, target = map(int, input().split())
array = list(map(int, input().split()))

# print(n, target, array)

# 이진탐색 수행 결과 출력
result = binaray_search(array, target, 0, n-1)
if result == None:
    print('원소 존재 안함')
else:
    print(result + 1) # 몇번째에 존재하는지 반환

 

재귀 구현

# 재귀구현
def binaray_search(array, target, start, end):
    # target값이 없는 경우
    if start > end:
        return None
    mid = (start + end) // 2
    # 찾은 경우 중간점 인덱스 반환
    if array[mid] == target:
        # mid idx반환
        return mid
    elif array[mid] > target: # 중간값이 target값보다 큰 경우(target의 오른쪽)
        # 중간값의 왼쪽 확인
        return binaray_search(array, target, start, mid-1)
    else: # 중간값이 target보다 작은 경우
        # 중간값의 오른쪽 확인
        return binaray_search(array, target, mid+1, end)
        
        
n, target = map(int, input().split())
array = list(map(int, input().split()))

# print(n, target, array)

# 이진탐색 수행 결과 출력
result = binaray_search(array, target, 0, n-1)
if result == None:
    print('원소 존재 안함')
else:
    print(result + 1) # 몇번째에 존재하는지 반환

 

JS 코드

const binary_search = function(array, target, start, end) {
  
  while (start <= end) {
    let mid = parseInt((start + end)/2)
    // console.log(mid)
    if (array[mid] == target) {
      return mid
    } 
    else if (array[mid] > target) {
      end = mid - 1
    } else {
      start = mid + 1
    }
  }
  return None
}


let N = 10
let target = 7
let array = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

const result = binary_search(array, target, 0, array.length - 1)
console.log(result + 1)
    '이론/알고리즘' 카테고리의 다른 글
    • [JavaScript] 알고리즘에 쓰이는 문법 (자르기)
    • [다이나믹프로그래밍] DP - JS, Python
    • [정렬] Counting Sort - JS, Python
    • [Python] 정렬 라이브러리
    예꾸
    예꾸
    비전공자 옒의 개발이야기💻

    티스토리툴바