해시 테이블은 데이터를 효율적으로 저장하고 검색하기 위한 자료 구조로, 특정 데이터를 고유한 키(key)와 연결하여 저장하는 방식을 사용합니다. 해시 테이블은 다음과 같은 목적을 가집니다:
해시 테이블을 구현하기 위해서는 해시 함수와 배열을 사용합니다. 간단한 파이썬 예제로 해시 테이블을 구현할 수 있습니다:
import java.util.Hashtable;
public class Main {
public static void main(String[] args) {
// Hashtable을 생성합니다.
Hashtable<String, Integer> ht = new Hashtable<>();
// 키와 값을 추가합니다.
ht.put("key1", 42);
ht.put("key2", 15);
// 특정 키를 사용하여 값을 검색합니다.
Integer result1 = ht.get("key1");
Integer result2 = ht.get("key2");
System.out.println("key1: " + result1);
System.out.println("key2: " + result2);
// 특정 키와 연관된 값을 제거합니다.
ht.remove("key1");
// 삭제 후 다시 검색해보면 null이 반환됩니다.
Integer result3 = ht.get("key1");
System.out.println("key1 after removal: " + result3);
}
}
해시 테이블에서 충돌은 두 개 이상의 키가 동일한 해시값을 가질 때 발생합니다. 충돌을 해결하지 않으면 데이터의 무결성이 깨질 수 있습니다.
여러 가지 충돌 해결 기법이 있으며, 일반적으로 다음과 같은 방법을 사용합니다:
해시 테이블의 각 슬롯(해시값에 해당하는 배열 요소)에 연결 리스트를 사용하여 충돌된 데이터를 저장합니다.
충돌이 발생한 슬롯을 다른 슬롯으로 이동하거나 다른 빈 슬롯을 찾아 데이터를 저장합니다. 선형 탐색, 이차 탐색, 이중 해싱 등이 사용됩니다.
import java.util.Hashtable;
public class Main {
public static void main(String[] args) {
Hashtable<String, Integer> ht = new Hashtable<>();
ht.put("data1", 32);
ht.put("data2", 11);
ht.put("data3", 12);
ht.put("data4", 41);
Integer result = ht.get("data2");
// 1. 다음 출력될 것은?
System.out.println(result);
ht.remove("data3");
result = ht.get("data3");
// 2. 다음 출력될 것은?
System.out.println(result);
// 3. Hashtable에 이미 존재하는 키를 사용하여 값을 추가하면 어떤 결과가 나오는지 설명하세요.
// 4. Hashtable의 크기를 확인하는 방법를 작성
// 5. Hashtable을 비우는 코드를 작성
}
}