본문 바로가기
코딩 테스트

캐나다 IT 코딩 Hash Table

by 캐나다 프로그래머 2023. 12. 16.

Hash Table은 키와 값으로 데이터를 저장하는 자료구조입니다. 키를 해시 함수를 통해 해시값으로 변환하여 인덱스로 사용하며, 이를 통해 빠른 데이터 접근이 가능합니다. O(1)의 평균 시간 복잡도를 가지는 효율적인 자료구조입니다.

Hash Table의 정의

Hash Table은 키(Key)와 값(Value)을 연결하여 데이터를 저장하는 자료구조입니다. 키(Key)를 해시 함수를 통해 해시값(Hash Value)으로 변환한 후, 해당 해시값을 인덱스로 사용하여 값을 저장하고 검색합니다. 이를 통해 데이터에 대한 빠른 접근이 가능하며, 평균적으로 O(1)의 시간 복잡도를 가지는 효율적인 자료구조입니다.

Hash Table은 다양한 용도로 사용될 수 있으며, 데이터베이스, 캐시, 인덱싱, 집합 연산 등 다양한 애플리케이션에서 활용됩니다. 예를 들어, 전화번호부에서 이름을 키로 사용하여 전화번호를 값으로 저장하거나, 웹 사이트의 URL을 키로 사용하여 해당 페이지의 콘텐츠를 값으로 저장하는 등의 용도로 활용할 수 있습니다. Hash Table에 값이 어떻게 입력이 되는지는 아래의 'Hash Table 작동 기본 이미지'를 보시면 더 쉽게 이해하실 수 있습니다. Hash Table은 효율적인 데이터 저장 및 검색을 위해 널리 사용되는 자료구조입니다.

Hash Table 코딩 예제

다음은 Hash Table의 코딩 예제입니다. 아래의 Hash Table 이 어떻게 구현되는 가에 대해서는 기본적인 이해만 하고 넘어가셔도 됩니다. 참고로 대부분의 프로그래밍 언어에서는 다음과 같은 Hash 데이터 구조를 지원하는 관련 함수를 지원하기 때문에 이론적인 부분을 보시고 이해하시면 됩니다.

# Hash Table 구현
class HashTable:
    def __init__(self):
        self.size = 10
        self.table = [None] * self.size

    def _hash_function(self, key):
        return sum(ord(c) for c in key) % self.size

    def insert(self, key, value):
        index = self._hash_function(key)
        if self.table[index] is None:
            self.table[index] = []
        self.table[index].append((key, value))

    def get(self, key):
        index = self._hash_function(key)
        if self.table[index] is not None:
            for pair in self.table[index]:
                if pair[0] == key:
                    return pair[1]
        return None

# Hash Table 사용
hash_table = HashTable()
hash_table.insert("apple", 10)
hash_table.insert("banana", 20)
hash_table.insert("orange", 30)

print(hash_table.get("apple"))   # 출력: 10
print(hash_table.get("banana"))  # 출력: 20
print(hash_table.get("orange"))  # 출력: 30
print(hash_table.get("grape"))   # 출력: None

위의 예제는 Hash Table을 구현한 코드입니다. HashTable 클래스는 내부적으로 해시 함수를 사용하여 키와 값을 저장합니다. insert 메서드를 사용하여 키와 값을 삽입하고, get 메서드를 사용하여 키에 해당하는 값을 조회할 수 있습니다. 예제에서는 "apple", "banana", "orange"를 키로 사용하여 각각 10, 20, 30을 값으로 저장하고 조회하는 과정을 보여줍니다. Hash Table은 키와 값의 연결을 통해 데이터를 저장하고 검색하는 자료구조로, 평균적으로 O(1)의 시간 복잡도를 가지는 효율적인 자료구조입니다.

Hash Table 작동 기본 이미지

Hash Table 작동 기본 이미지
Hash Table 작동 기본 이미지

 

Hash Table 자료 구조의 장, 단점

Hash Table은 데이터를 효율적으로 저장하고 검색할 수 있는 자료구조로, 다음과 같은 장점을 가지고 있습니다.

