μ•Œκ³ λ¦¬μ¦˜/자료ꡬ쑰

2. μ—°κ²° 리슀트 (Linked List)

🐳 Laboon 2024. 2. 4. 13:13
μ—°κ²° λ¦¬μŠ€νŠΈλž€ ?

 

λ¨Όμ €, Listλ₯Ό μƒκ°ν•˜λ©΄ μ­‰ ~ λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” 것이 λ– μ˜€λ₯΄μ‹œλ‚˜μš”?

μ—°κ²° λ¦¬μŠ€νŠΈλŠ” 말 κ·ΈλŒ€λ‘œ μ­‰ ~ λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 데이터λ₯Ό μ„œλ‘œ μ—°κ²°ν•˜κ³  μžˆλŠ” 것이죠.

μ–΄? μ­‰ ~ λ‚˜μ—΄λ˜μ–΄μžˆκ³  μ—°κ²°λ˜μ–΄μžˆλŠ” 것은 'λ°°μ—΄' μ•„λ‹Œκ°€μš”? 

 

λ§žμŠ΅λ‹ˆλ‹€.

자료ꡬ쑰의 기본이자 데이터가 순차적으둜 λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” 것은 λ°°μ—΄μž…λ‹ˆλ‹€.

 

 

그럼 μ—°μ†λœ 데이터λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” λ°°μ—΄(Array)κ°€ μžˆλŠ”λ° μ™œ Linked Listλ₯Ό μ‚¬μš©ν•˜λ‚˜μš”?

 

 

λ°°μ—΄κ³Ό Linked Listμ—λŠ” μ—„μ—°ν•œ 차이가 μžˆμŠ΅λ‹ˆλ‹€.

μ•žμ„  ν¬μŠ€νŒ…μ—μ„œ 각 μžλ£Œκ΅¬μ‘°λŠ” ν•„μš”μ— λ”°λ₯Έ μ‚¬μš©μ²˜κ°€ 있고, μ‚¬μš©μžκ°€ μœ λ™μ μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό 함을 ν‘œν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ°°μ—΄μ΄λΌλŠ” μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄ μ•Œκ³  Linked ListλΌλŠ” μžλ£Œκ΅¬μ‘°μ™€μ˜ 차이점을 μ•Œμ•„μ•Όν•©λ‹ˆλ‹€.

 

차이점을 μ„€λͺ…ν•˜κΈ° μ•žμ„œ 배열에 λŒ€ν•΄ λ”°λ‘œ μž‘μ„±ν•˜μ§€ μ•Šκ³  λ°”λ‘œ Linked List 포슀트λ₯Ό μž‘μ„±ν•˜λŠ” μ΄μœ λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό κ³΅λΆ€ν•˜κ²Œλ˜λ©΄ 배열에 μ–΄λŠ 정도 μ΅μˆ™ν•΄μ Έ μžˆλ‹€κ³  μƒκ°ν•΄μ„œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

제 λΈ”λ‘œκ·Έ JAVA 언어에 λŒ€ν•œ 포슀트( μžλ°” λ°°μ—΄1, μžλ°” λ°°μ—΄2 ) 쀑 에도 μ„€λͺ…이 μž‘μ„±λ˜μ–΄ μžˆκ³ μš”.

 

배열은 μ„œλ‘œ 순차적으둜 μ—°κ²°λ˜μ–΄μžˆμ§€λ§Œ μ—°κ²° λ¦¬μŠ€νŠΈλŠ” 순차적으둜 μ—°κ²°λ˜μ–΄ μžˆμ§€λ§Œ 순차적으둜 μ—°κ²°λ˜μ–΄μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ 상 배열은 데이터듀이 ν•˜λ‚˜μ˜ 묢음 [.............]으둜 λ¬Άμ—¬μžˆμ§€λ§Œ μ—°κ²° λ¦¬μŠ€νŠΈλŠ” 데이터가 μ„œλ‘œ 흩어져 μžˆμŠ΅λ‹ˆλ‹€.

 

μΌμƒμƒν™œ μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” λ…Έλž˜λ°© -> PCλ°© -> μ˜ν™”κ΄€μ„ κ°€κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

μ–΄λŠ ν•œ μž₯μ†Œμ— {λ…Έλž˜λ°©, PCλ°©, μ˜ν™”κ΄€}이 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” ν•΄λ‹Ή μž₯μ†Œμ—μ„œ ν•˜κ³  싢은걸 λ°”λ‘œ 즐길 수 μžˆμŠ΅λ‹ˆλ‹€.

 

