Design-loving front-end engineer
Ryong
Design-loving front-end engineer
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
    • Framework
    • React
      • Concept
      • Library
      • Hook
      • Component
      • Test
    • NodeJS
    • Android
      • Concept
      • Code
      • Sunflower
      • Etc
    • Flutter
      • Concept
      • Package
    • Web
    • Web
    • CSS
    • Language
    • JavaScript
    • TypeScript
    • Kotlin
    • Dart
    • Algorithm
    • Data Structure
    • Programmers
    • Management
    • Git
    • Editor
    • VSCode
    • Knowledge
    • Voice
Design-loving front-end engineer

Ryong

ํ•ด์‹œ
Data Structure

ํ•ด์‹œ

2022. 1. 11. 23:01

ํ•ด์‹œ๋ฒ•

๐Ÿ’ฌ  ํ•ด์‹œ๋ฒ•์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์œ„์น˜๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ฒ€์ƒ‰๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€, ์‚ญ์ œ๋„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ฌ  ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

๐Ÿ’ฌ  ๋ฐฐ์—ด์˜ ํ‚ค ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์š”์†Ÿ์ˆ˜ 13์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋กœ ๋‹ค์‹œ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋กœ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ‚ค ๊ฐ’๊ณผ ํ•ด์‹œ ๊ฐ’์˜ ๋Œ€์‘

๐Ÿ’ฌ  ์ด๋ ‡๊ฒŒ ํ‘œ์— ์ •๋ฆฌํ•œ ๊ฐ’์„ ํ•ด์‹œ ๊ฐ’์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ํ•ด์‹œ ๊ฐ’์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ฌ  ํ•ด์‹œ ๊ฐ’์ด ์ธ๋ฑ์Šค๊ฐ€ ๋˜๋„๋ก ์›๋ž˜์˜ ํ‚ค ๊ฐ’์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์ด ์•„๋ž˜์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋‹ค.

ํ•ด์‹œ์— ์ƒˆ๋กœ์šด ๊ฐ’(35)์„ ์ถ”๊ฐ€

๐Ÿ’ฌ  ์ด์ œ ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด ๊ฐ’ 35๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ๋‹ค๋ฅธ ๋ฐฐ์—ด ์š”์†Œ๋“ค์„ ๋’ค๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๐Ÿ’ฌ  ์ด์™€ ๊ฐ™์ด ํ‚ค ๊ฐ’(35)๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ด์‹œ ๊ฐ’(9)๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜๋ฉฐ, ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋ฒ„ํ‚ท์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์ถฉ๋Œ

๐Ÿ’ฌ  ์ƒˆ๋กœ์šด ๊ฐ’ 18์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

๐Ÿ’ฌ  18์„ 13์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ 5์ด๋ฏ€๋กœ ์ €์žฅํ•  ๋ฒ„ํ‚ท์˜ ์ธ๋ฑ์Šค๋Š” 5์ด๋‹ค.

๐Ÿ’ฌ  ํ•˜์ง€๋งŒ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ‚ค ๊ฐ’๊ณผ ํ•ด์‹œ ๊ฐ’์˜ ๋Œ€์‘ ๊ด€๊ณ„๊ฐ€ ๋ฐ˜๋“œ์‹œ 1:1์€ ์•„๋‹์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅํ•  ๋ฒ„ํ‚ท์ด ์ค‘๋ณต๋˜๋Š” ์ถฉ๋Œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

ํ•ด์‹œ์ด ์ถ”๊ฐ€ํ•  ๋•Œ์˜ ์ถฉ๋Œ

๐Ÿ’ฌ  ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•˜๊ธฐ ์œ„ํ•œ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

    โ—ฝ  ์ฒด์ธ๋ฒ• : ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ–๋Š” ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

    โ—ฝ  ์˜คํ”ˆ ์ฃผ์†Œ๋ฒ• : ๋นˆ ๋ฒ„ํ‚ท์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ํ•ด์‹œ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ฒด์ธ๋ฒ•

๐Ÿ’ฌ  ์ฒด์ธ๋ฒ•์€ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‡ ์‚ฌ์Šฌ ๋ชจ์–‘์œผ๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์˜คํ”ˆ ํ•ด์‹œ๋ฒ•์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

๐Ÿ’ฌ  ๋ฐฐ์—ด์˜ ๊ฐ ๋ฒ„ํ‚ท์— ์ €์žฅํ•˜๋Š” ๊ฐ’์€ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๋‹ค.

 

