ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조 해쉬 테이블
    자료구조와 알고리즘 2020. 10. 23. 18:26

    1.해쉬 구조

    -Hash Table : 키(key)에 데이터(data)를 저장하는 데이터 구조

    • Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 획기적으로 빨라짐
    • 파이썬 딕셔너리(Dictionary) 타입이 해쉬 테이블의 예: Key를 가지고 바로 데이터(Value)를 꺼냄
    • 보통 배열로 미리 Hash Table 사이즈만큼 생성 후에 사용 (공간과 탐색 시간을 맞바꾸는 기법)
    • 단, 파이썬에서는 해쉬를 별도 구현할 이유가 없음 - 딕셔너리 타입을 사용하면 됨

    2. 알아둘 용어

    • 해쉬(Hash): 임의 값(방대한 데이터)을 고정 길이로 변환하는 것
    • 해쉬 테이블(Hash Table): 키 값의 연산에 의해 직접 접근이 가능한 데이터 구조(해쉬주소와 슬롯을 가지고 있는)
    • 해싱 함수(Hashing Function): Key에 대해 산술 연산을 이용해 데이터 위치를 찾을 수 있는 함수
    • 해쉬 값(Hash Value) 또는 해쉬 주소(Hash Address): Key를 해싱 함수로 연산해서, 해쉬 값을 알아내고, 이를 기반으로 해쉬 테이블에서 해당 Key에 대한 데이터 위치를 일관성있게 찾을 수 있음
    • 슬롯(Slot): 한 개의 데이터를 저장할 수 있는 공간
    • 저장할 데이터에 대해 Key를 추출할 수 있는 별도 함수도 존재할 수 있음

    3. 간단한 해쉬 예

    hash_table = list([i for i in range(10)])
    hash_table

    >실행결과 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    hash_table = list([0 for i in range(10)])
    hash_table

    >실행결과 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

     

    3.2. 이번엔 초간단 해쉬 함수를 만들어봅니다.

    • 다양한 해쉬 함수 고안 기법이 있으며, 가장 간단한 방식이 Division 법 (나누기를 통한 나머지 값을 사용하는 기법)
    def hash_func(key):
        return key % 5

    3.3. 해쉬 테이블에 저장해보겠습니다.

    • 데이터에 따라 필요시 key 생성 방법 정의가 필요함
    # 이름이 데이터일때 이름의 첫 글자의 아스키값을 키로 만듦
    data1 = 'Andy'
    data2 = 'Dave'
    data3 = 'Trump'
    data4 = 'Anthor'
    ## ord(): 문자의 ASCII(아스키)코드 리턴
    
    print (ord(data1[0]), ord(data2[0]), ord(data3[0])) #각 데이터의 첫번째 글자
    print (ord(data1[0]), hash_func(ord(data1[0])))
    print (ord(data1[0]), ord(data4[0]))

    #data1[0]의 출력값은 A ord(data1[0])은 65

     

    3.3.2. 해쉬 테이블에 값 저장 예

    • data:value 와 같이 data 와 value를 넣으면, 해당 data에 대한 key를 찾아서, 해당 key에 대응하는 해쉬주소에 value를 저장하는 예
    def storage_data(data, value):
        key = ord(data[0])
        hash_address = hash_func(key)
        hash_table[hash_address] = value

    storage_data('Andy', '01012341234')이렇게 넣으면 

    key = 65

    hash_address = 0

    hash_table[0]에 '01012341234' 값이 저장된다. 

    *hash_table은 위에서 이미 만들어 놓았다.

     

    storage_data('Andy', '100')
    storage_data('Dave', '200')
    storage_data('Trump', '300')
    storage_data('Ajun','400')

    이렇게 hash_table에 위의 값들을 넣으면

    0 1 2 3 4 5 6 7 8 9
    400 0 0 200 300 0 0 0 0 0

    위와 같다.

    첨에 0번 자리에 Andy의 값 100이 들어갔지만 ajun의 값이 덮어 씌웠다.

     

    3.5. 실제 데이터를 저장하고, 읽어보겠습니다.

    def get_data(data):
        key = ord(data[0])
        print(key)
        hash_address = hash_func(key)
        return hash_table[hash_address]
    get_data('Andy')

    위 코드를 출력하면 400일 출력된다. 

     

    아무튼 Ajun은 강의에 나온 내용은 아니지만 배우다가 의문이 들어 실행해 봤는데 이런 현상을 발견했다 아직 다음 수업을 들어봐야 알겠지만 일단은 여기까지

전설의 개발자