장점

  • 효율성: 평균적으로 O(1)의 시간 복잡도를 가지며, 빠른 데이터 접근이 가능합니다.
  • 다양한 용도: 데이터베이스, 캐시, 인덱싱 등 다양한 애플리케이션에서 활용할 수 있습니다.
  • 충돌 해결 기법: 해시 충돌이 발생할 수 있지만, 체이닝과 개방 주소법과 같은 충돌 해결 기법을 사용하여 문제를 해결할 수 있습니다.

단점

  • 충돌 가능성: 해시 충돌이 발생할 수 있으며, 충돌을 해결하기 위한 추가적인 작업이 필요합니다. (Hash Table 메모리 사이즈 증가). 참고로 충돌(Collision) 이 발생하게 되면, Hash Table의 해당 인덱스에 Linked List 가 들어가는 형식이 되기 때문에 O(1)의 시간 복잡도를 가질 수 없는 현상이 됩니다. 결과적으로 기대하는 성능이 나오지 않는다는 의미가 됩니다.
  • 메모리 사용량: 해시 테이블은 추가적인 메모리를 사용하여 데이터를 저장합니다. 데이터의 크기가 커질수록 메모리 사용량도 증가합니다. 일반적으로 Hash Table 자료구조의 약 70% 정도 이상 데이터가 차지하고 있으면, Hash Table의 사이즈를 증가시켜서 메모리 사용량을 늘리는 것이 충돌 (Collision)을 최대한 피하는 것이 좋습니다.
  • 순서 보장의 어려움: 해시 테이블은 키-값 쌍의 연결을 통해 데이터를 저장하기 때문에 순서를 보장하기 어렵습니다.
  • 해시 함수의 선택: 해시 함수의 선택이 중요하며, 부적절한 해시 함수는 성능에 영향을 줄 수 있습니다.

코딩 테스트 실제 기출문제 - Hash Table 알고리즘

캐나다 IT 회사에서 출제된 Quick Sort 알고리즘 관련 실제 기출문제를 소개합니다. 영문 자체를 한글로 굳이 번역해서 소개하지 않는 이유는 이런 패턴에 익숙해지셔야 하기 때문입니다. 그리고 Solution을 보시기 전에 반드시 우선 문제 자체를 풀어 보시고 접근하시기 바랍니다.

 

Question

Given a list of words, create a function that returns the frequency of each word in the list. The function should return a dictionary where the keys are the unique words in the list and the values are the frequencies of those words.

 

Example:

Input:

words = ["apple", "banana", "orange", "apple", "grape", "banana", "apple"]

Output:

{"apple": 3, "banana": 2, "orange": 1, "grape": 1}

 

Solution:

def word_frequency(words):
    frequency = {}
    for word in words:
        if word in frequency:
            frequency[word] += 1
        else:
            frequency[word] = 1
    return frequency

# Test the function
words = ["apple", "banana", "orange", "apple", "grape", "banana", "apple"]
frequency = word_frequency(words)
print(frequency)

 

 

캐나다 IT 코딩 Recursion

Recursion 알고리즘은 함수가 자기 자신을 호출하여 문제를 해결하는 알고리즘입니다. Base case(기본 사례)에서는 재귀 호출을 멈추는 조건을 설정하고, Recursive case(재귀 사례)에서는 문제를 더 작은

canadaprogrammer.tistory.com

 

 

캐나다 IT 코딩 Binary Search

캐나다 IT 개발 구직자에게 코딩 테스트는 필수입니다. 취업, 전직 시에 코딩 테스트를 통과해야 하는 것은 분명하고 또한 개발자로서 준비하고 공부하면서 얻을 수 있는 기회입니다. 이번 글에

canadaprogrammer.tistory.com

 

반응형

'코딩 테스트' 카테고리의 다른 글

캐나다 IT 코딩 Dijkstra  (0) 2024.01.06
캐나다 IT 코딩 Breadth-first search  (0) 2023.12.21
캐나다 IT 코딩 Quick Sort  (0) 2023.12.12
캐나다 IT 코딩 Recursion  (0) 2023.12.09
캐나다 IT 코딩 Selection Sort  (2) 2023.12.07