๋ฒ„ํ‚ท์šฉ ํด๋ž˜์Šค Node<K, V>

public class ChainHash<K, V> {
  // ํ•ด์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ
  class Node<K, V> {
    private K key;            // ํ‚ค ๊ฐ’
    private V data;           // ๋ฐ์ดํ„ฐ
    private Node<K, V> next;  // ์ฒด์ธ์˜ ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ
    
    // ์ƒ์„ฑ์ž
    Node(K key, V data, Node<K, V> next) {
      this.key = key;
      this.data = data;
      this.next = next;
    }
    
    // ํ‚ค ๊ฐ’์„ ๋ฐ˜ํ™˜
    K getKey() {
      return key;
    }
    
    // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
    V getValue() {
      return data;
    }
    
    // ํ‚ค์˜ ํ•ด์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜
    public int hashCode() {
      return key.hashCode();
    }
  }
  
  ...

๐Ÿ’ฌ  ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค Node<K, V>๊ฐ€ ์ „๋‹ฌ๋ฐ›๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜•์€ ํ‚ค ๊ฐ’์˜ ์ž๋ฃŒํ˜• K์™€ ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒํ˜• V์ด๋‹ค.

๐Ÿ’ฌ  ํ•„๋“œ next์— ๋Œ€์ž…๋˜๋Š” ๊ฐ’์€ ์ฒด์ธ์— ์žˆ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๋‹ค.

 

์ƒ์„ฑ์ž ChainHash

private int size;            // ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ
private Node<K, V>[] table;  // ํ•ด์‹œ ํ…Œ์ด๋ธ”

// ์ƒ์„ฑ์ž
public ChainHash(int capacity) {
  try {
    table = new Node[capacity];
    this.size = capacity;
  } catch (OutOfMemoryError e) {
    this.size = 0;
  }
}

// ํ•ด์‹œ ๊ฐ’์„ ๊ตฌํ•จ
public int hashValue(Object key) {
  return key.hashCode() % size;
}

๐Ÿ’ฌ  ํด๋ž˜์Šค ChainHash<K, V> ์ƒ์„ฑ์ž๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ์šฉ๋Ÿ‰(capacity)๋งŒํผ ๋น„์–ด ์žˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.

๐Ÿ’ฌ  ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ ์งํ›„ ๋ฐฐ์—ด table์˜ ๋ชจ๋“  ์š”์†Œ๋Š” null์„ ์ฐธ์กฐํ•œ๋‹ค.

๐Ÿ’ฌ  ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด์— ์‹คํŒจํ•˜๋ฉด(OutOfMemoryError) size์— 0์„ ๋„ฃ๋Š”๋‹ค.

 

ํ‚ค ๊ฐ’์œผ๋กœ ์š”์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” search ๋ฉ”์„œ๋“œ

// ํ‚ค ๊ฐ’ key๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ๊ฒ€์ƒ‰ (๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜)
public V search(K key) {
  int hash = hashValue(key);   // ๊ฒ€์ƒ‰ํ•  ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ๊ฐ’
  Node<K, V> p = table[hash];  // ์„ ํƒ ๋…ธ๋“œ
  
  while (p != null) {
    if (p.getKey().equals(key))
      return p.getValue();     // ๊ฒ€์ƒ‰ ์„ฑ๊ณต
    p = p.next;                // ๋‹ค์Œ ๋…ธ๋“œ์— ์ฃผ๋ชฉ
  }
  return null;                 // ๊ฒ€์ƒ‰ ์‹คํŒจ
}

๐Ÿ’ฌ  ์•Œ๊ณ ๋ฆฌ์ฆ˜

    โ—ป  ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ‚ค ๊ฐ’์„ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

    โ—ป  ํ•ด์‹œ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” ๋ฒ„ํ‚ท์„ ์„ ํƒํ•œ๋‹ค.

    โ—ป  ์„ ํƒํ•œ ๋ฒ„ํ‚ท์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

