본문 바로가기
C# 공부

[자료구조] 해시테이블(Hash Table), Dictionary

by Dev_Hugh 2023. 6. 22.
728x90
반응형

해시테이블

-Hash는 키 값을 Hash Function으로 해싱하여 해시테이블의 특정 위치로 직접 엑세스하도록 만든 방식이다.

-키 값이 많아지면 매우 많은 배열 공간이 필요한데, 이렇게 낭비되는 공간을 줄이기 위해 해시 함수를 사용한다.

-해시 함수는 적은 공간 안에서 모든 키를 직접 찾아갈 수 있도록 해준다.

 

Hashtable 클래스

-.NET에 Hashtable 클래스는 Non-Generic 클래스다.

-Hashtable은 key값과 value값 모두 object 타입을 받아들여 박싱/언박싱이 일어난다.

-Hashtable은 Double Hashing 방식을 사용하여 Collision Resolution을 하게 된다.

-즉 해시 함수를 사용하여 key가 collision(충돌)이 발생하면, 다른 해시 함수를 계속 사용하여 빈 버켓을 찾게된다.

 

해시 함수 충돌

-서로 다른 키가 동일한 해시 테이블 버켓 위치를 가리킬때 collision이 발생했다 한다.

-이를 해결하기 위해 collision resolution 방식이 사용되는데, 이 방식으론 chaining, linear probing, quadratic probing, double hashing등 여러가지 방식이 있다.

 

해시테이블 시간 복잡도

-추가, 삭제, 검색 O(1) 시간 소요

 

Dictionary<Tkey, Tvalue> 클래스

-.NET에 Generic 방식으로 해시테이블을 구현한 클래스가 Dictionary 클래스다.

-key값과 value값 모두 Strong type을 받아들여 박싱/언박싱이 일여나지 않는다.

-Dictionary는 collision resolution으로 chaining 방식을 이용한다.

 

Dictionary<Tkey, Tvalue> 클래스 시간 복잡도

-추가, 삭제, 검색 O(1) 시간 소요

 

사용 예제

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Hashtable hashTable = new Hashtable();
        Dictionary<int, string> dictionary = new Dictionary<int,string>();
        
        hashTable.Add("Dev", "재밌다");
        hashTable.Add("Hugh", "개발자다");
        dictionary.Add(1, "안녕하세요");
        dictionary.Add(2, "안녕못해요");
        
        if(hashTable.Contains("Dev"))
        {
            Console.WriteLine(hashTable["Dev"]); //재밌다 출력
        }
        
        string greetings = dictionary[2];
        Console.WriteLine(greetins); //안녕못해요 출력
    }
}
728x90
반응형

'C# 공부' 카테고리의 다른 글

[자료구조] 스택(Stack)  (0) 2023.06.23
[Tip] @(심벌) 사용  (0) 2023.06.22
[자료구조] 연결 리스트(Linked List)  (0) 2023.06.22
[자료구조] 시간 복잡도 정리  (0) 2023.06.21
[자료구조] 동적 배열(Dynamic Array)  (0) 2023.06.21