[자료구조]리스트(List)와 배열(Array)
리스트
데이터를 일직선으로 줄줄이 정렬한 데이터 구조.
데이터의 추가나 삭제는 쉬운 반면, 원하는 데이터에 접근(검색)하는 시간은 오래걸린다.
Data1 - (포인터) → Data2 - (포인터) → Data3
- 위와 같이 포인터가 다음 데이터의 주소를 가리키는 형식으로 되어있기 때문에 메모리상에 각 데이터가 연속적으로 배치 될 필요가 없다. 그렇기 때문에 예를들어 Data3에 접근하기 위해서는 반드시 Data1 → Data2 를 거치는 형식으로 순차접근이 필요하다.
- 새로운 데이터를 추가하는 경우, Data1 → Data2 → Data3 중 예를들어 Data1과 Data2 사이에 new Data를 추가하고 싶다면 Data1 - (포인터) → Data2 의 포인터가 new Data를 가리키도록 포인터의 주소만 변경해주고, new Data의 다음 포인터의 주소를 Data2를 가리키도록 변형해주면 된다.
✅ 저장되어 있는 데이터의 개수가 n개라면 데이터는 접근할 때 순차접근(선형 탐색)을 사용하므로, 계산시간은 O(n)
이 소요된다. 반면 저장과 삭제의 경우 해당하는 데이터의 포인터만 변경하면 되므로, 전체 데이터개수 n개의 영향을 받지 않아 상수 시간 O(1)
이 소요된다.
배열
데이터를 한 열로 연속해서 정렬하는 데이터 구조.
리스트와 반대로 데이터의 접근(검색)은 편리하지만, 추가,삭제의 경우 시간이 오래걸린다.
데이터는 메모리의 연속된 영역에 순차적으로 저장 되며, 각 데이터는 Index를 갖는다.
- 연속적으로 저장되어있기 때문에 메모리상의 위치는 인덱스를 바탕으로 계산할 수 있고, 각 데이터에 직접 접근 할 수 있다.
✅ 저장되어 있는 데이터의 개수가 n개라면, 데이터에 접근할 때는 전체 데이터 개수와 상관없이 해당 데이터의 인덱스로만 직접 접근이 가능하기 때문에 계산에 상수 시간 O(1)
이 소요된다. 반면 데이터를 추가,삭제 하는 경우 모든 데이터를 하나씩 뒤로 옮기며 공간을 추가로 확보는 연산이 발생하기 때문에 O(n)
의 시간이 소요된다.
배열 탐색
1. 선형 탐색
- 데이터가 순서없이 뒤죽박죽으로 나열된 경우에도 적용할 수 있다.
- 단순히 배열의 앞쪽부터 순서대로 데이터를 조사하는 방식을 사용한다.
- 선형 탐색은 데이터의 처음부터 순서대로 비교를 반복한다.
따라서 데이터가 많고 찾는 데이터가 배열의 끝에 있거나 없는 경우 비교 횟수가 많아져서 시간이 오래걸린다. →
O(n)
2. 이진 탐색
- 데이터가 정렬 된 경우에만 사용할 수 있다.
- 찾으려는 데이터와 배열의 정중앙 데이터를 비교하여 중앙을 기준으로 값이 왼쪽에 있는지 오른쪽에 있는지 판별하여 검색의 범위를 절반으로 줄여나가는 방식
- 데이터를 찾거나 데이터가 없다는 것이 확실해 질 때 까지 이 방법을 반복한다.
- n개 있던 데이터를 절반씩 줄이는 조작을 log2N번 반복하면 데이터는 1개가 된다.
따라서 연산시간은 →O(logN)
Leave a comment