일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- MVC 2편
- 백준
- 인프런 #김영한
- 인프런 김영한
- 스프링 DB 2편
- map
- 단방향연결리스트
- whitelabel error page
- REST Docs
- api 문서
- Hashtable
- spring boot
- IntelliJ
- java
- 김영한 #DB1편
- properties 한글깨짐
- 자바
- linkedlist
- Spring
- 스프링MVC 1편
- jsp
- 404
- properties ??
- python
- 김영한
Archives
- Today
- Total
산업공학도의 IT
해시 테이블 Java 구현 본문
ㅇ해시테이블
- 키 값이 특정한 함수로 도출된 해쉬코드를 인덱스로 사용하는 테이블
- 해쉬코드로 인덱스에 바로 접근하니 속도가 빠르다 - O(1)
ㅇ충돌
- 서로 다른 키값으로 동일한 해쉬코드가 만들어지는 경우
*충돌 해결방법
- 체이닝, 개방주소법, 선형탐색 등등이 있지만 체이닝을 사용하여 구현해보겠습니다
- Node 클래스
public class Node {
String key;
String value;
public Node(String key, String value) {
this.key = key;
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
- HashTable 클래스
import java.util.LinkedList;
public class HashTable {
// 체이닝을 사용하여 충돌을 해결하기위해 연결리스트 사용
LinkedList<Node>[] data;
// 생성자 - 해시테이블 크기
public HashTable(int size) {
data = new LinkedList[size];
}
// 글자 글자마다 아스키코드로 변환 후 다 더하기
// ex) ABC = 45 + 46 + 47 = 138
int getHashCode(String key) {
int hashCode = 0;
for (char c : key.toCharArray()) {
hashCode += c;
}
return hashCode;
}
// 해쉬코드를 테이블 크기로 나눈것을 인덱스로
public int convertToIndex(int hashCode) {
return hashCode % data.length;
}
// 인덱스와 키로 노드 찾기
Node searchNode(LinkedList<Node> list, String key) {
if (list == null) {
return null;
}
for (Node n: list) {
if (n.key.equals(key)) {
return n;
}
} return null;
}
// 키, 값 넣는 메소드
void put(String key, String value) {
int hashCode = getHashCode(key);
int index = convertToIndex(hashCode);
LinkedList<Node> list = data[index];
if (list == null) {
list = new LinkedList<Node>();
data[index] = list;
}
Node node = searchNode(list, key);
if (node == null) {
list.addLast(new Node(key, value));
}
}
// 키에 매핑되는 값 찾기
String get(String key) {
int hashCode = getHashCode(key);
int index = convertToIndex(hashCode);
Node node = searchNode(data[index], key);
return node == null ? "Not Found" : node.value;
}
}
- Main 클래스
public class Main {
public static void main(String[] args) {
HashTable hashTable = new HashTable(5);
hashTable.put("Mangchi", "This is Mangchi");
hashTable.put("Hammer", "This is Hammer");
hashTable.put("IE", "This is IE");
System.out.println(hashTable.get("Mangchi"));
System.out.println(hashTable.get("Hammer"));
System.out.println(hashTable.get("IE"));
System.out.println(hashTable.get("BAB"));
}
}
ㅇ정보
- Map을 구현해서 만든게 HashTable이다. 자바에 Hashtable로 가보면 아래와 같이 볼 수 있다.
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
*출처
- 엔지니어 대한민국 (유투버)
- 코딩인터뷰 완전분석 (책)
'공기업 공간 > 자료구조' 카테고리의 다른 글
연결리스트 Java 구현 (0) | 2023.10.05 |
---|