Array

κ°€μž₯ 기본적인 자료ꡬ쑰
논리적 μ €μž₯ μˆœμ„œ = 물리적 μ €μž₯ μˆœμ„œ

 

 

인덱슀(index)둜 ν•΄λ‹Ή μ›μ†Œ(element)에 μ ‘κ·Όν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 찾고자 ν•˜λŠ” μ›μ†Œμ˜ 인덱슀 값을 μ•Œκ³  있으면 Big-O(1)에 ν•΄λ‹Ή μ›μ†Œλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€. 즉 random access κ°€ κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점이 μžˆλŠ” 것이닀.

 

ν•˜μ§€λ§Œ μ‚­μ œ λ˜λŠ” μ‚½μž…μ˜ κ³Όμ •μ—μ„œλŠ” ν•΄λ‹Ή μ›μ†Œμ— μ ‘κ·Όν•˜μ—¬ μž‘μ—…μ„ μ™„λ£Œν•œ λ’€(O(1)), 또 ν•œ κ°€μ§€μ˜ μž‘μ—…μ„ μΆ”κ°€μ μœΌλ‘œ ν•΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, μ‹œκ°„μ΄ 더 κ±Έλ¦°λ‹€. λ§Œμ•½ λ°°μ—΄μ˜ μ›μ†Œ 쀑 μ–΄λŠ μ›μ†Œλ₯Ό μ‚­μ œν–ˆλ‹€κ³  ν–ˆμ„ λ•Œ, λ°°μ—΄μ˜ 연속적인 νŠΉμ§•μ΄ κΉ¨μ§€κ²Œ λœλ‹€. 즉 빈 곡간이 μƒκΈ°λŠ” 것이닀. λ”°λΌμ„œ μ‚­μ œν•œ μ›μ†Œλ³΄λ‹€ 큰 인덱슀λ₯Ό κ°–λŠ” μ›μ†Œλ“€μ„ shiftν•΄μ€˜μ•Ό ν•˜λŠ” λΉ„μš©(cost)이 λ°œμƒν•˜κ³  이 경우의 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)κ°€ λœλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Array μžλ£Œκ΅¬μ‘°μ—μ„œ μ‚­μ œ κΈ°λŠ₯에 λŒ€ν•œ time complexity 의 worst case λŠ” O(n)이 λœλ‹€.

 

μ‚½μž…μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. λ§Œμ•½ 첫번째 μžλ¦¬μ— μƒˆλ‘œμš΄ μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ μž ν•œλ‹€λ©΄ λͺ¨λ“  μ›μ†Œλ“€μ˜ 인덱슀λ₯Ό 1 μ”© shift ν•΄μ€˜μ•Ό ν•˜λ―€λ‘œ 이 κ²½μš°λ„ O(n)의 μ‹œκ°„μ„ μš”κ΅¬ν•˜κ²Œ λœλ‹€.

 

 

 

 


 

Linked List

각각의 μ›μ†Œλ“€μ€ 자기 μžμ‹  λ‹€μŒμ— μ–΄λ–€ μ›μ†ŒμΈμ§€λ§Œμ„ κΈ°μ–΅

 

 

자기 λ‹€μŒμ— μ–΄λ–€ μ›μ†ŒμΈμ§€ 기얡해두기 λ•Œλ¬Έμ— κ·Έ λΆ€λΆ„λ§Œ λ‹€λ₯Έ κ°’μœΌλ‘œ λ°”κΏ”μ£Όλ©΄ μ‚­μ œμ™€ μ‚½μž…μ„ O(1) λ§Œμ— ν•΄κ²°κ°€λŠ₯!

 

ν•˜μ§€λ§Œ μ›ν•˜λŠ” μœ„μΉ˜μ— μ‚½μž…μ„ ν•˜κ³ μž ν•˜λ©΄ μ›ν•˜λŠ” μœ„μΉ˜λ₯Ό Search 과정에 μžˆμ–΄μ„œ 첫번째 μ›μ†ŒλΆ€ν„° λ‹€ 확인해봐야 ν•œλ‹€λŠ” 것이닀. Array μ™€λŠ” 달리 논리적 μ €μž₯ μˆœμ„œμ™€ 물리적 μ €μž₯ μˆœμ„œκ°€ μΌμΉ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 이것은 일단 μ‚½μž…ν•˜κ³  μ •λ ¬ν•˜λŠ” 것과 λ§ˆμ°¬κ°€μ§€μ΄λ‹€. 이 κ³Όμ • λ•Œλ¬Έμ—, μ–΄λ– ν•œ μ›μ†Œλ₯Ό μ‚­μ œ λ˜λŠ” μΆ”κ°€ν•˜κ³ μž ν–ˆμ„ λ•Œ, κ·Έ μ›μ†Œλ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ O(n)의 μ‹œκ°„μ΄ μΆ”κ°€μ μœΌλ‘œ λ°œμƒν•˜κ²Œ λœλ‹€.

κ²°κ΅­ linked list μžλ£Œκ΅¬μ‘°λŠ” search 에도 O(n)의 time complexity λ₯Ό κ°–κ³ , μ‚½μž…, μ‚­μ œμ— λŒ€ν•΄μ„œλ„ O(n)의 time complexity λ₯Ό κ°–λŠ”λ‹€. 

 

