πŸ’» Knowledge/자료ꡬ쑰

Array vs LinkedList νŠΉμ§• & μ„±λŠ₯ 비ꡐ

ming412 2023. 9. 21. 09:54

Array (λ°°μ—΄)

νŠΉμ§•

- 같은 νƒ€μž…μ˜ μ—¬λŸ¬ λ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ 묢음으둜 λ‹€λ£¨λŠ” 자료ꡬ쑰

- 물리적으둜 연속적인 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯되며 크기가 κ³ μ •λ˜μ–΄ μžˆλ‹€.

 

μ‹œκ°„ λ³΅μž‘λ„

μ ‘κ·Ό(Access)

- 배열은 λ¬΄μž‘μœ„ μ ‘κ·Ό(random access)이 κ°€λŠ₯ν•˜λ‹€.

- 인덱슀λ₯Ό μ•Œκ³  μžˆλŠ” 경우 O(1)

 

검색(Search): 순차 접근이라고도 함

- μ„ ν˜• 검색(Linear Search): μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ€ λ°°μ—΄μ—μ„œ νŠΉμ • 값을 μ°ΎλŠ” 경우둜 O(n)

- 이진 검색(Binary Search): μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ • 값을 μ°ΎλŠ” 경우둜 O(log n)

 

μ‚½μž…(Insertion)

- λ°°μ—΄μ˜ μ‹œμž‘에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, 이후 μš”μ†Œλ“€μ„ λͺ¨λ‘ ν•œ μΉΈμ”© λ’€λ‘œ μ΄λ™μ‹œμΌœμ•Ό ν•˜λ―€λ‘œ O(n)

λ°°μ—΄ μ‹œμž‘μ— μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우

- λ°°μ—΄μ˜ μ€‘간에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, 이후 μš”μ†Œλ“€μ„ λͺ¨λ‘ ν•œ μΉΈμ”© λ’€λ‘œ μ΄λ™μ‹œμΌœμ•Ό ν•˜λ―€λ‘œ O(n)

- λ°°μ—΄μ˜ 끝에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, 좔가적인 μš”μ†Œ 이동을 ν•„μš”λ‘œ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— O(1)

    - 동적 λ°°μ—΄μ˜ 경우, 배열이 가득찬 μƒνƒœμ—μ„œ μš”μ†Œκ°€ 좔가될 경우 λ°°μ—΄μ˜ 크기λ₯Ό 두 배둜 늘리고 κΈ°μ‘΄ μš”μ†Œλ“€μ„ 볡사해야 ν•˜λ―€λ‘œ O(n)

 

μ‚­μ œ(Deletion)

- λ°°μ—΄μ˜ μ‹œμž‘ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, 이후 μš”μ†Œλ“€μ„ λͺ¨λ‘ ν•œ μΉΈμ”© μ•žμœΌλ‘œ μ΄λ™μ‹œμΌœμ•Ό ν•˜λ―€λ‘œ O(n)

- λ°°μ—΄μ˜ μ€‘κ°„ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, 이후 μš”μ†Œλ“€μ„ λͺ¨λ‘ ν•œ μΉΈμ”© μ•žμœΌλ‘œ μ΄λ™μ‹œμΌœμ•Ό ν•˜λ―€λ‘œ O(n)

- λ°°μ—΄μ˜ λ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, 좔가적인 μš”μ†Œ 이동을 ν•„μš”λ‘œ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— O(1)

 

LinkedList (μ—°κ²°λ¦¬μŠ€νŠΈ)

νŠΉμ§•

- Array와 λΉ„κ΅ν–ˆμ„ λ•Œ μ‚½μž…/μ‚­μ œ 연산에 효율적인 자료ꡬ쑰

- Arrayκ°€ 물리적으둜 연속적인 곡간에 데이터λ₯Ό μ €μž₯ν•œλ‹€λ©΄, LinkedListλŠ” 비연속적인 곡간에 데이터λ₯Ό μ €μž₯ν•˜κ³  κ·Έ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” ν¬μΈν„°λ‘œ μ—°κ²°ν•΄μ„œ κ΄€λ¦¬ν•œλ‹€.

- μƒˆλ‘œμš΄ μ›μ†Œκ°€ 좔가될 λ•Œλ§ˆλ‹€ λ™μ μœΌλ‘œ 곡간을 ν• λ‹Ήλ°›μ•„ 비연속적인 λ©”λͺ¨λ¦¬ 곡간에 μΆ”κ°€ν•œλ‹€.

- λ°μ΄ν„°μ˜ μ €μž₯ λ‹¨μœ„μΈ λ…Έλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ 있고 각각의 λ…Έλ“œλŠ” "κ°’"κ³Ό "포인터"(λ‹€μŒ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œ)λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

    - "κ°’"은 μ •μˆ˜/μ‹€μˆ˜μ™€ 같은 기초 νƒ€μž…μ΄λ‚˜ 클래슀의 객체가 될 수 μžˆλ‹€.

 

μ‹œκ°„ λ³΅μž‘λ„

μ ‘κ·Ό(Access)

