๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Coding Interview University] ํ•ด์‹œํ…Œ์ด๋ธ” : ์ด๋ก  ๋ฐ ๊ตฌํ˜„ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ/Computer Science

[Coding Interview University] ํ•ด์‹œํ…Œ์ด๋ธ” : ์ด๋ก  ๋ฐ ๊ตฌํ˜„

์ง•์ง•์•ŒํŒŒ์นด 2023. 7. 5. 01:25
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ์ฝ”๋”ฉ์ธํ„ฐ๋ทฐ๋Œ€ํ•™ ๋‹˜์˜ Git๊ณผ ์„œ์ ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

 

๐Ÿซง ํ•ด์‹œํ…Œ์ด๋ธ” (hash table)

: ํšจ์œจ์ ์ธ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ์„œ, key๋ฅผ value ์— ๋Œ€์‘์‹œํ‚ด

: ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) // n์€ ํ‚ค์˜ ๊ฐœ์ˆ˜

: ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(1)

 

๐Ÿซง ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ํ•ด์‹œ ์ฝ”๋“œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„

1) ํ‚ค์˜ ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ

  • ํ‚ค์˜ ์ž๋ฃŒํ˜•์€ ๋ณดํ†ต int or long
  • ํ‚ค์˜ ๊ฐœ์ˆ˜ ๋ฌดํ•œ (int ๋Š” ์œ ํ•œ)

2) hash(key) % array_length ๋ฐฉ์‹์œผ๋กœ ํ•ด์‹œ ์ฝ”๋“œ ์ด์šฉํ•ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๊ตฌํ•จ

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Œ

3) ๋ฐฐ์—ด์˜ ๊ฐ ์ธ๋ฑ์Šค์—๋Š” ํ‚ค์™€ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์กด์žฌ

  • ํ‚ค์™€ ๊ฐ’์„ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ €์žฅ (๋ฐ˜๋“œ์‹œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ด์šฉ!)
  • ๐Ÿ’ฅ ์ถฉ๋Œ : ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ‚ค๊ฐ€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฑฐ๋‚˜, ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ

⇒ ํ‚ค์— ์ƒ์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„๋ฅผ ๋ฐ˜๋ณต!

⇒ ์ฃผ์–ด์ง„ ํ‚ค๋กœ๋ถ€ํ„ฐ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐ, ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์ธ๋ฑ์Šค ๊ณ„์‚ฐ, ํ•ด๋‹น ํ‚ค์— ์ƒ์‘ํ•˜๋Š” ๊ฐ’์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ํƒ์ƒ‰

๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ (balanced binary search tree)
: ํƒ์ƒ‰ ์‹œ๊ฐ„์€ O(logN)
: ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐฐ์—ด์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด ๋†“์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์€ ๊ณต๊ฐ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
: ํ‚ค์˜ ์ง‘ํ•ฉ์„ ํŠน์ • ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

๐Ÿซง ํ•ด์‹œํ…Œ์ด๋ธ” ๊ตฌํ˜„ํ•˜๊ธฐ

Linear probing์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

class Node:
    def __init__(self, key, value, next):
        self.key = key
        self.value = value
        self.next = next

โžก๏ธ hash(k, m) - m์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ

// map์˜ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefined

โžก๏ธ add(key, value) - ํ‚ค๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

Hashtable ht = new Hashtable();
ht.Add("irina", "Irina SP");
ht.Add("tom", "Tom Cr");

if (ht.Contains("tom"))
{
    Console.WriteLine(ht["tom"]);
}

โžก๏ธ exists(key)

map์— ํ•ด๋‹น key์˜ value ์กด์žฌ ์—ฌ๋ถ€: has(key)
map.has(str); // true
map.has(obj); // true
map.has('none'); // falsemap์˜ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefinedmap์˜ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefined

โžก๏ธ get(key)

  • Map ๊ฐ์ฒด๋Š” key-value๋กœ ์ด๋ฃจ์–ด์ง„ ํ•ด์‹œํ…Œ์ด๋ธ”
    • set(): key-value pair๋ฅผ map์— ์‚ฝ์ž…
    • get(): key๊ฐ’์œผ๋กœ value๋ฅผ ์ฐพ์•„ ๋ฆฌํ„ด
    • key์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•์€ number, string, function, object, NaN ๋“ฑ์ด ๊ฐ€๋Šฅ
    let number = 0;
    let str = 'string';
    let obj = { a: 1 };
    let func = () => {
        console.log('func');
    };
    
    map.set(number, 4); //key์— number ๊ฐ€๋Šฅ
    map.set(str, 1); // key์— string ๊ฐ€๋Šฅ
    map.set(obj, 2); //key์— object ๊ฐ€๋Šฅ
    map.set(func, 3); // key์— ํ•จ์ˆ˜ ๊ฐ€๋Šฅ
    map.set(number, 0); // ๋ฎ์–ด์“ฐ๊ธฐ ๊ฐ€๋Šฅ
    
    console.log(map); // Map(4) {0 => 0, "string" => 1, {…} => 2, ƒunc => 3}
    
    map.get(str); // 1
    map.get(obj); // 2
    map.get('none'); // undefined  
    map.get({ a: 1 }); // undefined, obj !== { a: 1 }
    

โžก๏ธ remove(key)

using System;
using System.Collections;
public class SamplesHashtable
{

   public static void Main()
   {
      // Creates and initializes a new Hashtable.
      var myHT = new Hashtable();
      myHT.Add("1a", "The");
      myHT.Add("1b", "quick");

      // Removes the element with the key "3b".
      myHT.Remove("3b");

   }
}

 

728x90
๋ฐ˜์‘ํ˜•
Comments