Hash Table
Hash Function
Hash Collision
Dynamic Resizing
Java์ HashTable๊ณผ HashMap
key์ ๋ํ hash ๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ์ฌ key-value์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๋ฉฐ, key-value์์ ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
bucket๊ณผhash function
hash table์ array๋ก ์ด๋ฃจ์ด์ ธ์๊ณ array ๊ฐ๊ฐ์ ์ฃผ์๋ฅผ bucket ์ด๋ผ ๋ถ๋ฅธ๋ค. hash function ์ key-value์ key๊ฐ์ array์ index๋ก ๋งคํ์ํค๋ ํจ์์ด๋ค.
ํด์ ํจ์๋ ์์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํฌ๊ธฐ์ ๊ฐ์ผ๋ก ๋งคํํ๋๋ฐ ์ฌ์ฉ๋๋ ํจ์์ด๋ค.
- hash function๋ก hash table์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ array์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์น(index)๋ฅผ ๊ตฌํ ์ ์๋ค.
- index๋ฅผ ๊ตฌํ ๋, ๋ณดํต
mod์ฐ์ฐ์ ์ฌ์ฉํ๋ค. - hash function์ ํตํด index๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์
hashing์ด๋ผ๊ณ ํ๋ค.
- index๋ฅผ ๊ตฌํ ๋, ๋ณดํต
์์ ํด์ ํจ์
๋ชจ๋ key๋ค์ด ์๋ก ๋ค๋ฅธ hash๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ ํด์ ์ถฉ๋์ด ์ผ์ด๋์ง ์๋ hash function์ด๋ค. key์ ์ ์ฒด์งํฉ์ ๋ฏธ๋ฆฌ ์๊ณ ์๋ ๊ฒฝ์ฐ์ ์์ ํด์ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
๊ฐ์ฒด๊ฐ ๋ํ๋ด๋ ๊ฐ์ ์ข ๋ฅ โค
2^32
Boolean, Number(Integer, Long, Double) ์ฒ๋ผ ๊ฐ์ฒด๊ฐ ๋ํ๋ด๋ ๊ฐ์ ๊ฐ์(key์ ์ ์ฒด์งํฉ)๊ฐ ์ ๋ค๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํด์ ํจ์์ ๋์์ผ๋ก ์ผ์ ์ ์๋ค.
๊ฐ์ฒด๊ฐ ๋ํ๋ด๋ ๊ฐ์ ์ข ๋ฅ >
2^32
String, POJO์ ๊ฐ์ด ๊ฐ์ฒด๊ฐ ๋ํ๋ด๋ ๊ฐ์ ๊ฐ์(key์ ์ ์ฒด์งํฉ)๊ฐ int๋ก ํํํ ์ ์๋ ๊ฐ์(2^32)๋ณด๋ค ๋ง๋ค๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํด์ ํจ์์ ๋์์ผ๋ก ์ผ์ ์ ์๋ค.( hashCode() ๋ฉ์๋์ ๋ฐํ๊ฐ์ด int ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.)
Java์ HashMap์์ ์์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค
HashMap์ด ๋ด์ ์ ์๋ ๊ฐ์ฒด๊ฐ ๋ํ๋ด๋ ๊ฐ์ ๊ฐ์๋ int ์ ํํ๋ฒ์์ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ int ํํ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ผ๋ ๋๋ค ์ ๊ทผ์ ์๊ฐ๋ณต์ก๋ O(1)์ ๋ณด์ฅํ๊ธฐ ์ํด์ 2^32 ๊ธธ์ด์ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ผ๊ธฐํ๋ค.
hash bucket์ธ๋ฑ์ค
int m = hashTableSize; // m : ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ
int hash = object.hashCode(); // object: ์๋ฐ ๊ฐ์ฒด, hashCode() : ์๋ฐ ๊ฐ์ฒด์ hash function
int index = hash % m; // hash bucket ์ธ๋ฑ์คJava์ hashCode ๋ฉ์๋
/**
* Returns a hash code value for the object. This method is
* supported for the benefit of hash tables such as those provided by
* {@link java.util.HashMap}.
* @return a hash code value for this object.
* @see java.lang.Object#equals(java.lang.Object)
* @see java.lang.System#identityHashCode
*/
@HotSpotIntrinsicCandidate
public native int hashCode();
/**
* Returns the same hash code for the given object as
* would be returned by the default method hashCode(),
* whether or not the given object's class overrides
* hashCode().
* The hash code for the null reference is zero.
*
* @param x object for which the hashCode is to be calculated
* @return the hashCode
* @since 1.1
* @see Object#hashCode
* @see java.util.Objects#hashCode(Object)
*/
@HotSpotIntrinsicCandidate
public static native int identityHashCode(Object x);- ์๋ฐ ๊ฐ์ฒด์
hashCode()๋ฉ์๋๋ intํ์ ํด์๊ฐ์ ๋ฐํํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋กSystem.identityHashCode๋ฐํ๊ฐ์ ๋ฐํํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ฌ์ ์ํ ์ ์๋ค.
1/mํ๋ฅ ์ํด์ ์ถฉ๋
hash function์ ํํ๋ฒ์๋ฅผ m์ผ๋ก ์ขํ์ผ๋ก์จ ์๋ก ๋ค๋ฅธ hashCode๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ 1/m ์ ํ๋ฅ ๋ก ๋์ผํ ํด์ ๋ฒํท ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ์ ์๋ ํด์ ์ถฉ๋(hash collision) ์ด ๋ฐ์ํ๋ค. ํด์ ์ถฉ๋์ hash function์ ์๋ฌด๋ฆฌ ์ ๊ตฌํํ์ฌ๋ ์๊ด์์ด ๋ฐ์ํ๋ค.
ํด์ ์ถฉ๋ํด๊ฒฐ๋ฐฉ๋ฒ
ํด์ ์ถฉ๋์ด ๋ฐ์ํด๋ Open Addressing, Seperate Chaining ๋ฐฉ์์ ํตํด key-value ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์กฐํํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ค๋ hash bucket์ด ์ด๋ฏธ ์ฌ์ฉ์ค์ด๋ผ๋ฉด ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์์ด๋ค.
- Worst Case์ ๊ฒฝ์ฐ ๋น์ด์๋ bucket์ ์ฐพ์ง ๋ชปํ๊ณ ํ์์ ์์ํ ์์น๋ก ๋๋์์ฌ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ bucket์ด ๋ชจ์ฌ์์ผ๋ฉด Worse Case ๋ฐ์ ๋น๋๊ฐ ๋์์ง๋ค.
- ๋น์ด์๋ bucket์ ํ์ํ๋ ๋ฐฉ์์๋
Linear Probing,Quadratic Probing,Double Hashing์ด ์๋ค.
ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ ๊ณ ์ ํญ n ๋งํผ ์ด๋ํ๋ฉด์ ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
hi(x) = (Hash(x) + i) % arraySize- h(k) โ h(k)+n โ h(k)+2n โ h(k)+3n ...
Linear Probing ์์ฌ์ฝ๋
while(Node != null){ // ํ์ ๋
ธ๋๊ฐ ๋น์ด์๋ค๋ฉด searchKey๊ฐ ์์ง ์ ์ฅ์ด ์๋ ๊ฒ
if(Node.key == searchKey) return Node.value;
Node = Node.next; // ๊ท์น์ ๋ง๋ ๋ค์ ๋
ธ๋
}Linear Probing ์์
Linear Probing ๋จ์ :
Primary Clustering๋ฌธ์
๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ filled bucket๋ค์ด ๋ชจ์ฌ์๋ค๋ฉด ๋น์ด์๋ bucket์ ์ฐพ๊ธฐ ๊น์ง์ ํ์ ์๊ฐ์ด ๋์ด๋๋ค. Primary Cluster๊ฐ ํ์ฑ๋๋ฉด ๋น ๋ฅด๊ฒ ์ปค์ง๊ณ ๊ฒฐ๊ตญ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ๊ธฐํ๋ค.
ํด์ ์ถฉ๋์ด ๋ฐ์ํ ํ์ฌ bucket index๋ถํฐ n^2 ๋งํผ ์ด๋ํ๋ฉด์ ๋น์ด์๋ bucket์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก Linear Probing ๋ฐฉ์์ Primary Clustering ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
hi(x) = (Hash(x) + i^2) % arraySize- h(k) โ h(k)+1^2 โ h(k)+2^2 โ h(k)+3^2 ...
Quadratic Probing ์์
Quadratic Probing ๋จ์ :
Secondary Clustering๋ฌธ์
n^2 ๊ฐ๊ฒฉ์ผ๋ก filled bucket์ด ์กด์ฌํ์ฌ key์ hash๊ฐ(index) ๋ณด๋ค ํจ์ฌ ๋จ์ด์ง ๊ณณ์ ๋ฐ์ดํฐ๊ฐ ์ฝ์
๋๋ ํ์์ด๋ค. ์ด๋ filled bucket ๊ตฐ์ง์ ํฌ๊ฒ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์ Primary Clustering ๋ณด๋ค ๋ ์ฌ๊ฐํ ๋ฌธ์ ์ด๋ค.
hash๊ฐ์ ๋ค๋ฅธ hash function์ผ๋ก ํ๋ฒ ๋ ํด์ฑํ์ฌ hash์ ๊ท์น์ฑ์ ์์ ๋ ๋ฐฉ์์ผ๋ก Secondary Clustering ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
hi(x) = (Hash(x) + i * Hash2(X)) % arraySize
Double Hashing Probing ์์
๋ฐ์ดํฐ ํ์(search) ์๊ณ ๋ฆฌ์ฆ
target ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฑฐ๋ empty bucket์ ๋๋ฌํ๊ธฐ ์ ๊น์ง ํ์(probing)์ ์งํํ๋ค. target ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ empty bucket์ ๋๋ฌํ๋ฉด ํ์(probing)์ ์ข ๋ฃํ๋ ๋ฌธ์ ์ ์ด ์๋ค.
๋ฐ์ดํฐ ์ญ์ ์ ๋ฌธ์ ์
34 ๋ฅผ insertํ๊ณ 35 ๋ฅผ deleteํ ๋ค 34 ๋ฅผ searchํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์.
12 ๋ถํฐ ๋ด๋ ค๊ฐ๋ฉด์ ํ์์ ์งํํ๋ค๊ฐ empty bucket(5๋ฒ)์ ๋ง๋๋ฉด ํ์์ ์ข
๋ฃํ๊ฒ ๋์ด 34 ๊น์ง ๊ฒ์์ด ์งํ๋์ง ์๋๋ค. ์ด๋ Open Addressing ํ์ ์๊ณ ๋ฆฌ์ฆ(empty bucket์ ๋ง๋๋ฉด probing ์ข
๋ฃ)์ผ๋ก ์ธํ ๋ฌธ์ ์ด๋ค.
๋ฐ์ดํฐ ์ญ์ ์ ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ
์ญ์ ํ ๋ฐ์ดํฐ์ bucket์ dummy node ๋ฅผ ๋ฃ๊ฑฐ๋ flag (Occupied, Empty, Deleted) ๋ฅผ ํ์ฉํ์ฌ ํ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์งํ๋๋๋ก ํ ์ ์๋ค.
๊ฐ๊ฐ์ hash bucket์ LinkedList๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ๊ตฌ์ฑํ์ฌ ํด์ ์ถฉ๋์ ํด๋น bucket์ LinkedList์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก Seperate Chaining ๋ฐฉ์์ Open Addressing ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค.
- Open Addressing์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ bucket์ด ๋ชจ์ฌ์์ผ๋ฉด Worst Case ๋ฐ์ ๋น๋๊ฐ ๋์์ง๋ค
- Seperate Chaining์ ํด์ ์ถ๋์ ํผํ๋๋ก ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์กฐ์ ํ๋ฉด Worse Case์ ๊ฐ๊น์์ง๋ ๋น๋๋ฅผ ์ค์ผ ์ ์๋ค.
- Java 7์์ HashMap์ Seperate Chaining ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด์๋ค.
- Seperate Chaining ๋ฐฉ์์ ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ธ๋ค.
Red-Black Tree๋ก ๊ตฌํํ Seperate Chaining
ํ๋์ hash bucket์ ํด๋นํ๋ LinkedList์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 8๊ฐ๊ฐ ๋๋ฉด ๊ตฌ์กฐ๋ฅผ LinkedList -> Red-Black Tree ๋ก ๋ณํํ๋ค. LinkedList ํ์ ์ฑ๋ฅ์ Worst Case๋ O(N) ์ด์ง๋ง Red-Black Tree์ ๊ฒฝ์ฐ O(logN)์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋์ hash bucket์ ํ ๋น๋ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 6๊ฐ์ด๋ฉด ๊ตฌ์กฐ๋ฅผ Red-Black Tree -> LinkedList๋ก ๋ณํํ๋ค. ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ ์ผ๋ฉด Red-Black Tree์ LinkedList๊ฐ์ ํ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๊ฑฐ์ ์๊ณ , Red-Black Tree๋ LinkedList๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณํ ๊ธฐ์ค์ด
6๊ฐ,8๊ฐ์ธ ์ด์
๋ณํ ๊ธฐ์ค์ 6๊ฐ, 8๊ฐ ์ฒ๋ผ 2๊ฐ๋ผ๋ ์ฌ์ ๋ฅผ ๋์ด ๊ณผ๋ํ ๊ตฌ์กฐ ๋ณํ์ ๋ง์ ์ ์๋ค. ๋ง์ฝ ๋ณํ ๊ธฐ์ค์ด 6๊ฐ , 7๊ฐ ์ด๋ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์
, ์ญ์ ๋๋ ๊ฒฝ์ฐ ๋ถํ์ํ LinkedList โ Tree ๋ณํ์ด ์ผ์ด๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
LinkedList -> Red-Black Tree๋ก ๋ณํ๊ฐ๋ฅํ ์ด์
HashMap์ ๋ฐ์ดํฐ Node ๋ TreeNode ์ ๋ถ๋ชจ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ replacementTreeNode ๋ฉ์๋๋ฅผ ํตํด Node -> TreeNode ๋ก ๋ณํํ ์ ์๋ค.
// replacementTreeNode : HashMap์ ๋ด๋ถ ํจ์
TreeNode<K,V> replacementTreeNode(Node<K,V> p, Node <K,V> next) {
return new TreeNode<>(p.hash, p.key, p.value, next);
}
// ์์ ๊ด๊ณ : TreeNode <- LinkedHashMap.Entry <- HashMap.Node
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
...
}
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
static class Entry<K,V> extends HashMap.Node<K,V> { ... }
}| Open Addressing | Seperate Chaining | |
|---|---|---|
| Worst Case | O(M) | O(M) |
| ์บ์ ํจ์จ | ์ข๋ค (์ฐ์๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ์ข์ง ์๋ค (ํด์ ์ถฉ๋์ LinkedList์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค) |
| ๊ณต๊ฐ ํจ์จ | ์ข๋ค (ํด์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ์๋ probing์ ํตํด ๋น bucket์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ์ข์ง ์๋ค (ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด LinkedList์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋์ง ์๋ bucket์ด ์กด์ฌํ๋ค) |
| Resizing ๋น๋ | ๋๋ค (bucket ์ฌ์ฉ๋ฅ ์ด ๋์ load factor์ ์๊ณ์ ์ ์ฝ๊ฒ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ด๋ค) | Open Addressing ๋ณด๋ค ๋ฎ๋ค (bucket ์ฌ์ฉ๋ฅ ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค) |
hash bucket์ ๊ฐ์๊ฐ ์ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์๋ ์ ์์ง๋ง ํด์ ์ถฉ๋๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์๋ฐ์ HashMap์ load factor๊ฐ ์๊ณ์ (0.75)์ ๋์ด๊ฐ ๊ฒฝ์ฐ์ hash bucket ๊ฐ์๋ฅผ 2๋ฐฐ๋ก ๋๋ฆฐ๋ค.
load factor(์ ์ฌ์จ)
load factor (ฮฑ) = n / k
- n : ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ bucket ์
- k : ์ ์ฒด bucket ์load factor๋ hash table์ ๋ฐ์ดํฐ๊ฐ ์ฐจ์๋ ๋น์จ์ ๋ํ๋ธ๋ค.
- load factor๊ฐ 1์ ๊ฐ๊น์ฐ๋ฉด hash table์ ์ฑ๋ฅ์ด ์ ํ๋๊ณ , ๋๋ฌด ์์ ๊ฐ์ ๊ฐ์ง๋ฉด ๋นํจ์จ์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก hash table resizing์ ํตํด load factor ๋ฅผ ์กฐ์ ํด์ผํ๋ค.
0.6 โค load factor โค 0.75๊ฐ ๋ฐ๋์งํ๋ค.
| HashTable | HashMap |
|---|---|
| JDK 1.0๋ถํฐ ์กด์ฌํ Java API | Java 2์ ์ ๋ณด์ธ Java Collections Framework API |
| ํ์ฌ๊น์ง HashTable์ ๊ตฌํ์ ๋ณํ๊ฐ ๊ฑฐ์ ์๋ค. (ํ์ ํธํ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ๋จ์์๋ค) | ์ง์์ ์ผ๋ก ๊ฐ์ ์ด ์ด๋ค์ง๊ณ ์๋ค. |
| ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. | ๋ณด์กฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด์ ์ถฉ๋์ด HashTable๋ณด๋ค ๋ ๋ฐ์ํ ์ ์๋ค. |
| ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ Thread safe ํ๋ค | ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ Thread safe ํ์ง ์๋ค |
| key๊ฐ์ null์ ์ ์ฅํ ์ ์๋ค | key๊ฐ์ null์ ์ ์ฅํ ์ ์๋ค |
Hashtable์ ์ดํด์ ๊ตฌํ #1
Java HashMap์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
Open Addressing & its Classification to eliminate Collisions
Hashing Initially prepared by Dr lyas iekli improved
What is primary and secondary clustering in hash?
HashMap ํํค์น๊ธฐ 1 (Linked List + Red Black Tree)
Open Addressing vs Seperate Chaining








