본문 바로가기
카테고리 없음

Array List vs Linked List

by 찬찬2 2022. 12. 1.

※ 데이터 스트럭쳐의 역할은 메모리의 효휼적 사용에 있다.

 

 

 

Array List
가장 기본적인 자료구조인 Array 자료구조는, 논리적 저장 순서와 물리적 저장 순서가 일치한다. 따라서 인덱스(index)로 해당 원소(element)에 접근할 수 있다. 그렇기 때문에 찾고자 하는 원소의 인덱스 값을 알고 있으면 Big-O(1)에 해당 원소로 접근할 수 있다. 즉 random access 가 가능하다는 장점이 있는 것이다.

하지만 삭제 또는 삽입의 과정에서는 해당 원소에 접근하여 작업을 완료한 뒤(O(1)), 또 한 가지의 작업을 추가적으로 해줘야 하기 때문에, 시간이 더 걸린다. 만약 배열의 원소 중 어느 원소를 삭제했다고 했을 때, 배열의 연속적인 특징이 깨지게 된다. 즉 빈 공간이 생기는 것이다. 따라서 삭제한 원소보다 큰 인덱스를 갖는 원소들을 shift해줘야 하는 비용(cost)이 발생하고 이 경우의 시간 복잡도는 O(n)가 된다. 그렇기 때문에 Array 자료구조에서 삭제 기능에 대한 time complexity 의 worst case 는 O(n)이 된다.
*참고링크

 

추가

 

① 삽입할 자료만큼 공간을 늘리는 작업을 한다.
② 삽입할 자료의 위치를 기준으로 기존의 데이터들을 뒤로 or 앞으로 이동하는 연산을 수행한다.
③ 삽입할 위치에 자료가 입력되면 삽입연산을 마친다.

삭제

 

① 삭제할 자료가 위치한 인덱스의 자료를 삭제한다.
② 삭제한 자료의 인덱스를 기준으로 이후의 자료들을 이동하는 연산을 한다
③ List의 맨 마지막은 비어있는 상태로 완료한다.

*참고링크

 



Linked List
이 부분에 대한 문제점을 해결하기 위한 자료구조가 linked list 이다. 각각의 원소들은 자기 자신 다음에 어떤 원소인지만을 기억하고 있다. 따라서 이 부분만 다른 값으로 바꿔주면 삭제와 삽입을 O(1) 만에 해결할 수 있는 것이다.

하지만 Linked List 역시 한 가지 문제가 있다. 원하는 위치에 삽입을 하고자 하면 원하는 위치를 Search 과정에 있어서 첫번째 원소부터 다 확인해봐야 한다는 것이다. Array 와는 달리 논리적 저장 순서와 물리적 저장 순서가 일치하지 않기 때문이다. 이것은 일단 삽입하고 정렬하는 것과 마찬가지이다. 이 과정 때문에, 어떠한 원소를 삭제 또는 추가하고자 했을 때, 그 원소를 찾기 위해서 O(n)의 시간이 추가적으로 발생하게 된다.

결국 linked list 자료구조는 search 에도 O(n)의 time complexity 를 갖고, 삽입, 삭제에 대해서도 O(n)의 time complexity 를 갖는다. Linked List 는 Tree 구조의 근간이 되는 자료구조이며, Tree 에서 사용되었을 때 그 유용성이 드러난다.

 

구조

 

 

Head : list의 제일 첫 번째 노드이다.

Node(vertext) : list를 구성하는 요소이다. 값과 자신의 다음 요소의 정보를 담고 있는 필드 두 개로 이루어져 있다.

 

 

 

※ Linked List의 경우 추가/삭제를 할때 위와 같은 복잡성을 가지고 있다. 

 


■ 차이점

 

 

 

** 자료구조 시각화

https://visualgo.net/en

 

** linked list 자바스크립트로 구현해보기 :

깃헙: https://github.com/blackstarzck/data_structure

https://chan-chan2.tistory.com/274

 

** 참고링크:

https://opentutorials.org/module/1335/8821

 

댓글