가장 기본 자료구조인 Array부터 시작하겠습니다~~
인덱스로 해당 원소에 접근할 수 있는 자료구조
random access가 가능해 인덱스 값을 알고있으면 빠르게 원하는 값에 접근할 수 있음
👉 read 작업에 최적화된 구조
👉 시간복잡도 = O(1)
✅ Worst Case(정렬되지 않은 경우)
선형탐색
: 말그대로 선형! 일자로 하나씩 탐색
: 시간복잡도 = O(n)
이진탐색
: 전체 배열 길이를 절반씩 나눠서 탐색
: 시간복잡도 = O(n)
✅ Best Case(정렬된 array일 경우)
시간복잡도 = O(log(n))
Insert와 Delete의 과정에서는 순서가 있다는 특성이 부정적으로 작용
👉 순서 유지로 인한 shift가 cost를 발생시킴
✅ Worst Case(첫 번째 위치에 작업이 이루어질 경우)
모든 정렬을 다시 해야하기 때문에 시간이 가장 오래걸림
시간복잡도 = O(n)
✅ Best Case(배열의 마지막 위치에 작업이 이루어질 경우)
재정렬 필요가 없으므로 시간이 오래걸리지 않음
시간복잡도 = O(1)
이러한 시간복잡도 문제를 해결하기 위한 구조로 Linked List가 있습니다.
Linked List는 배열과 달리 메모리에 연속적으로 배치되지 않고, 각 노드가 임의의 메모리 위치에 할당됩니다. 그래서 중간 위치에 삽입 및 삭제 작업 시 O(1)의 시간 복잡도를 가집니다👍👍
그러나 특정 위치에 접근하려면 첫 번째 노드부터 순차적으로 탐색해야 하기 때문에 탐색 작업은 O(n)의 시간 복잡도를 갖습니다.
💡 자료구조를 선택할 때는 사용하는 연산의 종류와 빈도, 성능 요구 사항을 고려하여 적절한 자료구조를 선택하는 것이 중요합니다!!
🙋♀️: Linked List가 삽입과 삭제엔 효율적이지만 탐색에는 그렇지 않은 이유가 무엇인가요?
Array: 인덱스로 빠르게 값을 찾을 수 있음(READ에 최적화!)
LinkedList: 링크로 연결되어있어 주소값만 수정하면 됨(Insert, Delete에 최적화)
ArrayList: (Search에 최적화)
자세히>>
Array
이를 해결하기 위해!
Linked List
Array List