κ·Έλ ‡μ§€λ§Œ Linked List λŠ” Tree ꡬ쑰의 근간이 λ˜λŠ” 자료ꡬ쑰이며, Tree μ—μ„œ μ‚¬μš©λ˜μ—ˆμ„ λ•Œ κ·Έ μœ μš©μ„±μ΄ λ“œλŸ¬λ‚œλ‹€.

 

 


 

1. 데이터에 λŒ€ν•œ μ ‘κ·Ό 속도 Arrayκ°€ μ’‹λ‹€.

* 배열은 index만 μžˆλ‹€λ©΄ O(1)에 μ ‘κ·Όκ°€λŠ₯
μ—°κ²°λ¦¬μŠ€νŠΈλŠ” μ΅œμ†Œ ν•œ λ²ˆμ€ 리슀트λ₯Ό μˆœνšŒν•˜μ—¬μ•Ό ν•˜λ―€λ‘œ O(n)
2. 데이터 μ‚½μž… 속도 κ²½μš°μ— 따라 λ‹€λ₯΄μ§€λ§Œ μ „λ°˜μ μœΌλ‘œ Linked Listκ°€ λ‚«λ‹€.

* linked listλŠ” μ–΄λŠ 곳에 μ‚½μž…ν•˜λ˜μ§€ O(n)

arrayλŠ” 데이터λ₯Ό μ€‘κ°„μ΄λ‚˜ 맨 μ•žμ— μ‚½μž…ν•  경우 데이터 ν•œμΉΈμ”© 미뀄야 ν•˜κ³  κ³΅κ°„이 λΆ€μ‘±ν•˜λ©΄ realloc() λ˜λŠ” μƒˆλ‘œμ΄ ν• λ‹Ήν•˜μ—¬ λ©”λͺ¨λ¦¬ 곡간 ν™•μž₯ ν•„μš”

λ§Œμ•½ array에 곡간이 많이 λ‚¨μ•„μžˆκ³  맨 끝에 μ‚½μž…ν•œλ‹€λ©΄, array μ‚½μž… 속도 μ—­μ‹œ O(1) κ°€λŠ₯
3. 데이터 μ‚­μ œ 속도 κ²½μš°μ— 따라 λ‹€λ₯΄μ§€λ§Œ μ „λ°˜μ μœΌλ‘œ Linked Listκ°€ λ‚«λ‹€.
κ²°λ‘  μ‚½μž… μ‚­μ œκ°€ 번번히 이루어진닀면, Linked List μ‚¬μš©μ΄ μ’‹μŒ.
이미 λ§Œλ“€μ–΄μ§„ κ΅¬μ‘°μ—μ„œ λ°μ΄ν„°μ˜ μ ‘κ·Όλ§Œ ν•„μš”ν•˜λ©΄ Array이 μ’‹μŒ.

 

 

μ „λ°˜μ μœΌλ‘œ 리슀트의 μ‚¬μš©μ΄ 훨씬 쒋아보인닀.

 

ν•˜μ§€λ§Œ 일반적인 μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό 풀이할 땐 λ¦¬μŠ€νŠΈλ³΄λ‹€ 배열이 훨씬 λΉ λ₯΄κ³  μ’‹λ‹€.

μ™œλƒν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ μ•Œκ³ λ¦¬μ¦˜ μ—°μŠ΅λ¬Έμ œλ“€μ€ κ·Έ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ λ²”μœ„λ₯Ό 주어지기 λ•Œλ¬Έμ— λ°°μ—΄ 선언을 κ·Έ MAX치둜 μž‘μ„ 수 μžˆλ‹€λ©΄, 훨씬 더 νŽΈλ¦¬ν•˜κ³  λ¦¬μŠ€νŠΈμ™€λŠ” μ „ν˜€ λ‹€λ₯Έ 속도λ₯Ό 보인닀.

리슀트의 μž…λ ₯은 μΆ”κ°€ κ³Όμ •λ§ˆλ‹€ λ©”λͺ¨λ¦¬μ˜ 할당이 μΌμ–΄λ‚˜κ³  μ‚­μ œμ—μ„œλŠ” λ©”λͺ¨λ¦¬μ˜ ν•΄μ œκ°€ μΌμ–΄λ‚œλ‹€. λ©”λͺ¨λ¦¬μ˜ ν• λ‹Ήκ³Ό ν•΄μ œλŠ” O() μ‹œκ°„μœΌλ‘œ 따지지 μ•Šμ§€λ§Œ, 이런 μ‹œμŠ€ν…œ 콜(System Call)을 μ‚¬μš©ν•˜λŠ” λ¬Έκ΅¬λŠ” μ‹œκ°„μ†Œμš”κ°€ κ½€ κ±Έλ¦°λ‹€.

 

 

배열이든 λ¦¬μŠ€νŠΈμ΄λ“  λ‹¨μˆœνžˆ 이둠을 λ– λ‚˜μ„œ μžκΈ°κ°€ 무엇을 ν•˜λ €λŠ”μ§€, κ·Έ λͺ©μ μ— 따라 μ„ νƒν•˜λŠ” 것이 μ’‹λ‹€.

 

+ Recent posts