    โ—ป  ํ‚ค ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๊ฒ€์ƒ‰ ์„ฑ๊ณต์ด๋ฉฐ, ๋๊นŒ์ง€ ์Šค์บ”ํ•˜์—ฌ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๊ฒ€์ƒ‰ ์‹คํŒจ์ด๋‹ค.

 

์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Add ๋ฉ”์„œ๋“œ

// ํ‚ค ๊ฐ’ key, ๋ฐ์ดํ„ฐ data๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ์ถ”๊ฐ€
public int add(K key, V data) {
  int hash = hashValue(key);     // ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ๊ฐ’
  Node<K, V> p = table[hash];    // ์„ ํƒ ๋…ธ๋“œ
  
  while (p != null) {
    if (p.getKey().equals(key))  // ์ด ํ‚ค ๊ฐ’์€ ์ด๋ฏธ ๋“ฑ๋ก๋จ
      return 1;
    p = p.next;                  // ๋‹ค์Œ ๋…ธ๋“œ์— ์ฃผ๋ชฉ
  }
  Node<K, V> temp = new Node<K, V>(key, data, table[hash]);
  table[hash] = temp;            // ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…
  return 0;
}

๐Ÿ’ฌ  ์•Œ๊ณ ๋ฆฌ์ฆ˜

    โ—ป  ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ‚ค ๊ฐ’์„ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

    โ—ป  ํ•ด์‹œ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” ๋ฒ„ํ‚ท์„ ์„ ํƒํ•œ๋‹ค.

    โ—ป  ๋ฒ„ํ‚ท์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

    โ—ป  ํ‚ค ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ํ‚ค ๊ฐ’์ด ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ์ถ”๊ฐ€์— ์‹คํŒจํ•œ๋‹ค.