그런데 λ…Έλž˜λ°©μ„ κ°”λ‹€κ°€ κ°‘μžκΈ° 볼링μž₯을 κ°€κ³  싢은데 ν•΄λ‹Ή μž₯μ†Œμ—λŠ” 볼링μž₯이 μ—†μŠ΅λ‹ˆλ‹€.

볼링μž₯을 μ΄μš©ν•˜λ €λ©΄ 이 μž₯μ†Œμ— 볼링μž₯을 μ•„μ˜ˆ μƒˆλ‘œ μ„€μΉ˜ν•΄μ•Όν•˜λŠ”λ° 곡간이 λΆ€μ‘±ν•©λ‹ˆλ‹€.

전체 건물을 ν™•μž₯ν•˜κ³  볼링μž₯을 μΆ”κ°€ν•΄μ•Όν•˜μ£ .

 

그런데 ν•œ μž₯μ†Œμ—λ§Œ 머물러 μžˆμ§€ μ•Šκ³  동선을 미리 μ§œλ‘μ—ˆμŠ΅λ‹ˆλ‹€.

A λ…Έλž˜λ°© -> B PCλ°© -> C μ˜ν™”κ΄€

μš°λ¦¬λŠ” A λ…Έλž˜λ°©μ„ κ°”λ‹€κ°€ κ°‘μžκΈ° D 볼링μž₯을 κ°€κ³  μ‹Άμ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

그럼 λ…Έλž˜λ°©μ—μ„œ λ…Έλž˜λ₯Ό λΆ€λ₯΄λ˜ μ€‘μ΄λ‚˜ 마치고 D 볼링μž₯을 동선에 μΆ”κ°€ν•΄μ„œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„κ°€ λ°°μ—΄μ˜ κ°œλ…μ΄κ³  μ•„λž˜κ°€ μ—°κ²° 리슀트의 κ°œλ…μž…λ‹ˆλ‹€. 같은 μž₯μ†Œμ—λŠ” μ—†μ§€λ§Œ 동선에 μΆ”κ°€ν•΄μ„œ 이동할 수 있죠.

μ—°κ²°λ¦¬μŠ€νŠΈλŠ” ν•˜λ‚˜μ˜ 묢음이 μ•„λ‹ˆλΌ λ°©ν–₯μ΄λΌμ„œ μ–Έμ œλ“ μ§€ λ°©ν–₯을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


 

{0, 1, 2, 3, 4, 5} μ΄λΌλŠ” 데이터가 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

탐색 (Search), 5 μ°ΎκΈ°

 

μš°λ¦¬λŠ” λ°°μ—΄μ—μ„œ μ‹œμž‘μœ„μΉ˜(0)λΆ€ν„° λ§ˆμ§€λ§‰ μœ„μΉ˜(5)κΉŒμ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. (Index)

μ‹œμž‘ μœ„μΉ˜λΆ€ν„° λ§ˆμ§€λ§‰ μœ„μΉ˜κΉŒμ§€ for문을 톡해 μ›ν•˜λŠ” 값을 찾을 수 있겠죠?

5λ₯Ό μ°ΎλŠ”λ‹€κ³  ν•˜λ©΄ λκΉŒμ§€ νƒμƒ‰ν•΄μ•Όν•˜λ―€λ‘œ 이것을 μ΅œμ•…μ˜ 경우(Big-O), O(N)이라고 ν•˜μ£ .

 

μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œλŠ” ν˜„μž¬ μœ„μΉ˜(μ£Όμ†Œ)만 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. (Iterator)

μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ Iteratorκ°€ 0을 κ°€λ₯΄ν‚€λŠ”μ§€, 3을 κ°€λ₯΄ν‚€λŠ”μ§€ λ§ˆμ§€λ§‰μ— μˆ˜ν–‰ν–ˆλ˜ 연산을 톡해 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½, Iteratorκ°€ 5의 μ£Όμ†Œλ₯Ό κ°€λ₯΄ν‚€κ³  μžˆλ‹€λ©΄ Ω (1), 0의 μ£Όμ†Œλ₯Ό κ°€λ₯΄ν‚€κ³  μžˆλ‹€λ©΄ O(N)

 

즉, λ‹¨μˆœν•œ 탐색 λ©΄μ—μ„œλŠ” 큰 차이가 μ—†μŠ΅λ‹ˆλ‹€.

 

