λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

CS/자료ꡬ쑰

[자료ꡬ쑰] ν•΄μ‹œ ν…Œμ΄λΈ”

ν•΄μ‹œ ν…Œμ΄λΈ”μ΄λž€?

  • ν‚€(key)와 κ°’(value)의 쌍으둜 데이터λ₯Ό μ €μž₯ν•˜λŠ” 자료ꡬ쑰.
  • ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œ μ‚½μž…/μ‚­μ œ/탐색 μ‹œ 평균적인 μ‹œκ°„λ³΅μž‘λ„λŠ” O(1)둜, μ–΄λ–€ 값을 찾더라도 ν•œ λ‹¨κ³„λ§Œ μ†Œμš”λœλ‹€.

μ‚¬μš© 사둀

  • κ²€μƒ‰μ΄λ‚˜ μ €μž₯이 λΉˆλ²ˆν•  λ•Œ μ‚¬μš©ν•˜λ©΄ 쒋은데, 특히 μΊμ‹œλ₯Ό κ΅¬ν˜„ν•  λ•Œ ν•΄μ‹œ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μΊμ‹œλŠ” 이전에 κ³„μ‚°λœ κ²°κ³Όλ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜λŠ” μž₯μ†Œλ‘œ, μΊμ‹œμ˜ μ ‘κ·Ό μ‹œκ°„μ— λΉ„ν•΄ μ›λž˜ 데이터λ₯Ό μ ‘κ·Όν•˜λŠ” μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” κ²½μš°λ‚˜ 값을 λ‹€μ‹œ κ³„μ‚°ν•˜λŠ” μ‹œκ°„μ„ μ ˆμ•½ν•˜κ³  싢은 κ²½μš°μ— μ‚¬μš©λœλ‹€.

μž‘λ™ 원리

  • ν•΄μ‹œ ν…Œμ΄λΈ” λ‚΄λΆ€μ—μ„œλŠ” index와 value둜 이루어진 λ°°μ—΄ ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€.
  • ν‚€(key)λ₯Ό ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°°μ—΄μ˜ 인덱슀둜 λ³€ν™˜ν•œ ν›„ ν•΄λ‹Ή μΈλ±μŠ€μ— κ°’(value)을 μ €μž₯ν•œλ‹€.

 

ν•΄μ‹œ ν•¨μˆ˜

  • ν•΄μ‹œ ν…Œμ΄λΈ”μ—μ„œμ˜ ν•΄μ‹œ ν•¨μˆ˜λŠ” μž„μ˜μ˜ 데이터λ₯Ό μ •μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜.
  • 예λ₯Ό λ“€μ–΄, ν•΄μ‹œ ν•¨μˆ˜μ˜ input이 'abc'라면 output이 '1234'κ°€ λ˜λŠ” 것이닀. μ΄λ•Œ λ³€ν™˜λœ κ°’ '1234'κ°€ ν•΄μ‹œμ΄λ‹€.

좜처 : λ…Έλ§ˆλ“œμ½”λ” 유튜브

 

ν•΄μ‹œ 좩돌과 ν•΄κ²° 방법

  • μ„œλ‘œ λ‹€λ₯Έ ν‚€ 값이 λ™μΌν•œ 인덱슀둜 맀핑될 경우 ν•΄μ‹œ 좩돌(hash collision)이 λ°œμƒν•˜μ—¬ ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ μ„±λŠ₯을 λ–¨μ–΄νŠΈλ¦°λ‹€.
  • 이λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œ λΆ„리 연결법(seperate chaining), 개방 μ£Όμ†Œλ²•(open addressing)이 μžˆλ‹€.

1. 뢄리 연결법(seperate chaining)

  • ν•΄μ‹œ ν…Œμ΄λΈ” 각각의 곡간을 버킷(bucket)이라고 ν•œλ‹€.
  • 각 버킷에 λŒ€μ‘ν•˜λŠ” μ—°κ²° 리슀트λ₯Ό μƒμ„±ν•˜κ³ , 버킷이 μ—°κ²° 리슀트의 κ°€μž₯ μ•ž λ…Έλ“œλ₯Ό λ°”λΌλ³΄κ²Œλ” ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 방법이닀.
  • ν•΄μ‹œ 좩돌이 λ°œμƒν–ˆμ„ λ•Œ κ·Έμ € 같은 버킷 μ—°κ²° 리슀트의 λ§ˆμ§€λ§‰ λ…Έλ“œλ‘œ ν•΄λ‹Ή 값을 μΆ”κ°€ν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

