C# - HashTable

양규빈·2023년 7월 11일
0

C# 공부

목록 보기
12/30

개요

키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 데이터 구조.
해시 테이블은 키를 해시 함수를 사용하여 해시 코드(Hash Code)로 변환하고, 이 해시 코드를 인덱스로 사용하여 데이터를 저장하고 검색한다.
해시 테이블은 System.Collections 네임스페이스에 있는 Hashtable 클래스를 사용하여 구현할 수 있다.

해시 테이블은 해시 함수를 사용하여 키를 해시 코드로 변환하므로, 데이터를 검색하는 데에 O(1)의 시간 복잡도를 갖는다.

해시 테이블은 동적으로 크기를 조정할 수 있다. 데이터의 삽입 및 삭제에 따라 자동으로 크기가 조정되므로, 데이터의 개수에 따라 유연하게 확장 및 축소될 수 있다.

테이블명.Add(키값, 데이터);

킷값과 데이터를 함께 넣어주어야 한다.
이때, 킷값은 중복될 수 없다.
즉, 데이터를 넣기 전에 먼저 킷값이 있는지 확인해봐야 한다.

  • ContainsKey() 함수를 이용하여 킷값의 유무를 확인할 수 있다.
    ㄴ 해당 킷값이 있는지 검사하는 함수

  • 키, 값의 쌍으로 이루어진 데이터

  • 데이터 mapping(매핑)을 이용해서 해시값 (또는 key값)을 만들어 연결해 두면순서대로 확인하여 찾는 방법보다 훨씬 빠르게 접근할 수 있다.

  • 장점 : 삽입, 삭제, 검색이 매우 빠르다. (해싱된 키[Hash Key]를 인덱스로 사용하기 때문에)

  • 단점 : 해시충돌(Hash Collision)



코드 및 세부 설명

Hashtable에서 데이터를 열거하려면 IDictionaryEnumerator를 사용하여 키-값 쌍을 하나씩 검색하고 반복한다.
IDictionaryEnumerator는 키(Key)와 값(Value)을 가리키는 Current 속성을 제공하며, MoveNext 메서드를 사용하여 다음 항목으로 이동한다.

즉, 해시테이블은 Enumerator만으로 전체 값을 출력할 수 없다.
그렇기에 IDctionaryEnumerator를 상속받아 사용한다.

상속받은 함수는 key값과 value 값을 사용할 수 있다.
이를 통해 이 함수는 key값과 value값을 전부 출력할 수 있다.

DictionaryEntry data = (DictionaryEntry)it.Current; 와 같은 방식으로도 출력할 수 있다.

두 foreach문의 기능은 동일하다.
해시테이블 내에 있는 모든 자료를 출력한다.

  • DictionaryEntry가 강제로 형변환을 하여, 개발자가 원하는 자료형을 출력할 수 있다.

key : 킷값을 나타낸다.
테이블명[key] : 킷값에 해당하는 벨류를 출력할 수 있다.

값을 조회하는 방법은 다음과 같다.
containskey를 이용하여 max 인덱스를 가진 값을 가져온다.
인덱스의 값을 이용하여, 벨류를 불러온다.

②테이블명.Remove(키값)
해당 인덱스의 값과 벨류를 제거한다.

③테이블명.Crear()
테이블 내부의 모든 자료를 제거한다.

다음과 같은 방법으로 초기화 가능

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글