μ ‘κ·Ό (Access), 6번 μ§Έ 데이터 μ ‘κ·Ό 

 

μš°λ¦¬λŠ” λ°°μ—΄μ—μ„œ μ‹œμž‘μœ„μΉ˜λΆ€ν„° λ§ˆμ§€λ§‰ μœ„μΉ˜κΉŒμ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. (Index)

λ°°μ—΄μ—μ„œ 5λΌλŠ” 값을 찾을 λ•Œ μš°λ¦¬λŠ” 인덱싱(array[5])을 톡해 O(1) λ§Œμ— 데이터에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œλŠ” Index κ°œλ…μ΄ μ—†μ–΄μ„œ 데이터에 접근을 ν•˜κ³  싢어도.. λ°”λ‘œ ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

ν˜„μž¬ μœ„μΉ˜λ§Œ κ°€μ§€κ³  μžˆμœΌλ‹ˆκΉŒμš”.

λ§Œμ•½μ— ν˜„μž¬ μœ„μΉ˜κ°€ '5'λ₯Ό κ°€λ₯΄ν‚€κ³  있고 μ ‘κ·Όν•œλ‹€λ©΄ Ω(1),

ν˜„μž¬ μœ„μΉ˜κ°€ '0'을 κ°€λ₯΄ν‚€κ³  μžˆλ‹€λ©΄ 5κΉŒμ§€ 탐색을 μ§„ν–‰ν•œ 후에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

즉, μ΅œμ•…μ˜ 경우 탐색 μ‹œκ°„μ΄ λ°œμƒν•©λ‹ˆλ‹€.  O(N)

 

접근은 Arrayκ°€ 더 νš¨μœ¨μ μž…λ‹ˆλ‹€.

μ΄μ œλΆ€ν„° Linked List의 μž₯점이 λ‚˜μ˜΅λ‹ˆλ‹€.

 

μ‚½μž… (Insertion), 6 μ‚½μž…

 

Arrayμ—μ„œ 맨 뒀에 값을 μ‚½μž…ν•œλ‹€κ³  해보죠.

κΈ°λ³Έμ μœΌλ‘œλŠ” out of range 였λ₯˜κ°€ λ°œμƒν•  것 μž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” 배열을 μ„ μ–Έν•  λ•Œ, 크기λ₯Ό μ •ν•˜κ³  배열을 ν• λ‹Ήν•˜μ£ ?

array[6] = {0, 1, 2, 3, 4, 5}와 같이 말이죠.

array의 λ§₯μ‹œλ©ˆ 크기가 6으둜 ν• λ‹Ήλ˜μ–΄μ„œ array[6]에 μ ‘κ·Ό ν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€. 

접근을 ν•˜λ”λΌλ„ out of rangeκ°€ λ°œμƒν•˜λŠ” 것이죠.

 

  • ν•΄κ²°μ±…

μ²˜μŒλΆ€ν„° array[100]κ³Ό 같이 μ„ μ–Έν•œλ‹€λ©΄ 곡간이 μΆ©λΆ„ν•˜λ―€λ‘œ λ¬Έμ œλŠ” μ—†μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 곡간을 λ‚­λΉ„ν•˜κ²Œ λœλ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. 또 λͺ¨λ“  λ°μ΄ν„°μ˜ 크기가 100을 μ΄ˆκ³Όν•œλ‹€λ©΄ ? 

 

λ°°μ—΄ 크기 μž¬ν• λ‹Ή

λ°°μ—΄μ˜ 크기 < μ ‘κ·Όν•˜λ €λŠ” 인덱슀 라면, λ°°μ—΄μ˜ 크기λ₯Ό μž¬ν• λ‹Ήν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μž¬ν• λ‹Ήμ„ ν•˜κ²Œ 되면 μ΄μ „μ˜ 데이터가 μ‚¬λΌμ§€λ―€λ‘œ 데이터λ₯Ό 볡사해두고 λ‹€μ‹œ μ „λ‹¬ν•΄μ•Όν•©λ‹ˆλ‹€.

μ‹œκ°„μ„ 맀우 λ‚­λΉ„ν•˜λŠ” ν–‰μœ„μ£ . O(2N) 정도 λ˜κ² λ„€μš”.

 

처음과 쀑간에 μ‚½μž…ν•  λ•Œλ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

