• Home
  • About
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • All Posts
    • All Tags
  • Projects

[15] Java_자료구조(해시테이블 개별 체이닝 Separate Chaining 자바 구현)

02 Jul 2020

Reading time ~2 minutes

Table of Contents
  • 목차
  • 들어가기 전, hash table 개념 공부
  • 개별 체이닝 Separate Chaining 자바 구현
    • hash node
    • hash table class
      • 기본 뼈대
      • 키로 값을 찾는 것
      • 저장하는 함수
      • 해당 값을 검색하는 함수
      • 충돌이 일어났을 때의 처리
      • insert에서 덮어 써서 값을 업데이트 할 때
    • hash main
      • 데이터를 집어 넣음
      • 데이터가 있는지 검색하는 법

목차

  • 개별 체이닝 Separate Chaining 자바 구현
    • hash node
    • hash table class
      • 기본 뼈대
      • 키로 값을 찾는 것
      • 해당 값을 검색하는 함수
      • 충돌이 일어났을 때의 처리
      • insert에서 덮어 써서 값을 업데이트 할 때
    • hash main
      • 데이터를 집어 넣음
      • 데이터가 있는지 검색하는 법

들어가기 전, hash table 개념 공부

learn more


개별 체이닝 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);
 }
}


BasicJava Share Tweet +1