너무너무 멋져 눈이눈이 부셔

자료구조 -시간복잡도, 배열, 연결리스트 본문

천재적인 CS/자료구조

자료구조 -시간복잡도, 배열, 연결리스트

강하다이녀석 2023. 12. 20. 18:54

시간 복잡도

C++의 기본

  1. C++은 main함수를 중심으로 동작. main 반드시 있어야 함.
(1) : 헤더 파일. bits/stdc++.h는 모든 표준 라이브러리가 포함된 헤더.
(2): std라는 네임스페이스를 사용. ,cin이나 cout을 사용할때는 std::cin처럼 네임스페이오 함꼐 호출해야 하므로 이를 기본으로 설정한다는 뜻.
(3): 문자열 선언. <타입><변수명>
(4): 입력. cin,scanf등 있음.
(5): 출력. cout, printf등 있음.
(6) return 0 : main 함수가 0리턴하면서 프로세스 종료.

빅오 표기법

시간복잡도: 입력 크기에 대해 어떠한 알고리즘이 실행되는 데 걸리는 시간.

 

 

이건 입력 크기 n에 대해서 시간 복잡도 10n^2 + n  -> O(n^2)

공간 복잡도

프로그램 실행시켰을 떄 필요로 하는 자원 공간의 양. 정적 변수로 선언된 것 말고도 동적인 재귀적 함수로 인해 공간을 계속해서 필요로 할 경우도 포함.

int a[1004];

의 경우 a 배열은 1004 * 4byte의 크기를 가지게 된다.

 

자료 구조에서의 시간 복잡도

리스트보다 해시 테이블이 대체적으로 빠르다!

 

시간복잡도를 구하는 요령

하나의 루프를 사용하여 단일 요소 집합을 반복 하는 경우 : O (n)
컬렉션의 절반 이상 을 반복 하는 경우 : O (n / 2) -> O (n)
두 개의 다른 루프를 사용하여 두 개의 개별 콜렉션을 반복 할 경우 : O (n + m) -> O (n)
두 개의 중첩 루프를 사용하여 단일 컬렉션을 반복하는 경우 : O (n²)
두 개의 중첩 루프를 사용하여 두 개의 다른 콜렉션을 반복 할 경우 : O (n m) -> O (n²)
컬렉션 정렬을 사용하는 경우 : O(nlog(n))

https://velog.io/@crosstar1228/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%8B%9C%EA%B0%84%EB%B3%B5%EC%9E%A1%EB%8F%84Time-Complexity%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0

 

선형 자료 구조

요소가 일렬로 나열되어있는 자료 구조

연결 리스트

데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극대화시킨 자료구조.

삽입,삭제는 O(1) 탐색에는 O(n)

prev 포인터와 next 포인터로 앞과 뒤의 노드를 연결시킨것. 

  • head: 맨 앞의 노드
  • 마지막 노드를 tail
  • 싱글 연결 리스트 : next 포인터만
  • 이중 연결 리스트 : 둘 다.
  • 원형 이중 연결 리스트: 마지막 노드의 next가 헤드 노드를 가리킴.

push_front() : 앞에 요소 넣기

push_back(): 뒤에 요소 넣기

insert() : 중간에 요소 넣기

 

배열

같은 타입의 변수 + 정해진 크기 + 인접한 데이터 위치에 있는 데이터들의 집합.

중복 허용, 순서 O

 

  • C++에서 사이즈 구하기
int arr[] = { 1, 2, 3, 4, 5, 6, 7 }; 
int n = sizeof(arr) / sizeof(arr[0]); // 7

랜덤 접근(직접접근)과 순차적 접근

직접접근: 동일한 시간에 배열과 같은 순차적인 데이터가 있을 때 임의의 인덱스에 해당하는 데이터에 접근할 수 있는 기능.

순차적 접근: 순차적으로 검색

 

배열과 연결 리스트 비교

배열은 인덱스만 알면 요소를 끄집어 낼 수 있다.

연결리스트는 하나씩 상자를 확인해야 요소를 알 수 있다.

참조가 많이 일어난느 작업 -> 배열이 빠르다.

데이터 추가 및 삭제 -> 연결리스트가 더 빠르다.

왜? 배열은 모든 상자를 앞으로 옮겨야 추가가 가능, 연결리스트는 선만 바꾸면 됨.

 

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Data%20Structure/Array%20vs%20ArrayList%20vs%20LinkedList.md

 

 

 

보통 면접 문제는 각 자료 구조에 대한 설명(장단점), 비교, 시간 복잡도, 활용 예시 등이 있다.