입력 범위 n을 기준으로 해서 로직이 몇번 반복되는지를 나타내는 것
💡 잠깐) C++
#include <bits/stdc++.h> //1 using namespace std; // 2 String a; // 3 int main() { cin >> a; // 4 cout << a << "\n"; // 5 return 0; // 6 }
코드설명
- 헤더 파일로써, STL 라이브러리를 import한다. 이 중 bit/stdc++.h는 모든 라이브러리가 포함된 헤더
- std라는 네임스페이스를 사용한다는 뜻이다. cin이나 cout 등을 사용할 때 원래는 std::cin 처럼 네임스페이스를 달아서 호출해야 하는데, 이를 기본으로 설정한다는 뜻.(네임스페이스는 같은 르래스를 이름 구별, 모듈화에 쓰이는 이름)
- 문자열을 선언, string이라는 타입을 가진 a라는 변수를 정의하였다.
- 입력(cin, scanf)
- 출력(cout, printf)
- return 0
O(1)과 O(n)은 입력 크기가 커질수록 차이가 많이나는 것을 확인 가능.
-> O(n^2)보다는 O(n)을. O(n)보다는 O(1)을 지향해야 한다.
✏️ 자료 구조의 평균 시간 복잡도
✏️ 자료 구조 최악의 시간 복잡도
ex) a 배열에 1004 x 4바이트의 크기가 할당
int a[1004];
prev포인터와 next포인터로 앞과 뒤의 노드를 연결시킨 것이 연결 리스트이며, 연결리스트는 싱글 연결 리스트, 이중 연결 리스트, 원형 이중 연결 리스트가 존재
💡 배열과 연결리스트 비교
- 배열은 상자를 순서대로 나열한 데이터 구조이며 몇번째 상자인지 알면 해당 상자의 요소를 끄집어내기가 가능
- 연결 리스트는 상자를 선으로 연결한 형태의 데이터 구조이며 상자 안의 요소를 알기 위해서는 하나씩 상자 내부를 확인해야 한다.
추가와 삭제를 많이 하는 것은 연결리스트, 탐색을 많이 하는 것은 배열로 하는 것이 좋다
동적으로 요소를 할당할 수 있는 동적 배열
컴파일 시점에 개수를 모른다면 벡터를 사용
중복을 허용하고 순서가 있고 랜덤 접근이 가능
탐색과 맨 뒤의 요소를 삭제하거나 삽입하는데 O(1)이 소요
맨 뒤나 맨 앞이 아닌 요소를 삭제하고 삽입하는데 O(n)의 시간이 걸린다
뒤에서부터 삽입하는 push_back()의 경우 O(1)이 소요되는데, 벡터의 크기가 증가되는 시간 복잡도가 amortized 복잡도, 즉 상수 시간 복잡도 O(1)과 유사한 시간 복잡도를 가지기 때문.
push_back()을 한다고 해서 매번 크기가 증가하는 것이 아니라 2의 제곱승 +1마다 크기를 2배를 늘리는 것을 확인 가능
C를 i번째 push_back()을 할 때 드는 비용이라고 한다면, C(i)는 1 또는 1 + 2^k