array[0]에 값을 λ„£μ—ˆλ‹€λ©΄ 이후에 μžˆλŠ” 값을 λ‹€ ν•œμΉΈμ”© λ’€λ‘œ λ„˜κ²¨μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

array[5] -> array[6], array[4] -> array[5] , ... , array[0] -> array[1], array[0] = 0

즉, O(N)이죠.

 

μ΄λ²ˆμ—” Linked Listμ—μ„œ 맨 뒀에 값을 μ‚½μž…ν•œλ‹€κ³  ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ €, ν˜„μž¬ μœ„μΉ˜(Iterator)만 κ°€μ§€κ³  μžˆμœΌλ―€λ‘œ 맨 λ’€κΉŒμ§€ 탐색을 ν•΄μ•Όν•©λ‹ˆλ‹€...

그런 λ‹€μŒ μ‚½μž…μ„ ν•΄μ•Όμ£ . O(N)μž…λ‹ˆλ‹€.

 

이 λ•Œ κΉŒμ§€λ§Œ 보면, 배열보닀 μ’‹μ€κ²Œ ν•˜λ‚˜λ„ μ—†μ£ ..?

ν•˜μ§€λ§Œ ν˜„μž¬ μœ„μΉ˜ 뒀에 값을 μ‚½μž…ν•œλ‹€λ©΄ O(1)μž…λ‹ˆλ‹€.

ν˜„μž¬ μœ„μΉ˜μ˜ 값은 4이고, λ‹€μŒ μœ„μΉ˜μ˜ 값은 5μž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” 6의 λ‹€μŒ μœ„μΉ˜λ₯Ό 5둜 μ„€μ •ν•˜κ³  4의 λ‹€μŒ μœ„μΉ˜λ₯Ό 5둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 λ•Œ μ‹œκ°„μ€ O(1)이 λ˜λŠ”κ±°μ£ .

 

μœ„ 방식을 μ±„νƒν•˜λ©΄ μ—°κ²°λ¦¬μŠ€νŠΈμ—μ„œλŠ” ν˜„μž¬ μœ„μΉ˜ λ‹€μŒμ— 값을 μ‚½μž…ν•œλ‹€λ©΄ 처음, 쀑간, λ§ˆμ§€λ§‰ μ–΄λŠ 곳에 값을 μ‚½μž…ν•˜λ“  O(1)이 λ©λ‹ˆλ‹€.

 

μ‚­μ œ (Deletion), 5 μ‚­μ œ

 

μ‚½μž…κ³Ό λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

배열은 ν•˜λ‚˜μ˜ 값을 μ‚­μ œν•˜κ²Œ 되면 λΉ„μ–΄μžˆλŠ” 곳을 ν•˜λ‚˜μ”© μ•žλ‹Ήκ²¨μ€˜μ•Όν•˜λ―€λ‘œ O(N)이 λ©λ‹ˆλ‹€.

 

μ—°κ²° λ¦¬μŠ€νŠΈλŠ” κ°€λ₯΄ν‚€λŠ” λ°©ν–₯만 4 -> 5 -> 6 μ—μ„œ 4 -> 6 이 λ˜λ„λ‘ μˆ˜μ •ν•΄μ£Όλ©΄ 되죠.

즉 O(1)이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

 


μ‚¬μš© μš©λ„μ™€ 차이점 정리
  λ°°μ—΄ μ—°κ²° 리슀트
λ³€κ²½ O(1) Ω (1), O(N)
μ ‘κ·Ό O(1) Ω (1), O(N)
탐색 Ω (1), O(N) Ω (1), O(N)
μ‚½μž… O(N) Ω (1)
μ‚­μ œ O(N) Ω (1)

 

λ°°μ—΄ : ν…œν”Œλ¦Ώ 마λƒ₯ 초기 ν˜•νƒœκ°€ κ°–μΆ”μ–΄μ Έμžˆκ³  κ·Έ μ•ˆμ— κ°’ λ³€κ²½λ§Œ λ°œμƒν•˜λŠ” 경우 ( 성적 )

 

μ—°κ²° 리슀트 : 데이터 ꡬ쑰가 λΉˆλ²ˆν•˜κ²Œ λ³€κ²½λ˜λŠ” 경우 ( 에디터 )

포슀트 및 λŒ“κΈ€μ„ μž‘μ„±ν•  λ•Œ, κΈ€μžκ°€ μž‘μ„±λ˜κ³  쀑간 κΈ€μžλ₯Ό μ§€μš°λŠ” ν–‰μœ„