복잡도와 LinkedList
2020년 07월 29일, 21:40
-
복잡도
-
O
-
빅-오
라고 읽는다. -
점근적 상한에 대한 표기법.
-
O(g(n))은 g(n)의 증가율보다 작거나 같은 함수들의 집합이다.
예를 들어 O(n2)에는 O(1),O(n),O(nlogn) 등이 포함된다.
주어진 알고리즘의 증가율보다 크거나 같은 최소의 증가율을 찾는 것이 목적.
-
-
Ω
빅-오메가
라고 읽는다.- 점근적 하한에 대한 표기법.
- 주어진 알고리즘의 증가율보다 작거나 같은 최대의 증가율을 찾는 것이 목적.
-
Θ
빅-세타
라고 읽는다.- 이 표기법은 주어진 함수(알고리즘)의 상한과 하한이 같은지 아닌지를 결정한다.
- 세타(Θ) 표기법은 항상 상한(O)과 하한(Ω) 사이에 존재한다.
- 상한과 하한이 같다면, 세타 표기법도 같은 증가율을 갖는다.
-
빅오가 최고 오래걸리는 상태라고 보면되고, 오메가는 적게 걸릴 때, 세타는 그 둘이 같을 때라고 보면 될 것 같다.
-
시간 복잡도 & 공간 복잡도
- 시간 복잡도는 몇 번 실행하냐?
- 공간 복잡도는 얼마만큼의 공간을 사용해야하나?
- 고정공간 + 가변 공간으로 이루어져 있는데, 가변 공간을 얼만큼 사용하냐에 따라 복잡도가 나뉨.
-
-
연속 배열과 링크드 리스트의 차이점.
배열과 링크드 리스트의 가장 큰 차이는 삽입과 삭제를 할 때 이루어지는 것 같다.
어느 특정 위치에 삽입하는 경우 배열은 삽입 후 뒤의 배열을 붙이는 식으로 계산을 해야해서 오래걸리는 것 같고, 지우는 것도 해당 인덱스의 값이 없어지면 뒤에 있는 배열을 모두 땡겨줘야하기 때문에 오래걸린다.
하지만, 링크드 리스트의 경우 삽입 , 삭제 후 앞 뒤의 데이터의 이동 없이 연결만 시켜주면 되기 때문에 시간이 더 적게 걸린다.
데이터가 맨 끝에 삽입되고 삭제되는 경우가 아니라면, 보통의 경우 링크드 리스트가 훨씬 빠를 것 같다.
-
링크드 리스트에 추가할 때 걸리는 시간 복잡도는 방법에 따라 차이가 있다.
-
맨 마지막에 추가하는 경우.
tail 변수를 둬서 맨 마지막에 있는 node만 알고있다면 O(1)밖에 걸리지 않는다.
-
중간에 추가하는 경우.
head부터 모두 살펴봐야하기 때문에 O(N)만큼 걸린다.
-
맨 앞에 추가하는 경우
head에 추가하고 연결해주기 때문에 O(1)만큼 걸린다.
-
-
링크드 리스트에서의 탐색과 삭제.
특별히 탐색과 삭제는 탐색 후 삭제해야하기 때문에 O(N)만큼 걸리는 것 같다.
하지만 추가의 경우와 같이 head,tail이 존재한다면 맨 앞과 맨 뒤의 삭제시간은 O(1)이다.