<aside> 👉 자료 구조는 데이터를 상황에 맞게 저장하기 위한 구조이고, 알고리즘은 자료구조에 있는 데이터를 활용해 어떠한 문제를 해결하기 위한 여러 방법이라고 할 수 있습니다.
자료구조와 알고리즘을 이용하면 더 효율적으로 데이터를 관리할 수 있고 이에 따라 서버에 부하를 줄일 수 있습니다.
</aside>
<aside> 🤔 취지 백엔드는 소프트웨어 개발 프로세스에서 서버를 개발하는 사람입니다. 자료구조와 알고리즘을 이용하면 효율적으로 데이터를 관리할 수 있고, 이에 따라 서버의 부하를 줄일 수 있습니다.
</aside>
CRUD에서 어떤 API요청이 많은지에 따라서 데이터 자료구조 고려
<aside> 👉 시간 복잡도는 어떤 특정 알고리즘이 입력값의 크기에 대해서 동작 시간이 어떻게 비례하는지에 대한 척도입니다. 공간 복잡도는 알고리즘에서 사용하는 사용량을 분석하는 것입니다.
보통 빅오 표기법을 이용해서 표기를 하고, 계수 및 낮은 차수를 제거하는 특징이 있습니다. 예를 들어, 입력값의 크기가 N인데, N^2에 비례하는 시간 복잡도를 가지게 된다면, O(N^2)이 됩니다.
</aside>
<aside> 🤔 취지
한 번에 많은 양의 데이터를 가지고 가거나 혹은 특정 작업을 반복적으로 수행하는 그런 시간적인 요소가 많이 소요되는 기능의 경우 시간 복잡도를 줄임으로써 서버의 부하를 줄일 수 있기 때문에.
공간 복잡도를 고려하여 알고리즘을 설계하고 구현하면 메모리 효율성을 향상시키고 시스템의 안정성을 유지하는데 도움이 되기 때문
</aside>
<aside>
👉 버블 정렬: 인접해 있는 요소 간 대소 비교를 통해 정렬됩니다. 정렬 알고리즘 중 가장 단순한 알고리즘이지만 단순한 만큼 비효율적입니다. 최대 $O(n^2)$의 시간복잡도를 가집니다.
삽입 정렬: 정렬을 진행할 원소의 index보다 낮은 곳에 있는 원소들을 탐색하며 알맞은 위치에 삽입해주는 정렬 알고리즘입니다. 최대 의 시간복잡도를 가집니다.
선택 정렬: 배열에서 최소값을 반복적으로 찾아 정렬하는 알고리즘입니다. 최대 O(n^2)의 시간복잡도를 가집니다.
퀵 정렬: 리스트 안에 있는 한 요소를 선택합니다. 이를 피봇(pivot)이라고 합니다. 피벗을 기준으로 피벗보다 작은 요소들은 피벗의 왼쪽으로, 피벗보다 큰 요소들은 피벗의 오른쪽으로 옮겨집니다. 피벗의 왼쪽 리스트, 오른쪽 리스트 각각에 대해 이를 반복하다가 부분 리스트들이 더 이상 분할이 불가능할 때까지 반복합니다. 평균 $O(nlogn)$의 시간복잡도를 가지며, 최악일시 $O(n^2)$의 시간복잡도를 가집니다.
</aside>
→ Arrays.sort()에서 쓰이는 정렬
<aside> 🤔 취지
백엔드는 데이터를 저장하고 가공해서 사용자에게 보여주는데, 사용자가 받아들일 수 있는 데이터의 양은 정해져 있으므로 수많은 데이터 중에서 사용자가 원하는 데이터를 효율적으로 보여주려면 정렬이 필수적이다. 정보를 다루는 소프트웨어에서 정렬은 자주 실행되는 가장 기본적인 작업이다.
</aside>