728x90
반응형
- 2015-11-19 : Actual implementation of Hash 이랑 Listing up all datas in hash table 부분 추가. 뭐 대충만 궁금증 정리한거지만;;;
- 2015-05-11 : 이거 직접 활용해야 할 단계에 와서 정리를 더 하면서 공부해야 하는데;;;
dic[0][0]='단어', dic[0][1]='뜻'
이런식으로 저장하는 셈이다. 하지만 이런식으로 저장을 해 놓으면 내가 알고 싶은 단어의 뜻이 궁금해서 검색할 때, 어느 위치에 이 단어/뜻이 저장되었는지 찾으려면 하나하나 비교를 해서 찾아야한다. 정렬을 해서 저장을 해놨다고 하더라도 100만개 단어가 저장된 data 에서 특정 단어를 찾으려면 적어도 작성중. 정리하기 귀찮다;;;;;;
저장되는 데이터 숫자가 가변적일 경우, 성능을 위해 해시 테이블 사이즈를 늘리거나 줄여야 하는 경우가 빈번함. 10만개 정도 데이터가 저장될거라 생각하고 해시 테이블 사이즈를 넉넉하게 20만개 정도로 잡아놨다가, 저장되는 데이터가 30만개로 늘어나게되면 충돌이 일어나게 되고 충돌을 해결하는 구조가 있더라도 검색 성능에 저하가 일어나게 된다.
이 경우 그냥 해시 사이즈를 늘려서 테이블을 아예 옮겨버리는게 한가지 해결방법인데.. h%HashSize
로 hash 값을 return 하는거라 그냥 HashSize 만 늘려놓고 같은 테이블에서 뒷부분만 채우는 식이면 안되고 아예 hash 값을 다시 다 계산해서 다시 저장해야만 한다.
성능 향상을 위해 1번 해시 테이블에 있는걸 2번 테이블로 옮기면서 (데이터가 많을 경우 옮기는데에도 꽤나 시간이 걸릴테니), 데이터에 접근 할 경우 2번 검색 후 없으면 1번 검색. 중간에 1번에서 검색 결과를 뱉은것이 있다면 요놈 먼저 옮기는 큐에 올리는것도 생각해 볼만함. 데이터 다 옮기면 1번 테이블의 저장공간을 free. 2번만 검색.
이전엔 1번이 메인이었다면 다 옮긴 후에는 2번이 메인. 1번 저장소는 다른 데이터를 덮어써서 다른 데이터들을 저장하는데 다시 사용가능.
고차원 배열 형태랑 비슷하게 해시 테이블도 고차원으로 만드는것도 가능. 트리구조 비슷하게.
구글같은데에서 쓸거 같은데... 여러가지 속도가 빠른 해시 함수들을 조합해서 1차 해시 2차 해시로 구현 해 놓으면 초고용량 데이터를 다룰때 유용할듯. 아니면 트리랑 해시를 섞어서 쓸수도 있음.
SQL 같은것들 구현에서 해시함수, 해시테이블 등이 쓰일듯.
검색 인덱스 설정하면 해시테이블이 만들어지면서 검색이 빠르게 되도록 도와주는듯.
인덱스 설정시 초기에 시간이 좀 걸리는 이유.
충돌 막는 법에 트리구조를 이용하기도 하는듯. 자바가 이런식으로 구현.
보조 해시함수도 있던데...
해시 테이블에 관한 간단한 설명 추가.
데이터 저장은 일렬로, 순서대로, 배열형태로, 혹은 적당히 다양한 방식으로 해놓고.
해시 테이블을 따로 구성. 인덱스 따라서 저장위치가 어디인지 해시 테이블을 따로 구성.
키값을 받으면 해시 함수 통과시켜서 해시 테이블 오더 1 검색. 여기서 나온 실제 데이터 저장위치 address 이용해서 바로 해당 데이터에 접근.
데이터 크기가 일정하지 않은 자료의 경우 유용. 사전 같은 것이 일예.
## Actual implementation of Hash
실제 여러 프로그래밍 언어들에서 hash table 을 어떻게 사용해 먹을 수 있을지 알아보자. 대부분 언어에서 HashMap 관련 class/library 등을 제공하니 그걸 잘 써먹으면 된다. 제공해주는 설명서, API-docu 들 참고해서.
### switch () case : ?
여러 언어에서 나오는 switch 문도 hash 이용하는 걸래나??? 그동안 if () else if () 랑 switch () case 랑 차이가 거의 없을거라고 생각해왔는데... Switch 에서는 내부적으로 hash 를 사용하는거라면 유의미한 차이가 있는거 같은데.
뭐 break
가 없을 경우 다음 case 까지 실행한다거나 그런 소소한 차이가 있긴 한데... if else 문처럼 처음 case 확인하고 아니면 다음 case 확인하는 식이 아니라 hash table 만들어놓고 key 값에 따라 해당 case 를 바로 찾아가는 식으로 내부적으로 구현해놨을수도 있을거 같은... break 같은걸 처리해야 하니 case 배치 순서도 어딘가 저장은 해놓고 처리해야겠네? 복잡시럽넹;;;
Wiki 의 Switch statement - Advantages and disadvantages 부분을 보니 hash 형식의 branch table 을 내부적으로 쓰는게 맞는듯도? 프로그래밍 언어마다 내부적으로 구현해놓은게 다르긴 할테니 완전히 장담할수는 없는듯. 뭐 대부분의 언어에서는 switch 구현에 hash 방식을 쓰긴 하는듯.
### JAVA
java.util.HashMap 을 import 해서 쓰면 된다.
```[.lang-java]
import java.util.Map;
import java.util.HashMap;
imgMap=new HashMap<String, String>();
for (String imgName: imgNames) {
imgMap.put(imgName, imgPath+imgName);
}
```/
### Javascript
여긴 따로 class 개념이 있는건 아니지만, JSON (JavaScript Object Notation) 자체가 아마도 hashmap 으로 이루어졌을 것으로 예상됨. (그냥 써먹기만 해서 내부적으로 어떻게 구현해놨는지 정확히는 모르겠음.)
```
data=[];
data.a="something";
data["$!@"]=53;
```/
## Listing up all datas in hash table.
Hash table 안의 내용물을 모두 list up 하고 싶을때도 있을텐데... 이 경우 어떤 방식으로 access 하는걸까나?
Compact array 형태의 자료에서 list up 하는건 Order (N) 이면 충분할거 같은데, hash table 을 list up 하는건 hash size 에 비례할래나??? hash size 내를 순서대로 다 접근해보면서 empty 가 아니면 보여주는 식으로??
뭐 언어들에서 제공하는 방법은 있긴한데... for in 같은 걸로... 여기서 data 접근이 어느 순서대로 이루어지는지를 잘 모르겠음. Hash table 에 data 를 put 한 순서도 따로 저장해놓고 그 순서대로 보여주는건가?
```
for (a in data)
```/
## RRA
- algoviz.org - OpenDSA - chapter 4. HASHING;
// 책 형태임 (영어). 스마트폰에서 수식이 잘 안보이는건 아쉽. - Spark notes - What is Hash Tables?;
// 가장 잘 설명해놓은 웹페이지 같음. - 수까락's blog - 해쉬 테이블;
// 한글 설명. Hash table/function 을 처음 접하는 사람이 이해하기는 힘들게 구성된듯도. - helloworld.naver.com - Java HashMap은 어떻게 동작하는가?, 2014-07-04, by 송기선;
// JAVA에서 구현해 놓은 HashMap에 관한 설명. 최적화가 잘 되어 있는듯. - MSDN(Microsoft Developer Network) - Library - Hashtable Class;
// 많이 쓰이는 자료구조인만큼 여러 언어들로 library/class가 구성되어 있음. import해서 쓰면 되는듯. - partow.net - General Purpose Hash Function Algorithms;
// 여러가지 hash function들도 설명해주고 꽤나 자세한듯함. 여러 hash function의 source code들도 다운되는듯. - azillion monkeys - Hash functions, by Paul Hsieh.;
// code가 있음. 읽어봐야 파악이 될듯. - eternally confuzzled - The Art of Hashing;
// 여러가지 hash function code 예제들 볼만함.
728x90
반응형
'[IT/Programming]' 카테고리의 다른 글
Web site - 다국어 지원 (multi-language support) (0) | 2022.12.28 |
---|---|
Compiling and Running JAVA (Build System) through batch (.bat) and shell script (.sh) (0) | 2022.12.19 |
움직이는 사진 gif 만들기 (GifCam.exe) (1) | 2019.03.06 |
한국 IT의 미래 (0) | 2019.03.04 |
JAVA SE 8 - API - index with Fuzzy Search (0) | 2019.02.19 |
가상 현실 (VR : Virtual Reality) 개발 (0) | 2019.02.19 |
음성 인식 (Speech Recognition) 프로그램 (0) | 2019.02.19 |