좜처 : λ…Έλ§ˆλ“œμ½”λ” 유튜브

 

2. 개방 μ£Όμ†Œλ²•(open addressing)

  • ν•œ λ²„ν‚·μ—λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ μ €μž₯ν•˜κ³ , 좩돌이 λ°œμƒν•˜λ©΄ λ‹€λ₯Έ 빈 버킷에 μ €μž₯ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 방법이닀.
  • μ €μž₯ν•  λ‹€μŒ 버킷을 μ°ΎλŠ” λ°©λ²•μœΌλ‘œ μ„ ν˜• 탐사법(linear probing), 제곱 탐사법(quadratic probing), 이쀑 ν•΄μ‹±(double hashing)이 μžˆλ‹€.
  • μ„ ν˜• 탐사법은 λ§κ·ΈλŒ€λ‘œ 순차적으둜 빈 버킷을 μ°ΎλŠ” 방법이닀.

 

+) JS의 Object, Map, Set은 ν•΄μ‹œ ν…Œμ΄λΈ”μΌκΉŒ?

  • λ§Žμ€ λ ˆνΌλŸ°μŠ€λ“€μ„ 보면 JS의 Object, Map, Set이 ν•΄μ‹œ ν…Œμ΄λΈ”μ΄λΌκ³  μ΄μ•ΌκΈ°ν•˜λŠ”λ° μ—„λ°€νžˆ μ΄μ•ΌκΈ°ν•˜μžλ©΄ μ•„λ‹ˆλ‹€.

JS Object λŠ” ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ μ•„λ‹ˆλ‹€

  • V8 엔진을 ν¬ν•¨ν•œ λŒ€λΆ€λΆ„μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 높은 μ„±λŠ₯을 μœ„ν•΄ ν•΄μ‹œ ν…Œμ΄λΈ”κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ ν•΄μ‹œ ν…Œμ΄λΈ”λ³΄λ‹€ λ‚˜μ€ λ°©λ²•μœΌλ‘œ Objectλ₯Ό κ΅¬ν˜„ν•œλ‹€.
  • Object도 ν‚€-κ°’ 쌍의 데이터 μ§‘ν•©μ΄λΌλŠ” 점은 κ°™μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 Objectλ₯Ό ν•΄μ‹œ ν…Œμ΄λΈ”μ˜ μ›λ¦¬λ‘œ μ‹€ν–‰ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ μ•„λ‹ˆλ‹€.

JS Map, Set 은 ν•΄μ‹œ ν…Œμ΄λΈ”μ΄ μ•„λ‹ˆλ‹€

The specification requires maps to be implemented "that, on average, provide access times that are sublinear on the number of elements in the collection". Therefore, it could be represented internally as a hash table (with O(1) lookup), a search tree (with O(log(N)) lookup), or any other data structure, as long as the complexity is better than O(N).

The specification requires sets to be implemented "that, on average, provide access times that are sublinear on the number of elements in the collection". Therefore, it could be represented internally as a hash table (with O(1) lookup), a search tree (with O(log(N)) lookup), or any other data structure, as long as the complexity is better than O(N).

  • Map, Set의 MDN λ¬Έμ„œλ₯Ό 보면 ECMAScript λͺ…μ„Έμ—μ„œλŠ” Mapκ³Ό Set이 λ³΅μž‘λ„κ°€ μ„ ν˜•μ‹œκ°„λ³΄λ‹€ λΉ λ₯Έ 자료ꡬ쑰둜 κ΅¬ν˜„λ  수 μžˆλ‹€κ³  λ‚˜μ™€μžˆλ‹€.
  • 즉, JS 엔진이 Map, Set을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν–ˆλŠ”μ§€μ— λ‹¬λ €μžˆμœΌλ©° λ°˜λ“œμ‹œ ν•΄μ‹œ ν…Œμ΄λΈ”λ‘œ λ™μž‘ν•œλ‹€κ³  말할 μˆ˜λŠ” μ—†λ‹€.
  • V8의 Map, Set의 데이터 접근에 λŒ€ν•œ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(1)이기 λ•Œλ¬Έμ— ν•΄μ‹œν…Œμ΄λΈ”κ³Ό λΉ„μŠ·ν•˜λ‹€κ³  μ—¬κ²¨μ§€λŠ” 것일 뿐이닀.

 

μ°Έκ³