Table of Contents
목차
들어가기 전, hash table 개념 공부
개별 체이닝 Separate Chaining 자바 구현
학번으로 사람찾는 예시
hash node
- 데이터를 저장하는 기본타입
public class HashNode {
String name;
int snumber;
String phone;
}
hash table class
출동 유형에 따라 버터의 유형이 정해진다
기본 뼈대
public class HashTable {
// key(검색할 수 있는 위치)는 학번으로 하겠습니다.
private ListHash [] buffer;
private int tablesize = 50;
HashTable(int size)
{
# 10이면 10개씩 묶어있는것
buffer = new ListHash[size];
for(int i = 0;i<size;i++)
buffer[i] = new ListHash();
tablesize = size;
}
키로 값을 찾는 것
- multiplication(이걸로 구현)
// snumber = student number
// 학번 알려지면 안되니까 private
// multiplication ppt보면서 이해
private int Key(int snumber)
{
// 루트 5-1/2
double A = (Math.sqrt(5) -1) / 2.0;
//키값 k를 A에 곱한 후
double dkey = snumber * A;
//소수점 부분을 저장한다
dkey = dkey - (int)dkey;
//해시 테이블 크기 m 과 곱한다.
return (int)(dkey * tablesize);
}
저장하는 함수
- listhash의 어떤 특정한 값에다가 “저장” 할것임
// 저장하는 함수
// listhash의 어떤 특정한 값에다가 "저장" 할것임
public void insert(HashNode student)
{
// 50갸의 key중 어떤 키에 저장 할 지 정함
int kkk = Key(student.snumber);
// 버퍼 안 해당키에 insert
// 충돌하면 뒤에 붙여야함(충동했을 때는 밒에 설명)
buffer[kkk].insert(student);
}
해당 값을 검색하는 함수
// 실제로 검색
public HashNode find(int snumber)
{
int kkk = Key(snumber);
// 비어있을 때 처리
if(buffer[kkk].length() == 0)
return null;
return buffer[kkk].find(snumber);
}
}
충돌이 일어났을 때의 처리
- 그 해쉬 노드의 뒤에 링크드 리스트로 연결
public HashNode find(int snumber)
{
Node current = head;
while(current != null) {
if (current.data.snumber==snumber)
return current.data;
current = current.next;
}
insert에서 덮어 써서 값을 업데이트 할 때
- key 값 뒤에 붙이면 안됌
public void reinsert(HashNode student)
{
// 50갸의 key중 어떤 키에 저장 할 지 정했으니
int kkk = Key(student.snumber);
// 거기 안에 insert
// 충돌하면 뒤에 붙여
// insert 자체에 넣고 싶다면 insert에 if(buffer[kkk] != null; 조건만 추가해서 이 코드 붙여 넣으면 돼
buffer[kkk] = null;
buffer[kkk].insert(student);
}
hash main
데이터를 집어 넣음
public class HashMain {
public static void main(String[] args) {
HashTable ht = new HashTable(20);
HashNode st1 = new HashNode();
st1.name = "오예림";
st1.phone = "010-3328-5108";
st1.snumber = 202002123;
ht.insert(st1);
}
}
데이터가 있는지 검색하는 법
public class HashMain {
public static void main(String[] args) {
HashTable ht = new HashTable(20);
// 실제로 검색
HashNode stq = ht.find(202001234);
System.out.println(stq.name);
}
}