    โ—ป  ๋๊นŒ์ง€ ์Šค์บ”ํ•˜์—ฌ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž ์œ„์น˜์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

๐Ÿ’ฌ  ๋‹ค์Œ์€ ํ‚ค ๊ฐ’ 13๊ณผ 46์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

 

์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” remove ๋ฉ”์„œ๋“œ

// ํ‚ค ๊ฐ’ key๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ์‚ญ์ œ
public int remove(K key) {
  int hash = hashValue(key);       // ์‚ญ์ œํ•  ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ๊ฐ’
  Node<K, V> p = table[hash];      // ์„ ํƒ ๋…ธ๋“œ
  Node<K, V> pp = null;            // ๋ฐ”๋กœ ์•ž์˜ ์„ ํƒ ๋…ธ๋“œ
  
  while (p != null) {
    if (p.getKey().equals(key)) {  // ์ฐพ์œผ๋ฉด
      if (pp == null)
        table[hash] = p.next;
      else
        pp.next = p.next;
      return 0;
    }
    pp = p;
    p = p.next;                    // ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  }
  return 1;                        // ๊ทธ ํ‚ค ๊ฐ’์€ ์—†๋‹ค.
}

๐Ÿ’ฌ  ์•Œ๊ณ ๋ฆฌ์ฆ˜

    โ—ป  ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ‚ค ๊ฐ’์„ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

    โ—ป  ํ•ด์‹œ ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” ๋ฒ„ํ‚ท์„ ์„ ํƒํ•œ๋‹ค.

    โ—ป  ๋ฒ„ํ‚ท์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

    โ—ป  ํ‚ค ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ญ์ œ์— ์‹คํŒจํ•œ๋‹ค.

 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” dump ๋ฉ”์„œ๋“œ

// ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋คํ”„
public void dump() {
  for (int i = 0; i < size; i++) {
    Node<K, V> p = table[i];
    System.out.printf("%02d  ", i);
    while (p != null) {
      System.out.printf("-> %s (%s)  ", p.getKey(), p.getValue());
      p = p.next;
    }
    System.out.println();
  }
}

๐Ÿ’ฌ  ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ๋‹ค์Œ์— ์˜ค๋Š” ๋…ธ๋“œ๋ฅผ ๋Œ์–ด๋‹น๊ธฐ๋ฉด์„œ ๊ฐ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์˜คํ”ˆ ์ฃผ์†Œ๋ฒ•

๐Ÿ’ฌ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฆฌํ•ด์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋น„์–ด ์žˆ๋Š” ๋ฒ„ํ‚ท์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๋‹ซํžŒ ํ•ด์‹œ๋ฒ•์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

public class OpenHash<K, V> {
  // ๋ฒ„ํ‚ท์˜ ์ƒํƒœ
  enum Status {OCCUPIED, EMPTY, DELETED};  // {๋ฐ์ดํ„ฐ ์ €์žฅ, ๋น„์–ด ์žˆ์Œ, ์‚ญ์ œ ๋งˆ์นจ}
  
  // ๋ฒ„ํ‚ท
  static class Bucket<K, V> {
    private K key;          // ํ‚ค ๊ฐ’
    private V data;         // ๋ฐ์ดํ„ฐ
    private Status stat;    // ์ƒํƒœ
    
    // ์ƒ์„ฑ์ž
    Bucket() {
      stat = Status.EMPTY;  // ๋ฒ„ํ‚ท์€ ๋น„์–ด ์žˆ์Œ
    }
    
    // ๋ชจ๋“  ํ•„๋“œ์— ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.
    void set(K key, V data, Status stat) {
      this.key = key;      // ํ‚ค ๊ฐ’
      this.data = data;    // ๋ฐ์ดํ„ฐ
      this.stat = stat;    // ์ƒํƒœ
    }
    
    // ์ƒํƒœ๋ฅผ ์„ค์ •
    void setStat(Status stat) {
      this.stat = stat;
    }
    
    // ํ‚ค ๊ฐ’์„ ๋ฐ˜ํ™˜
    K getKey() {
      return key;
    }
    
    // ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
    V getValue() {
      return data;
    }
    
    // ํ‚ค์˜ ํ•ด์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜
    public int hashCode() {
      return key.hashCode();
    }
  }
  
  private int size;                // ํ•ด์‹œ ํ…Œ์ด๋ธ” ํฌ๊ธฐ
  private Bucket<K, V>[] table;    // ํ•ด์‹œ ํ…Œ์ด๋ธ”
  
  // ์ƒ์„ฑ์ž
  public OpenHash(int size) {
    try {
      table = new Bucket[size];
      for (int i = 0; i < size; i++) {
        table[i] = new Bucket<K, V>();
      this.size = size;
    } catch (OutOfMemoryError e) {  // ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Œ
      this.size = 0;
    }
  }
  
  // ํ•ด์‹œ ๊ฐ’์„ ๊ตฌํ•จ
  public int hashValue(Object key) {
    return key.hashCode() % size;
  }
  
  // ์žฌํ•ด์‹œ ๊ฐ’์„ ๊ตฌํ•จ
  public int rehashValue(int hash) {
    return (hash + 1) % size;
  }
  
  // ํ‚ค ๊ฐ’ key๋ฅผ ๊ฐ–๋Š” ๋ฒ„ํ‚ท์˜ ๊ฒ€์ƒ‰
  private Bucket<K, V> searchNode(K key) {
    int hash = hashValue(key);     // ๊ฒ€์ƒ‰ํ•  ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ๊ฐ’
    Bucket<K, V> p = table[hash];  // ์„ ํƒ ๋ฒ„ํ‚ท
    
    for (int i = 0; p.stat != Status.EMPTY && i < size; i++) {
      if (p.stat == Status.OCCUPIED && p.getKey().equals(key))
        return p;
      hash = rehashValue(hash);    // ์žฌํ•ด์‹œ
      p = table[hash];
    }
    return null;
  }
  
  // ํ‚ค ๊ฐ’ key๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ๊ฒ€์ƒ‰ (๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜)
  public V search(K key) {
    Bucket<K, V> p = searchNode(key);
    if (p != null)
      return p.getValue();
    else
      return null;
  }
  
  // ํ‚ค ๊ฐ’ key, ๋ฐ์ดํ„ฐ data๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ์ถ”๊ฐ€
  public int add(K key, V data) {
    if (search(key) != null)
      return 1;                      // ์ด ํ‚ค ๊ฐ’์€ ์ด๋ฏธ ๋“ฑ๋ก๋จ
       
    int hash = hashValue(key);       // ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ์˜ ํ•ด์‹œ ๊ฐ’
    Bucket<K, V> p = table[hash];    // ์„ ํƒ ๋ฒ„ํ‚ท
    for (int i = 0; i < size; i++) {
      if (p.stat == Status.EMPTY || p.stat == Status.DELETED) {
        p.set(key, data, Status.OCCUPIED);
        return 0;
      }
      hash = rehashValue(hash);      // ์žฌํ•ด์‹œ
      p = table[hash];
    }
    return 2;                        // ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๊ฐ€๋“ ์ฐธ
  }
  
  // ํ‚ค ๊ฐ’ key๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์˜ ์‚ญ์ œ
  public int remove(K key) {
    Bucket<K, V> p = searchNode(key);    // ์„ ํƒ ๋ฒ„ํ‚ท
    if (p == null)
      return 1;                          // ์ด ํ‚ค ๊ฐ’์€ ๋“ฑ๋ก๋˜์ง€ ์•Š์Œ
    
    p.setStat(Status.DELETED);
    return 0;
  }
  
  // ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋คํ”„
  public void dump() {
    for (int i = 0; i < size; i++) {
      System.out.printf("%02d  ", i);
      switch (table[i].stat) {
        case OCCUPIED:
          System.out.printf("%s (%s)\n",
                         table[i].getKey(), table[i].getValue());
          break;
          
        case EMPTY:
          System.out.println("-- ๋ฏธ๋“ฑ๋ก --"); break;
        
        case DELETED:
          System.out.println("-- ์‚ญ์ œ ๋งˆ์นจ --"); break;
      }
    }
  }
}

์š”์†Œ ์‚ฝ์ž…

๐Ÿ’ฌ  ๋‹ค์Œ์€ ์ƒˆ๋กœ์šด ๊ฐ’ 18์„ ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ, ์ด๋•Œ ๋ฆฌํ•ด์‹œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

๐Ÿ’ฌ  ๋ฆฌํ•ด์‹œํ•  ๋•Œ์˜ ํ•ด์‹œ ๋ฉ”์„œ๋“œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์˜ˆ์ œ์—์„œ๋Š” ํ‚ค ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์„ 13์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋กœ ํ•˜์ž.

๐Ÿ’ฌ  ์œ„์™€ ๊ฐ™์ด ๋นˆ ๋ฒ„ํ‚ท์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์žฌํ•ด์‹œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ ์„ ํ˜• ํƒ์‚ฌ๋ฒ•์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

 

์š”์†Œ ์‚ญ์ œ

๐Ÿ’ฌ  ์ธ๋ฑ์Šค๊ฐ€ 5์ธ ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

๐Ÿ’ฌ  ์˜คํ”ˆ ์ฃผ์†Œ๋ฒ•์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์†์„ฑ์„ ๋ถ€์—ฌํ•˜์—ฌ ์ƒํƒœ ๊ฐ’์„ ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค.

    โ—ป  ๋ฐ์ดํ„ฐ ์ €์žฅ ์†์„ฑ๊ฐ’

    โ—ป  ๋น„์–ด ์žˆ์Œ ์†์„ฑ๊ฐ’(-)

    โ—ป  ์‚ญ์ œ ๋งˆ์นจ ์†์„ฑ๊ฐ’(โ˜…)

๐Ÿ’ฌ  ๋”ฐ๋ผ์„œ 5๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 5๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๊ณณ์— ์‚ญ์ œ๋ฅผ ๋งˆ์ณค๋‹ค๋Š” ์ƒํƒœ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

์š”์†Œ ๊ฒ€์ƒ‰

๐Ÿ’ฌ  17์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด์‹œ ๊ฐ’์ด 4์ธ ๋ฒ„ํ‚ท์ด ๋น„์–ด ์žˆ์Œ์ด๋ฏ€๋กœ ๊ฒ€์ƒ‰ ์‹คํŒจ์ด๋‹ค.

๐Ÿ’ฌ  18์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด์‹œ ๊ฐ’์ด 5์ธ ๋ฒ„ํ‚ท์ด ์‚ญ์ œ ๋งˆ์นจ์ด๋ฏ€๋กœ ๋ฆฌํ•ด์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, 6์ธ ๋ฒ„ํ‚ท์—๋Š” 6์ด ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌํ•ด์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , 7์ธ ๋ฒ„ํ‚ท์—์„œ ์›ํ•˜๋Š” ๊ฐ’ 18์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Data Structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํŠธ๋ฆฌ  (0) 2022.01.03
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ  (0) 2021.12.20
๋ฌธ์ž์—ด ๊ฒ€์ƒ‰  (0) 2021.12.14
๋ฐฐ์—ด๋กœ ์ง‘ํ•ฉ ๋งŒ๋“ค๊ธฐ  (0) 2021.12.13
์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜  (0) 2021.11.30
    'Data Structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ํŠธ๋ฆฌ
    • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
    • ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰
    • ๋ฐฐ์—ด๋กœ ์ง‘ํ•ฉ ๋งŒ๋“ค๊ธฐ
    Design-loving front-end engineer
    Design-loving front-end engineer
    ๋””์ž์ธ์— ๊ด€์‹ฌ์ด ๋งŽ์€ ๋ชจ๋ฐ”์ผ ์•ฑ ์—”์ง€๋‹ˆ์–ด Ryong์ž…๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”