ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 알고리즘 : 해시 테이블(Hash Table)
    코테스터디 2022 2022. 6. 26. 01:44

    🔹 해시테이블이란?

    • key-value 로 이루어진 자료 구조
    • 내부적으로 배열을 사용하여 데이터를 저장하며 입력 키 값으로부터 얻은 해시값을 인덱스로 사용하기 때문에,
      데이터를 빠른 속도로 검색하거나 처리한다.
    • 평균 시간복잡도 : O(1)

    🔹 해시란?

    • 해시 : 해시 함수 또는 해시 알고리즘(임의 길이의 데이터를 고정된 길이의 데이터로 매핑)에 의해 얻어지는 값(위키백과)
    • 해시 충돌 : 해시 함수가 서로 다른 두 입력값에 대해 동일한 출력을 만듦.
      즉, 두 개 이상의 다른 KEY가 동일한 인덱스로 매핑될 경우 해시 충돌이 발생, 해시 테이블의 성능을 저하
    • 방지하기 위한 해시충돌 알고리즘이 있다.

     

    🔹 파이썬에서의 구현

    파이썬에서는 key-value의 형태로 이루어진 dictionary 자료 구조가 해시 테이블
    

    key를 인덱스로 활용하여 value 값을 얻을 수 있다.

     

     

    1) 검색

    파이썬에서 인덱스를 통해 원소에 접근할 때,

    리스트형은 숫자만을 이용해 원소에 접근 가능.

    아래 예의 경우 a['1']로 접근하면, 에러 발생 (TypeError: list indices must be integers or slices, not str)

    a = [1,2,3,4]
    print(a[1])

    >>1

     

    딕셔너리형은 문자열과 같은 특정 입력값을 인덱스로 사용할 수 있다

     

    a = {'1':1,'2':2,1:3}
    
    print(a['1'])
    print(a[1])

    >> 1

    >> 3

     

    아래와 같이 딕셔너리 생성 후, Apple 요소의 값을 확인

    dict = {'Apple':1000,'Bacon':1200,'Carrot':800}
    print(dict['Apple'])

     

    >> 1000

     

     

    2) 중복 key -> 무시❗

     

    중복된 key 값이 들어오면, 마지막으로 입력된 value값만 남는다.

    dict = {'Apple':1000,'Bacon':1200,'Carrot':800}
    print(dict)
    dict = {'Apple':1000,'Bacon':1200,'Carrot':800,'Apple':3000}
    print(dict['Apple'])
    print(dict)

    >> {'Apple': 1000, 'Bacon': 1200, 'Carrot': 800}

    >> 3000

    >>{'Apple': 3000, 'Bacon': 1200, 'Carrot': 800}

     

    3) 예제 문제

    https://programmers.co.kr/learn/courses/30/lessons/42576

     

    코딩테스트 연습 - 완주하지 못한 선수

    수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

    programmers.co.kr

    이 문제는 동일한 key값이 입력으로 발생한다.

    요소의 입력 순서를 요하지 않기 때문에, 두 입력 데이터(리스트)의 값을 비교하여 풀 수 있다.

    collections의 Counter 함수를 활용하거나, 나의 경우 itertools의 zip_longest 함수를 활용해 풀었다.

     

    728x90

    '코테스터디 2022' 카테고리의 다른 글

    [Python] 알고리즘 : 탐욕법 (Greedy Algorithm)  (0) 2022.07.04

    댓글

Designed by Tistory.