- νŠΉμ • μΈλ±μŠ€μ— μœ„μΉ˜ν•œ μ›μ†Œμ— μ ‘κ·Όν•˜λŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ ν•΄λ‹Ή μœ„μΉ˜λ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

2번째 μΈλ±μŠ€μ— μœ„μΉ˜ν•œ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 경우

 

검색(Search)

- νŠΉμ • κ°’μ˜ λ…Έλ“œλ₯Ό μ°ΎλŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ νŠΉμ • 값을 κ°–λŠ” λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

νŠΉμ • κ°’μ˜ λ…Έλ“œλ₯Ό μ°ΎλŠ” 경우

 

μ‚½μž…(Insertion)

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ‹œμž‘에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, head λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)

μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ‹œμž‘μ— μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ€‘간에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ μ‚½μž…ν•  μœ„μΉ˜μ˜ 이전 λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

    - 단, μ‚½μž… μž‘μ—… μžμ²΄λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)

쀑간에 μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ λμ— μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

    - 이 λ•Œ, μ‹œκ°„λ³΅μž‘λ„λ₯Ό O(n) -> O(1)으둜 κ°œμ„ ν•˜λŠ” 방법? tail 포인터λ₯Ό 두어 λ§ˆμ§€λ§‰ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•œλ‹€.

λ§ˆμ§€λ§‰μ— μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” 경우

 

μ‚­μ œ(Deletion)

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ‹œμž‘ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, head λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)

μ‹œμž‘ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ€‘κ°„ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ μ‚­μ œν•  μœ„μΉ˜μ˜ 이전 λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

    - 단, μ‚­μ œ μž‘μ—… μžμ²΄λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)

- μ—°κ²°λ¦¬μŠ€νŠΈμ˜ λ μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우, μ²˜μŒλΆ€ν„° μˆœνšŒν•˜μ—¬ λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•˜λ―€λ‘œ O(n)

    - 단, μ‚­μ œ μž‘μ—… μžμ²΄λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)

끝 μ›μ†Œλ₯Ό μ‚­μ œν•˜λŠ” 경우

 

Array vs LinkedList

Array

- λΉ λ₯Έ μ ‘κ·Ό: λ¬΄μž‘μœ„ μ ‘κ·Ό(random access)이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ O(1)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ μ›μ†Œμ— 직접 μ ‘κ·Όν•  수 μžˆλ‹€.

- 느린 μ‚½μž… 및 μ‚­μ œ: μ‚½μž…/μ‚­μ œ μ‹œ 데이터λ₯Ό ν•œ μΉΈμ”© λ’€/μ•žμœΌλ‘œ 이동해야 ν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μšΈμ μ΄λ‹€.

- 크기 κ³ μ •: λ°°μ—΄ 생성 μ‹œμ— 크기가 κ²°μ •λ˜λ©° λ³€κ²½ν•˜κΈ° μ–΄λ ΅λ‹€. 크기λ₯Ό λ³€κ²½ν•˜λ €λ©΄ μƒˆ 배열을 ν• λ‹Ήν•˜κ³  κΈ°μ‘΄ 데이터λ₯Ό 볡사해야 ν•œλ‹€.

- 연속적인 λ©”λͺ¨λ¦¬ 곡간 ν•„μš”: 물리적으둜 μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— κ³΅κ°„μ˜ μ œμ•½μ΄ μ‘΄μž¬ν•œλ‹€.

- λ©”λͺ¨λ¦¬ 곡간 νš¨μœ¨μ„±: 각 μš”μ†ŒλŠ” λ™μΌν•œ 크기λ₯Ό κ°€μ§€κ³  있으며 μΆ”κ°€ λ©”λͺ¨λ¦¬ μ˜€λ²„ν—€λ“œκ°€ μ—†λ‹€.

 

Linked List

- λΉ λ₯Έ μ‚½μž… 및 μ‚­μ œ: μ‚½μž…/μ‚­μ œν•  λ…Έλ“œλ₯Ό μ°ΎλŠ” λ°λŠ” O(n)이 걸릴 수 μžˆμ§€λ§Œ, μ‚½μž…/μ‚­μ œ μž‘μ—… μžμ²΄λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ ν¬μΈν„°λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ O(1)이닀.

- 느린 μ ‘κ·Ό: 순차 μ ‘κ·Ό(sequential access)만 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— O(n)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§„λ‹€.

- 동적 크기: 크기λ₯Ό λ™μ μœΌλ‘œ 쑰절 κ°€λŠ₯ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ νš¨μœ¨μ μ΄λ‹€. (λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 λ‚­λΉ„ν•˜μ§€ μ•ŠλŠ”λ‹€.)

- 연속적인 λ©”λͺ¨λ¦¬ 곡간 λΆˆν•„μš”: 물리적으둜 μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ³΅κ°„μ˜ μ œμ•½μ΄ μ—†λ‹€.

- λ©”λͺ¨λ¦¬ 곡간 λΉ„νš¨μœ¨μ„±: 각 λ…Έλ“œλŠ” λ‹€μŒ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό μ €μž₯ν•΄μ•Ό ν•˜λ―€λ‘œ 좔가적인 λ©”λͺ¨λ¦¬κ°€ ν•„μš”ν•˜λ‹€.