Study/자료구조
[자료구조] Array와 Linked List
dDong2
2023. 5. 6. 23:13
Array
- index로 element에 접근이 가능한 자료구조
- 일반적으로 논리적 저장 장소와 물리적 저장 장소가 같다.
- 찾고자하는 원소의 index를 알고 있으면 O(1)을 갖는다.
- 배열의 삭제 작업이 발생하면, 원소 접근 O(1)을 수행하고 빈 공간을 만든 다음 삭제한 원소보다 인덱스가 큰 원소들이 이동하는 비용이 발생하게 되어 O(n)을 수행하게 된다. ( worst case도 O(n) 수행 )
- 배열의 추가 작업도 모든 원소들의 인덱스를 이동하는 비용이 발생하여 O(n)을 수행한다.
- 일반적인 의미의 배열은 메모리 영역을 연속적으로 사용한다.
- 이러한 배열은 밀집 배열(dense array)이라고 한다.
- 하지만, 자바스크립트의 배열은 배열 요소를 위한 각각의 메모리 공간이 동일한 크기를 갖지 않아도 되며, 연속적으로 이어져 있지 않아도 된다.
- 이렇게 배열의 요소가 연속적으로 이어져 있지 않은 배열을 희소 배열(sparse array)이라고 한다.
- 이런 이유로 갖는 장단점은 다음과 같다.
- 인덱스로 배열 요소에 접근하는 경우, 일반적인 배열보다 성능적인 면에서 느릴 수 밖에 없는 구조적인 단점을 갖는다.
- 특정 요소를 탐색하거나 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있다.
Javascript Array
- 자바스크립트에서 배열은 *참조 자료형 타입이다.
- 자바스크립트는 원시 자료형과 참조 자료형 타입으로 구분된다.
- 원시 자료형(Primitive data type)은 string, number, boolean, undefined, null, symbol 이 있다.
- 참조 자료형(Reference data type)은 Array, Object, function(){} 이 이있다.
- 자바스크립트의 배열은 일반적인 배열의 동작을 흉내낸 해시 테이블로 구현된 객체이다.
- 배열 기초 메소드
- isArray() : 인자 속 변수, 데이터, 값이 배열이면 true/false
- indexOf(el) : el의 인덱스 번호를 찾아 반환, 못 찾으면 -1 반환
- includes(el) : el 데이터가 들어있으면 true/false (대소문자 구분)
- length() : 배열 길이를 반환
- slice(begin, end) : 인자만큼 잘라서 반환
- unshift() : 배열의 맨 앞에 element 추가
- shift() : 배열의 맨 앞에 index 삭제
- push() : 배열의 맨 뒤에 element 추가
- pop() : 배열의 맨 뒤에 index 삭제
- split() : 문자열을 해당 인자를 기준으로 구분하여 반환
- join() : 문자열을 해당 인자를 기준으로 합쳐서 반환
- 삽입과 삭제 예시
- slice 같은 경우는 메소드를 사용한 상태와 사용하고 난 상태가 다르지 않아 immutable하다.
- push, pop, shift, unshift는 상태가 서로 다르기 때문에 mutable하다.
- 그 외 내장 메소드 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array
Element Search
- 배열 원소 검색에는 선형 검색과 이진 검색으로 나뉜다.
- 선형 검색 (Linear Search)
- 첫 번째 요소부터 차례대로 찾으려는 원소가 있는지 검색한다.
- 모든 요소를 확인하므로 정렬되지 않은 배열에서도 사용가능하다.
- O(n)의 시간복잡도를 가진다.
- 이진 검색 (Binary Search)
- 분할 정복 알고리즘에 따라 중간에 있는 요소부터 비교한다.
- 배열을 분할하면서 찾으려는 원소가 있는지 검색한다.
- 반드시 정렬된 배열이어야 한다.
- O(logn)의 시간복잡도를 가진다.
Linked List
Linked List 개념
- 각 요소를 포인터로 연결하여 관리하는 선형 자료구조이다.
- 각 원소들은 자기 자신 다음에 어떤 원소인지만을 기억하고 있다.
- 이 부분만 다른 값으로 교체하면 삭제와 삽입을 O(1)로 수행할 수 있다.
- 하지만, 원하는 위치에 원소를 삽입하고자 하면 Search 과정에서부터 첫 번째 원소부터 모두 확인해야한다는 단점이 존재한다.
- 배열과 달리 논리적 저장 순서와 물리적 저장 순서가 일치하지 않기 때문이다.
- 이러한 과정 때문에 어떠한 원소의 삽입과 삭제를 위한 검색에 O(n)을 수행하게 된다.
- Linked List는 Tree의 근간이 되는 자료구조가 된다.
- 각 요소를 포인터로 연결하여 관리하는 선형구조로, 각 요소는 노드로 불리우고 [ 데이터 | 포인터 ] 영역으로 구성된다.
- 한 쪽 방향으로 포인터가 존재하면 단일 연결 리스트, 양쪽 방향은 이중 연결 리스트라고 한다.
- 메모리가 허용하는 한 요소를 제한없이 추가할 수 있다.
노션에 정리한 내용을 공유합니다 : )